Java 使用JNI加载另一个JNI库?

Java 使用JNI加载另一个JNI库?,java,c++,java-native-interface,Java,C++,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;

我需要实现一个本机方法,比如“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库来加载另一个来实现)。我这样做的原因很复杂,但没有其他选择。

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

噢,更多信息。在logcat上,在出现错误之前,我看到“正在尝试加载lib/lib/libdef.so 0x0”,我认为这意味着它正在尝试将库加载到0x0。为什么?我不确定期望
loadLibrary()
是可重入的是否合理。事实上,这是从一个正常的本地方法似乎证明了这种怀疑。你为什么不试试这个复杂的原因呢?也许我们可以帮你想出一个替代方案。我可以尝试注册,但这意味着我必须手动加载库并找到函数的位置。如果loadLibrary()不可重入,这就是问题所在,我可能必须这样做。您可能需要使用操作系统内置的本机库加载功能。只需在C++代码中执行,就像你通常需要访问另一个DLL一样。