很容易知道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。
有人可以帮忙吗?感谢。
答案 0 :(得分:0)
以JNINameString命名的JNI函数由Native.cpp中的dvmResolveNativeMethod调用。详细过程是: dvmResolveNativeMethod - > dvmLookupInternalNativeMetho - > lookupSharedLibMethod - > findMethodInLib - >对dlsym