【问题标题】:should I DeleteGlobalRef if the jobject is returning from JNI to JAVA?如果作业从 JNI 返回到 JAVA,我应该 DeleteGlobalRef 吗?
【发布时间】:2019-02-19 09:03:17
【问题描述】:

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

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

之后,我想从其他线程和从 java 调用中取回 jni 以返回对象。所以我愿意。

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

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

【问题讨论】:

  • 为什么要标记 java、c++ 和 C?
  • 老兄,是jni和java,里面有c
  • 从技术上讲,您的全局对象可能会被DeleteGlobalRef 破坏。如果您首先使用NewLocalRef 创建一个本地引用并传入您的全局引用,然后在返回本地引用之前在您的全局引用上调用DeleteGlobalRef,它是否有效?
  • @mkaes,我还没试过,但我还是需要 deleteLocalRef 对吧?
  • @Oktaheta: 否。“本地引用在本地方法调用期间有效。本地方法返回 [to Java] 后它们会自动释放”。但是,如果您返回到 Java(即您在纯本机线程上),那么您需要自己删除在该线程上创建的任何本地引用。

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


【解决方案1】:

根据@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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2015-11-10
    • 2018-11-27
    • 2018-03-04
    • 2023-03-06
    相关资源
    最近更新 更多