將對JNI方法中創建的對象的引用返回給Java時,是否應該在創建的對象上返回NewGlobalRef調用的結果?而且,分別在稍後,當Java中不再需要對象時,我們是否需要調用JNI方法對從Java傳入的引用執行DeleteGlobalRef?當返回在JNI中創建的對象時,NewGlobalRef/DeleteGlobalRef
或者NewGlobalRef/DeleteGlobalRef只需要在JNI內部保存對Java對象的引用,在JNI方法調用之間,並且如果我們簡單地將創建的對象返回給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中更需要的,有一個叫到不調用DeleteGlobalRef的JNI方法,而只是在本機緩衝區地址上調用free()。
http://developer.android.com/training/articles/perf-jni.html – fadden