我需要实现一个本机方法,让我们说“public native void someFunc();”。我有两个库,libabc.so和libdef.so。 Java使用System.loadLibrary();加载libabc.so(它没有实现该方法),但JNI实现在libdef.so中。目前,我在libabc.so中执行以下操作。
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved){
JNIEnv *env;
jclass cls;
jmethodID get_load_id;
jstring name;
jvm->GetEnv((void**)&env, JNI_VERSION_1_4);
cls = env->FindClass("java/lang/System");
get_load_id = env->GetStaticMethodID(cls, "load", "(Ljava/lang/String;)V");
name = env->NewStringUTF("/lib/libdef.so");
env->CallStaticVoidMethod(cls, get_load_id, name);
return JNI_VERSION_1_4;
}
但是,我收到一个错误(来自android logcat)“JNI_OnLoad在/lib/libdef.so中返回了坏版本(-1)”如果我直接从Java加载libdef.so,我不会收到此错误。另外,如果我创建另一个本机方法“loadDef()”并使用相同的代码实现它,它也可以工作。我认为问题是使用jvm-> GetEnv(),但我不确定。此外,我甚至不知道这是否允许我实现我想要的(使用一个JNI库加载另一个来实现)。我这样做的原因很复杂,但没有其他选择。
答案 0 :(得分:0)
虽然我仍然没有解决在JNI_OnLoad中加载另一个JNI库的问题,但我找到了第一个被调用的本机函数,替换了它,在该函数中,我运行了loadLibrary代码。然后我再次从JNI调用本机方法,并运行该方法的新版本。