【问题标题】:JNI Local Reference Free TimeJNI 本地参考空闲时间
【发布时间】:2020-07-20 11:25:18
【问题描述】:

根据官方文档说:

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

想象一个案例,我们有一个原生框架a.so

然后我们加载它。

static JavaVM * g_cachedJVM;

CJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM * jvm, void * /*reserved*/) {

    g_cachedJVM = jvm;
    return JNI_VERSION_1_6;
}

我们通过a.so调用了一个native方法实现,我们在这个方法中启动了一个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方法中本地引用的生命周期是什么

【问题讨论】:

  • startTimerInCurrentTheadWithoutBlockCurrentThread 是什么?
  • @Joni 在当前本地方法中每 1 秒调用一次方法调用线程而不阻塞线程
  • 这个函数是你自己创建的吗?它是如何工作的?

标签: java c++ memory-management java-native-interface


【解决方案1】:

由于您的 cppMethod 是本机方法,您需要自己处理本地引用。
从技术上讲,您的本地引用将绑定到 JNIEnv,而旧版本的 jvm 在删除 Env 时确实释放了所有引用。
但我不知道这种行为是在某处指定的。

所以回答你的问题:

  1. 您创建的所有本地引用都将绑定到您创建的JNIEnv
  2. 如果您不发布本地参考,它们将永远有效。

因此,通常最好始终处理本地引用,尽管在 JNI 调用中不需要它。
您可以使用 RAII 围绕 PushLocalFrame/PopLocalFrame 的包装器来简化此处理

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-09-20
    相关资源
    最近更新 更多