【问题标题】:Passing a pointer from JNI to Java using a long使用 long 将指针从 JNI 传递到 Java
【发布时间】:2011-04-27 10:01:49
【问题描述】:

我正在尝试将结构作为指针从 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 中,我希望能够使用之前创建的结构。我喜欢这样:

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

【问题讨论】:

  • 注意jlong不一定等于long,具体取决于目标平台。如果您在实际上是 long long 的平台上运行它,这将失败,因此您应该始终明确地转换为 jlong
  • leochab 但是你将如何在 Java 层访问 strct 对象。如何访问结构内部定义的局部变量。这也可以对一些 c++ 类对象做同样的事情。我正在关注类似的here

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


【解决方案1】:

在你的例子中

struct myStruct_s mystruct;

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      long lp = (long)&myStruct;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        • 1970-01-01
        • 1970-01-01
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        相关资源
        最近更新 更多