【发布时间】:2015-04-27 09:07:48
【问题描述】:
在将JNI方法中创建的对象的引用返回给Java时,我们应该返回对创建的对象的NewGlobalRef调用的结果吗?并且,分别以后,当Java中不再需要对象时,我们是否需要调用JNI方法对Java传递的引用进行DeleteGlobalRef?
或者 NewGlobalRef/DeleteGlobalRef 只需要在 JNI 中,在 JNI 方法调用之间保存对 Java 对象的引用,如果我们只是将创建的对象返回给 Java,我们不需要调用 NewGlobalRef/DeleteGlobalRef?
我在一个大型开源项目中见过这样的事情:
extern "C" JNIEXPORT jobject JNICALL
Java_foo_bar_Baz_create(JNIEnv* env, jclass, jint size) {
void* buf = malloc(size);
jobject obj = env->NewDirectByteBuffer(buf, size);
return env->NewGlobalRef(obj);
}
extern "C" JNIEXPORT void JNICALL
Java_foo_bar_Baz_free(JNIEnv* env, jclass, jobject jbuffer) {
void* buf = env->GetDirectBufferAddress(jbuffer);
free(buf);
}
它在创建的NewDirectByteBuffer对象上返回NewGlobalRef调用的结果,然后,当Java中不再需要对象时,调用JNI方法,它不调用DeleteGlobalRef,而只是在本机缓冲区地址上调用free()。
【问题讨论】:
标签: java android-ndk java-native-interface