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

leo*_*hab 7 c java java-native-interface struct pointers

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

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

从Java,我称之为JNI函数初始化结构,并返回一个长(指针结构):

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

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

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

好吧它不起作用.我想我对结构中的长镜头是错误的.我该怎么办?谢谢.


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

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;
}
Run Code Online (Sandbox Code Playgroud)

djn*_*jna 5

在你的例子中

struct myStruct_s mystruct;
Run Code Online (Sandbox Code Playgroud)

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

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