Android ART中的jmethodID

时间:2015-02-14 10:50:37

标签: java android java-native-interface

我正在开发应用程序。
在JNI_OnLoad()中:

jclass cls = (*env)->FindClass(env, "dummy/dummy/dummy/Dummy");
    if(cls == NULL) {
        LOG_ERROR("unable to class");
        return;
    }

    cached_dummy.cls = (*env)->NewGlobalRef(env, cls);
    if(cached_dummy.cls == NULL) {
        LOG_ERROR("unable to create a global reference of class");
        return;
    }

    cached_dummy.method = (*env)->GetStaticMethodID(env, cls, "testMethod", "()V");

当我使用(*env)->CallStaticVoidMethod(env, cached_dummy.cls, cached_dummy.method)

在java回调中使用此缓存结果时

结果:" JNI在应用程序中检测到错误:jmethodID为NULL"
Android 5.0.2
查询:
 不兼容?
 解? (我是否需要对jmethodID进行全局引用?)

注意:https://stackoverflow.com/a/2093300/1500988

1 个答案:

答案 0 :(得分:0)

这与递归加载共享库有关。

加载类时,执行其静态块。 在静态块中,共享库加载器位于顶部,然后是其余的init代码。

class(Foo)load =>其静态块执行=> jni library loader => JNI_OnLoad =>缓存静态方法Foo.Bar()=> class(Foo)load => WARN(recusive-load-warning)并执行调用jni代码的其余静态块剩余代码,它使用Foo.Bar()和BOOM!