使用long将指针从JNI传递到Java

我正在尝试将结构作为指针从JNI传递给Java,以便稍后可以将其从Java传递回JNI。 我已经读过这个post: 通过JNI传递C和Java之间的指针 ,但是我没有成功。

我有一个非常复杂的结构: struct myStruct_s myStruct;

从Java,我调用一个JNI函数来初始化结构并返回一个long(指向结构的指针):

 JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { struct myStruct_s mystruct; long *lp = (long*)&myStruct; return lp; } 

然后我用一个长的参数调用一个Java方法。 在JNI中,我希望能够使用之前创建的strcuture。 我喜欢这个:

 JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEnv *jenv, jclass jcls, jlong jarg) { struct myStruct_s *arg = (struct myStruct_s *)&jarg; ... } 

好吧它不起作用。 我想我对结构的长期投射是错误的。 我该怎么办? 谢谢。


编辑 :感谢您的提示,这里是工作function

 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; } 

在你的例子中

 struct myStruct_s mystruct; 

是堆栈上的局部变量,因此在函数返回后不可用。 Possubly这只是你的代码的减少,但如果没有,那么使用malloc(sizeof(struct myStruct_s))来获得堆分配。

然后提出了一个问题,即何时要释放分配,注意内存泄漏。

返回该方法后,此结构的内存将被销毁,因为它被放入堆栈,而不是放入堆中,请尝试:

 JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) { long *lp = (long*)malloc(sizeof(struct myStruct_s)); return lp; } 

Ps:为什么 *而不是简单多

除了@ Moise的建议,我还会把指针指向一个long速度而不是long *

 long lp = (long)&myStruct;