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

时间:2013-11-20 05:13:13

标签: android java-native-interface

很容易知道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)System.LoadLibrary()只做了两件事:dlopen()+ dlsym(“JNI_OnLoad”),这正是我在加载B时所做的事情

但我失败了。 B的功能无法调用。错误是java.lang.UnsatisfiedLinkError。

有人可以帮忙吗?感谢。

1 个答案:

答案 0 :(得分:0)

以JNINameString命名的JNI函数由Native.cpp中的dvmResolveNativeMethod调用。详细过程是: dvmResolveNativeMethod - > dvmLookupInternalNativeMetho - > lookupSharedLibMethod - > findMethodInLib - >对dlsym