根据官方文件显示:
本地引用在本机方法调用期间有效,并在本机方法返回后自动释放
我们有一个本机框架a.so
然后我们把它装上。
static JavaVM * g_cachedJVM;
CJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void * /*reserved*/) {
g_cachedJVM = jvm;
return JNI_VERSION_1_6;
}
然后调用a.
实现的本机方法,我们在该方法中启动一个C++计时器。
CJNIEXPORT jobject JNICALL Java_A_Custom_Method(JNIEnv* jniEnv, jobject /*this*/) {
startTimerInCurrentTheadWithoutBlockCurrentThread(Seconds(1),[](){
//invoke method every 1 second
cppMethod();
});
}
void cppMethod() {
//Create some jni local reference use g_cachedJVM
// what is the life cycle of the local reference?
}
问题:在cpp方法中,本地引用的生命周期是什么
由于cppmethod
是本机方法,您需要自己处理本地引用。
从技术上讲,本地引用将绑定到jnienv
,而旧版本的jvm在删除它们的env
时确实释放了所有引用。
但我不知道在什么地方指定了此行为。
关于你的问题:
jnienv
因此,通常最好总是处理本地引用,尽管在JNI调用中不需要它。
您可以使用pushlocalframe/poplocalframe
周围的raii
包装器来简化这种处理