Android Java如何调用使用JNI命名规则命名的JNI函数?
很容易知道Java如何调用在JNI_OnLoad()中注册的JNI函数。它们的函数指针存储在JniEnv中 但是,如果一个函数是用JNI命名规则命名的,比如Java_com_example_XXX_helloJni,那么它不会在JNI_OnLoad()中注册。它叫什么名字 实际上,我想做的是在本机代码中加载一个典型的库,然后从Java代码中调用它的函数。此库具有一些具有规则名称的函数。我希望在Java代码中调用这些函数,而不用在Java代码中加载库 为了使其更易于理解,流程如下: 1) Java代码->加载库A 2) 库A->加载库B 3) Java代码->调用库B的函数 根据我的理解,B的函数应该被成功调用,因为: 1) B的函数使用JNI命名规则命名并导出 2) LoadLibrary()只做了两件主要的事情:dlopen()+dlsym(“JNI_OnLoad”),这正是我在加载B时所做的Android Java如何调用使用JNI命名规则命名的JNI函数?,android,java-native-interface,Android,Java Native Interface,很容易知道Java如何调用在JNI_OnLoad()中注册的JNI函数。它们的函数指针存储在JniEnv中 但是,如果一个函数是用JNI命名规则命名的,比如Java_com_example_XXX_helloJni,那么它不会在JNI_OnLoad()中注册。它叫什么名字 实际上,我想做的是在本机代码中加载一个典型的库,然后从Java代码中调用它的函数。此库具有一些具有规则名称的函数。我希望在Java代码中调用这些函数,而不用在Java代码中加载库 为了使其更易于理解,流程如下: 1) Java
但是我失败了。无法调用B的函数。错误为java.lang.UnsatifiedLinkError
有人能帮忙吗?谢谢。使用JNINameString命名的JNI函数由Native.cpp中的dvmResolveNativeMethod调用。详细过程如下:
dvmResolveNativeMethod->DVMLookupinternalnativeMethodo->lookupSharedLibMethod->findMethodInLib->dlsym我试图在B的JNI_OnLoad()中注册B的函数,并成功地从Java代码中调用了这些函数。“错误是Java.lang.unsatifiedLinkError。”“这一例外的内容是什么?还有Java本机方法声明?那么C声明呢?定义呢?声明都是正确的。我想问题是JNI找不到函数。因此,如果我在JNI_OnLoad中注册函数,它就可以工作。如果声明正确,就不必这样做。因此,它们不是。将
JNI_OnLoad()
从libA链接到libB是一个聪明的技巧,这应该会奏效。另一个选项是从libA调用System.LoadLibrary(“B”)
(env->FindClass(“java/lang/System”)
,以此类推)。我个人更喜欢JNI_OnLoad()
方法,因为这样可以缩短导出符号的列表。