【发布时间】: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