如果 jobject 从 JNI 返回到 JAVA,我应该 DeleteGlobalRef 吗?
should I DeleteGlobalRef if the jobject is returning from JNI to JAVA?
我想在 JNI 中存储一个 java 对象。所以我
jobject gRefObj = (*env)->NewGlobalRef(env, obj);
之后我想从其他线程和从 java 调用 jni 到 return 对象取回 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;
}
我想在 JNI 中存储一个 java 对象。所以我
jobject gRefObj = (*env)->NewGlobalRef(env, obj);
之后我想从其他线程和从 java 调用 jni 到 return 对象取回 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;
}