Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用长字符串将指针从JNI传递到Java_Java_C_Pointers_Struct_Java Native Interface - Fatal编程技术网

使用长字符串将指针从JNI传递到Java

使用长字符串将指针从JNI传递到Java,java,c,pointers,struct,java-native-interface,Java,C,Pointers,Struct,Java Native Interface,我试图将一个结构作为指针从JNI传递到Java,以便以后能够将它从Java传递回JNI。我读过这篇文章,但没有成功 我有一个相当复杂的结构:struct myStruct\u myStruct 在Java中,我调用一个JNI函数来初始化结构并返回一个长(指向结构的指针): 然后我调用了一个具有这么长参数的Java方法。在JNI中,我希望能够使用前面创建的结构。我喜欢这样: JNIEEXPORT jint JNICALL Java_example_ExampleJNI_methode1(JNIEn

我试图将一个结构作为指针从JNI传递到Java,以便以后能够将它从Java传递回JNI。我读过这篇文章,但没有成功

我有一个相当复杂的结构:
struct myStruct\u myStruct

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

然后我调用了一个具有这么长参数的Java方法。在JNI中,我希望能够使用前面创建的结构。我喜欢这样:

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;
}
在你的例子中

struct myStruct_s mystruct;
是堆栈上的局部变量,因此在函数返回后不可用。很可能这只是代码的缩减,但如果不是这样,则使用malloc(sizeof(struct myStruct_s))为自己分配堆


这就引出了一个问题,即何时释放该分配,请注意内存泄漏。

除了@Moise的建议之外,我会将指针指向一个
long
ratehr而不是
long*

long lp = (long)&myStruct;

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

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

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

注意,
jlong
不一定等于
long
,具体取决于目标平台。如果您在一个平台上运行它,而实际上它是一个
long
,那么这将失败,因此您应该始终显式地强制转换到
jlong
。leochab,但如何在Java层访问strct对象。如何访问结构中定义的局部变量。也可以与某些C++类对象做同样的事情。我也在关注类似的事情。
JNIEXPORT jlong JNICALL Java_example_ExampleJNI_getStruct(JNIEnv *jenv, jclass jcls) {
    long *lp = (long*)malloc(sizeof(struct myStruct_s));
    return lp;
}