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

时间:2011-04-27 10:01:49

标签: java c pointers struct java-native-interface

我正在尝试将结构作为指针从JNI传递到Java,以便稍后可以将其从Java传递回JNI。我读过这个帖子:Passing pointers between C and Java through JNI,但我没有成功。

我的结构非常复杂: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;
    ...
}

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


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

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

3 个答案:

答案 0 :(得分:5)

在你的例子中

struct myStruct_s mystruct;

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

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

答案 1 :(得分:3)

这个结构的内存在返回方法后被销毁,因为它被放入堆栈,而不是放入堆中,试试看:

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

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

答案 2 :(得分:1)

除了@ Moise的建议,我还会将指针投向long而不是long *

long lp = (long)&myStruct;