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

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

然后我用那个 long in 参数调用一个 Java 方法。在 JNI 中,我希望能够使用之前创建的结构。我喜欢这样:

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

好吧,这行不通。我想我对结构的 long 转换是错误的。我应该怎么做? 谢谢。


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

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)) 为自己分配堆。

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

关于java - 使用 long 将指针从 JNI 传递到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5802340/

相关文章:

java.io.StreamCorruptedException : invalid type code: 3F when I customize serialization process

java - 如果我更改 struts.xml 路径,struts2-convention 和 struts2-config-browser-plugin 将无法工作

c - 在 C 中声明可变大小的数组

c++ - C 位标志枚举应如何转换为 C++?

c - 复制部分初始化的结构在 C 中定义良好吗?

c - 标准中关于指针比较的奇怪措辞

c - argv 中指向字符串的指针是否可修改?

java - Java 中的对象类型和引用数组

Java 的 URL 正则表达式

c++ - 为什么使用 __stdcall 作为函数指针