java - 使用 JNI 加载另一个 JNI 库?

标签 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;
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,我不会收到此错误.此外,如果我制作另一个 native 方法“loadDef()”并使用相同的代码实现它,它也可以工作。我认为问题在于使用 jvm->GetEnv() 但我不确定。另外,我什至不知道这是否能让我实现我想要的(使用一个 JNI 库加载另一个来实现)。我这样做的原因很复杂,但别无选择。

最佳答案

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

关于java - 使用 JNI 加载另一个 JNI 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975295/

相关文章:

c++ - 指向基的指针可以指向派生对象数组吗?

C++ WinAPI 位图内存泄漏?

c++ - 在 openGL 中,模型坐标应该在我的 CPU 上计算还是在 GPU 上通过 OpenGL 调用计算?

android - 如何解决Android Arm64-v8内存操作(memcpy, GetByteArrayRegion, SetByteArrayRegion)崩溃

java - 是否可以通过 POST 发送 JSONArray 而不是 JSONObject?

java - 如何从java中的数组中随机生成唯一的数字

java - 转换类型 JNI JAVA

android - 使用 native C++ 对象时如何使 JNI 方法调用不是静态的?

java - TreeTableView CheckBoxTreeTableCell 中的 ChangeListener 每次点击都会触发多次

java - 为什么 Java 中的 PriorityBlockingQueue 排序不正确?