Java 在本机代码中缓存jclass会阻止类被卸载吗

Java 在本机代码中缓存jclass会阻止类被卸载吗,java,android,java-native-interface,Java,Android,Java Native Interface,根据: 类引用、字段ID和方法ID保证在卸载该类之前有效。只有当与类加载器关联的所有类都可以被垃圾收集时,类才会被卸载 如果我保留类的全局引用,它会保证类永远不会被卸载吗 static jclass g_classMyClass; jint JNI_OnLoad(JavaVM *pJVM, void *reserved) { JNIEnv *pEnv; if (pJVM->GetEnv((void**)&pEnv, JNI_VERSION_1_6) != JNI_

根据:

类引用、字段ID和方法ID保证在卸载该类之前有效。只有当与类加载器关联的所有类都可以被垃圾收集时,类才会被卸载

如果我保留类的全局引用,它会保证类永远不会被卸载吗

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;
}

在我看来,如果您使用默认的东西而不是使用类加载器,那么从应用程序的其他类中引用
MyClass
的任何方法或字段就足以防止卸载
MyClass
;不用麻烦了

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