gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:00 26 4
gpt4 key购买 nike

我需要实现一个本地方法,比方说“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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com