gpt4 book ai didi

java - JNI 本地引用空闲时间

转载 作者:行者123 更新时间:2023-12-01 14:57:17 25 4
gpt4 key购买 nike

根据官方文档说:

Local references are valid for the duration of a native method call, and are automatically freed after the native method returns


镜像一个案例,我们有原生框架 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 调用本地方法实现,我们在这个方法中启动了一个 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是一种本地方法,您需要自己处理本地引用。
从技术上讲,您的本地引用将绑定(bind)到 JNIEnv和旧版本的 jvm 确实在其 Env 时释放了所有引用。去掉了。
但我不知道这种行为是在某处指定的。
所以回答你的问题:

  • 您创建的所有本地引用都将绑定(bind)到 JNIEnv您创建的
  • 如果您不发布您的本地引用资料,它们将永远有效。

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

    关于java - JNI 本地引用空闲时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62994351/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com