Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java如何调用使用JNI命名规则命名的JNI函数?_Android_Java Native Interface - Fatal编程技术网

Android Java如何调用使用JNI命名规则命名的JNI函数?

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

很容易知道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时所做的


但是我失败了。无法调用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()
方法,因为这样可以缩短导出符号的列表。