java - 将在 native 代码中缓存 jclass 防止类被卸载

标签 java android java-native-interface

根据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/

相关文章:

java - JFrame 不工作 - 内容不出现

java - 我不明白如何组织我的 fragment

android - 在 Eclipse 中编译示例 JNI 代码

c++ - 如何在JNI中为C++创建的新线程继续调用java实例jobject

java - 是否可以听到蓝牙按钮的点击?

javax.crypto.IllegalBlockSizeException : last block incomplete in decryption exception

java - 如何在 Bukkit 插件中创建自定义配置文件?

Android - 如何以编程方式跟踪设备上任何正在运行的应用程序的内存使用情况?

java - 从 Java android 运行 curl

使用 JNI 的 Java 应用程序