Pla*_*ity 5 java java-native-interface android-ndk
当将对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);
}
Run Code Online (Sandbox Code Playgroud)
它在创建的NewDirectByteBuffer对象上返回NewGlobalRef调用的结果,稍后,当Java中不再需要对象时,调用JNI方法不调用DeleteGlobalRef,而只调用本机缓冲区地址上的free().
use*_*421 10
当将对
New[Type]Array,JNI方法创建的对象或其他对象返回给Java时,是否应该NewGlobalRef在创建的对象上返回调用结果?
仅当您还希望保留该引用以便在将来的JNI调用中使用而不再将其作为JNI方法参数接收时.
而且,后来,当Java中不再需要对象时,我们是否需要调用JNI方法来
DeleteGlobalRef对从Java传递的引用做什么?
只有你打电话NewGlobalRef()给它.
或者
NewGlobalRef/DeleteGlobalRef只需要在JNI内部,JNI方法调用之间保存对Java对象的引用
完全正确.
如果我们只是将创建的对象返回给Java,我们不需要进行
NewGlobalRef/DeleteGlobalRef调用?
再次纠正.
我在大型开源项目中看到了返回
NewGlobalRef创建NewDirectByteBuffer对象的结果(通过实际缓冲区分配malloc()).后来,当Java中不再需要对象时,有一个对JNI方法的调用,它不会DeleteGlobalRef,只调用free()从中获取的本机缓冲区地址GetDirectBufferAddress.
这将构成DirectByteBuffer对象的泄漏,而不是其本机缓冲区.
| 归档时间: |
|
| 查看次数: |
6235 次 |
| 最近记录: |