Passing a pointer from JNI to Java using a long
Solution 1
In your example
struct myStruct_s mystruct;
is a local variable on the stack, and therefore not available after the function returns. Possubly that's just a cut-down of your code, but if not then use a malloc(sizeof(struct myStruct_s)) to get yourself a heap allocation.
That then raises the question of when you are going to free that allocation, watch out for memory leaks.
Solution 2
The memory of this structure is destroyed after the method is returned because it was put into the stack, not into the heap, try it:
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
long *lp = (long*)malloc(sizeof(struct myStruct_s));
return lp;
}
Ps: why long* and not simple long?
Solution 3
In additiona to @Moise's suggestion I would cast the pointer to a long
ratehr than a long *
long lp = (long)&myStruct;
leochab
Updated on June 17, 2022Comments
-
leochab almost 2 years
I'm trying to pass a structure as a pointer from JNI to Java to be able to pass it back later from Java to JNI. I have read this thread: Passing pointers between C and Java through JNI, but I did not succeed.
I have a pretty complex structure :
struct myStruct_s myStruct;
From Java, I call a JNI function to initialize the structure and to return a long (pointer to the structure):
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { struct myStruct_s mystruct; long *lp = (long*)&myStruct; return lp; }
Then I call a Java method with that long in argument. In JNI I want to be able to use the strcuture created earlier. I do like this:
JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) { struct myStruct_s *arg = (struct myStruct_s *)&jarg; ... }
Well it doesn't work. I guess my cast of the long into the struct is wrong. How should I do it? Thank you.
EDIT : Thanks for the hints, here are the working functions
JNIEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) { struct myStruct_s *arg; arg = (struct myStruct_s *)jarg; ... } JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { struct myStruct_s *myStruct; myStruct = (struct myStruct_s *)malloc(sizeof(struct myStruct_s)); long lp = (long)myStruct; return lp; }
-
NeoNacho about 11 yearsBeware that
jlong
is not necessarily equal tolong
depending on the target platform. If you are running this on a platform where it is in fact along long
, this will fail, so you should always cast tojlong
explicitly. -
CoDe over 8 yearsleochab but how you will get access of strct object at Java layer. How to access local variable defined inside struct. Also is this possible to do same with some c++ class object. I''m following similar here.
-