如果jobject从JNI返回JAVA,是否应该删除GlobalRef?

如果jobject从JNI返回JAVA,是否应该删除GlobalRef?,java,c++,c,java-native-interface,Java,C++,C,Java Native Interface,我想在JNI中存储一个java对象。我也是 jobject gRefObj = (*env)->NewGlobalRef(env, obj); 之后,我想从另一个线程和对jni的java调用中获取jobject以返回对象。我也是 (*_env)->DeleteGlobalRef(_env, gRefObj ); // if remove this line, it will work return gRefObj; // From jni return to java 然后我得到

我想在JNI中存储一个java对象。我也是

jobject gRefObj = (*env)->NewGlobalRef(env, obj);
之后,我想从另一个线程和对jni的java调用中获取jobject以返回对象。我也是

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

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

基于@mkaes和@Michael comment,我已经尝试过了

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、C++和C?dUD,它是JNI和java,它包含了CyTracle,你的全局对象可以被代码> DeleGeLoBaleRf 破坏。如果先创建一个本地ref,并传入全局ref,然后在返回本地ref之前调用全局ref上的
DeleteGlobalRef
,是否有效?@mkaes,我还没有尝试,但我仍然需要删除localref,对吗?@Oktaheta:No。“本地引用在本机方法调用期间有效。它们在本机方法返回[到Java]后自动释放。但是,如果您没有返回到Java(即,您在纯本机线程上),那么您需要自己删除在该线程上创建的任何本地引用。