java - 如果 jobobject 从 JNI 返回到 JAVA,我应该删除 GlobalRef 吗?

标签 java c++ c java-native-interface

我想在 JNI 中存储一个 java 对象。所以我愿意

jobject gRefObj = (*env)->NewGlobalRef(env, obj);

之后,我想从其他线程以及从 java 调用 jni 取回 jobject 以返回对象。我也是这么做的。

(*_env)->DeleteGlobalRef(_env, gRefObj ); // if remove this line, it will work
return gRefObj; // From jni return to java

然后我得到了 classCastException,但是如果我删除 DeleteGlobalRef,它就可以正常工作。 java使用完后会删除吗?

最佳答案

根据@mkaes和@Michael的评论,我尝试这样做

JNIEXPORT jobject JNICALL Java_com_sample_getMyObject(JNIEnv *env, jobject obj) {
    jclass clz = (*env)->GetObjectClass(env, obj);
    // .. doing something
    jobject lRefObj = (*env)->NewLocalRef(env, gRefObj);

    (*env)->DeleteGlobalRef(env, gRefObj);  
    (*env)->DeleteLocalRef(env, clz);
    return lRefObj;
}

关于java - 如果 jobobject 从 JNI 返回到 JAVA,我应该删除 GlobalRef 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52333841/

相关文章:

c++ - 如何避免在 QMainWindow 中与过多的 dockwidgets 丑陋重叠?

c++ - 如何修复此 `FunctionPass` 使其不会进入无限循环?

c - 声明与?在 C

c - 让我知道以下有关 USB 调制解调器插件和插件通知处理程序 API 或 Linux 中的系统调用的信息

java - 使用 IText 将 PDF 中的页眉从一页复制到另一页

java - 从 ActionListener 方法访问类变量

java - 在一个根应用程序中显示不同的 Web 应用程序

C++ Poco MySQL 数据包装器段错误

c - x86 gcc 程序集输出帮助请

Java、MongoDB - 使用 REST 的嵌入式文档