提问者:小点点

JNI本地参考空闲时间


根据官方文件显示:

本地引用在本机方法调用期间有效,并在本机方法返回后自动释放

我们有一个本机框架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方法中,本地引用的生命周期是什么


共1个答案

匿名用户

由于cppmethod是本机方法,您需要自己处理本地引用。
从技术上讲,本地引用将绑定到jnienv,而旧版本的jvm在删除它们的env时确实释放了所有引用。
但我不知道在什么地方指定了此行为。

关于你的问题:

  1. 您创建的所有本地引用都将绑定到您创建的jnienv
  2. 如果不释放本地引用,它们将永远有效。

因此,通常最好总是处理本地引用,尽管在JNI调用中不需要它。
您可以使用pushlocalframe/poplocalframe周围的raii包装器来简化这种处理