根据https://developer.android.com/training/articles/perf-jni.html :
The class references, field IDs, and method IDs are guaranteed valid until the class is unloaded. Classes are only unloaded if all classes associated with a ClassLoader can be garbage collected
如果我保留该类的全局引用,是否可以保证该类永远不会被卸载?
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;
}
最佳答案
IMO,如果您使用默认内容而不是使用类加载器,那么从应用程序的其他类引用 MyClass
的任何方法或字段就足以防止卸载 MyClass
;只是不要打扰。
实际中可能发生的情况是进程被终止并重新启动,在这种情况下,所有静态变量都将设置为其初始值(这就是 Activity 使用 Bundle 而不是静态变量在将来向自身传递数据的原因)。
关于java - 将在 native 代码中缓存 jclass 防止类被卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29936788/