使用JNI加载另一个JNI库?

Yif*_*fan 5 c++ java java-native-interface

我需要实现一个本机方法,让我们说"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;
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个错误(来自android logcat)"JlI_OnLoad在/lib/libdef.so中返回了坏版本(-1)"如果我直接从Java加载libdef.so,我不会收到此错误.另外,如果我创建另一个本机方法"loadDef()"并使用相同的代码实现它,它也可以工作.我认为问题是使用jvm-> GetEnv(),但我不确定.此外,我甚至不知道这是否允许我实现我想要的(使用一个JNI库加载另一个来实现).我这样做的原因很复杂,但没有其他选择.

Yif*_*fan 0

虽然我仍然没有解决在 JNI_OnLoad 中加载另一个 JNI 库的问题,但我找到了调用的第一个本机函数,替换了它,并在该函数中运行了 loadLibrary 代码。然后我再次从 JNI 调用本机方法,它运行该方法的新版本。