将在本机代码中缓存 jclass 以防止 class 被卸载
will cache jclass in native code prevent the class been unloaded
根据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
如果我保留 class 的全局引用,它会保证 class 永远不会被卸载吗?
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,如果你使用默认的东西而不是玩 class 加载器,那么从你的应用程序的其他 class 中引用 MyClass
的任何方法或字段是足以防止 MyClass
的卸载;只是不要打扰。
实际上可能发生的情况是进程被终止并重新启动,在这种情况下,所有静态变量都将设置为它们的初始值(这就是为什么 Activity 使用 Bundle 而不是静态变量来将数据传递给它们自己)未来)。
根据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
如果我保留 class 的全局引用,它会保证 class 永远不会被卸载吗?
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,如果你使用默认的东西而不是玩 class 加载器,那么从你的应用程序的其他 class 中引用 MyClass
的任何方法或字段是足以防止 MyClass
的卸载;只是不要打扰。
实际上可能发生的情况是进程被终止并重新启动,在这种情况下,所有静态变量都将设置为它们的初始值(这就是为什么 Activity 使用 Bundle 而不是静态变量来将数据传递给它们自己)未来)。