2011-04-27 38 views
7

我试图将结构作为指针从JNI传递给Java,以便能够稍后将它从Java传回给JNI。我已阅读此主题:Passing pointers between C and Java through JNI,但我没有成功。将指针从JNI传递到Java使用long

我有一个相当复杂的结构: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; 
} 

然后我打电话一个具有那么长参数的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; 
} 
+1

请注意,根据目标平台,“jlong​​”不一定等于“long”。如果你在一个实际上是“长久”的平台上运行它,这将会失败,所以你应该总是明确地使用“jlong​​”。 – NeoNacho 2013-04-25 13:50:51

+0

leochab,但你将如何访问在Java层的strct对象。如何访问struct中定义的局部变量。也有可能做一些C++类对象。我跟随类似[这里](http://stackoverflow.com/q/32840427/2624806)。 – CoDe 2015-09-29 09:46:08

回答

5

在您的例子

struct myStruct_s mystruct; 

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

然后提出了你什么时候释放该分配的问题,注意内存泄漏。

1

在additiona到@莫伊兹的建议,我将指针转换为long ratehr比long *

long lp = (long)&myStruct; 
3

这种结构的记忆被破坏,返回后的方法,因为它被放入堆栈,而不是到堆中,试试吧:

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

PS:为什么 *,而不是简单的