我正在开发应用程序。
在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)
结果:" JNI在应用程序中检测到错误:jmethodID为NULL"
Android 5.0.2
查询:
不兼容?
解? (我是否需要对jmethodID进行全局引用?)
答案 0 :(得分:0)
这与递归加载共享库有关。
加载类时,执行其静态块。 在静态块中,共享库加载器位于顶部,然后是其余的init代码。
class(Foo)load =>其静态块执行=> jni library loader => JNI_OnLoad =>缓存静态方法Foo.Bar()=> class(Foo)load => WARN(recusive-load-warning)并执行调用jni代码的其余静态块剩余代码,它使用Foo.Bar()和BOOM!