将在本机代码中缓存jclass以防止类被卸载

时间:2015-04-29 07:16:53

标签: java android java-native-interface

根据https://developer.android.com/training/articles/perf-jni.html

  

在卸载类之前,类引用,字段ID和方法ID保证有效。只有在与ClassLoader关联的所有类都可以进行垃圾回收时才会卸载类

如果我保留了该类的全局引用,它是否会保证该类从未被卸载过?

static jclass g_classMyClass;

jint JNI_OnLoad(JavaVM *pJVM, void *reserved)
{
    JNIEnv *pEnv;
    if (pJVM->GetEnv((void**)&pEnv, JNI_VERSION_1_6) != JNI_OK) {
        return -1;
    }

    jclass classMyClass = pEnv->FindClass("com/example/MyClass");
    g_classMyClass = (jclass)pEnv->NewGlobalRef(classMyClass);

    return JNI_VERSION_1_6;
}

1 个答案:

答案 0 :(得分:0)

IMO,如果你使用默认的东西而不是使用类加载器,那么从应用程序的其他类引用MyClass的任何方法或字段就足以防止MyClass的卸载;只是不要打扰。

在实践中可能发生的是一个进程被终止并重新启动,在这种情况下,所有静态变量都将被设置为它们的初始值(这就是为什么活动使用Bundles而不是静态变量来将数据传递给自己)。