使用JNI加载另一个JNI库

Using JNI to load another JNI library?

本文关键字:JNI 另一个 加载 使用      更新时间:2023-10-16

我需要实现一个本地方法,我们说"public native void someFunc();"我有两个库,libabc。So和libdef。So。Java使用System.loadLibrary();加载libc。so(它不实现该方法),但是JNI实现在libdef.so中。目前,我正在lib .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中的错误版本(-1)。"如果我加载libdef。直接从Java中,我不会得到这个错误。此外,如果我创建另一个本机方法"loadDef()"并用相同的代码实现它,它也可以工作。问题,我认为,是使用jvm->GetEnv(),但我不确定。此外,我甚至不知道这是否允许我实现我想要的(使用一个JNI库来加载另一个库来实现)。我这样做的原因很复杂,但没有其他选择。

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