Android NDK无法加载libc ++ _ shared.so,得到"找不到符号' rand'参考

时间:2015-02-13 17:05:29

标签: android android-ndk

在我的java课中我有这个:

static
{
    System.loadLibrary("c++_shared");

    System.loadLibrary("com.testandroid.LibAndroidBridge");
}

我的Application.mk有这个:

NDK_TOOLCHAIN_VERSION:=4.8
APP_STL := c++_shared
APP_ABI := x86

事情很好,但是当我运行应用程序时(在模拟器或设备上,所以x85和arm)我在LogCat中得到了这个:

02-13 12:00:32.174: D/dalvikvm(2142): Trying to load lib /data/app-lib/com.testandroid-1/libc++_shared.so 0xb0fcfc60
02-13 12:00:32.174: D/dalvikvm(2142): Added shared lib /data/app-lib/com.testandroid-1/libc++_shared.so 0xb0fcfc60
02-13 12:00:32.174: D/dalvikvm(2142): No JNI_OnLoad found in /data/app-lib/com.testandroid-1/libc++_shared.so 0xb0fcfc60, skipping init
02-13 12:00:32.174: D/dalvikvm(2142): Trying to load lib /data/app-lib/com.testandroid-1/libcom.testandroid.LibAndroidBridge.so 0xb0fcfc60
02-13 12:00:32.174: E/dalvikvm(2142): dlopen("/data/app-lib/com.testandroid-1/libcom.testandroid.LibAndroidBridge.so") failed: dlopen failed: cannot locate symbol "rand" referenced by "libcom.testandroid.LibAndroidBridge.so"...
02-13 12:00:32.174: W/dalvikvm(2142): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/testandroid/AriesLib;
02-13 12:00:32.174: D/AndroidRuntime(2142): Shutting down VM
02-13 12:00:32.174: W/dalvikvm(2142): threadid=1: thread exiting with uncaught exception (group=0xb0cb0b20)
02-13 12:00:32.174: E/AndroidRuntime(2142): FATAL EXCEPTION: main
02-13 12:00:32.174: E/AndroidRuntime(2142): Process: com.testandroid, PID: 2142
02-13 12:00:32.174: E/AndroidRuntime(2142): java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "rand" referenced by "libcom.testandroid.LibAndroidBridge.so"...
02-13 12:00:32.174: E/AndroidRuntime(2142):     at java.lang.Runtime.loadLibrary(Runtime.java:364)

有谁知道为什么这无法导入c ++ _ shared.so库?

3 个答案:

答案 0 :(得分:3)

真正的错误是别的:rand()不存在,因为Android-21不兼容。

java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "rand" referenced by

有关详细信息,请参阅此thread

建议的解决方法是在 jni / Application.mk 中降级您的API,并将其设置为低于Android-21 。 如果您需要Android-21,那么Google实际上建议您发送多个APK文件。啊。

答案 1 :(得分:0)

问题完全在原生方面。 Java对于JNI边界之外发生的事情没有任何线索。您无法通过这种方式创建两个本机库。特别是,C ++标准库(JNI没有任何容易且可靠地访问的符号)。

您应解决本机端的所有符号,即您应该正确地将C ++标准库链接到libcom.testandroid.LibAndroidBridge.so

我建议不要在Android上混用{gcc toolchain(在你的情况下为4.8)+ libc ++(" c ++ _ shared")}或{clang + libstdc ++}。它应该在桌面Linux或OSX上理论上工作,但仍然存在可移植性问题,并且Android上存在一些怪癖,这取决于NDK版本,目标和一些"随机"因素。所以它并不总是有效。

很遗憾,您没有提供使用rand的代码(可能它甚至是非标准库rand,但有些自定义代码?),但您仍然可以尝试:< / p>

  • 使用GCC的GNU标准库,将GCC 4.8作为工具链

OR

  • 使用Clang编译器,将libc ++作为标准库

和/或

  • 使用静态链接进行&#34;调试目的&#34; (它不会链接,直到缺少某些东西,允许你在不弄乱Java和JNI的情况下找到原因)

答案 2 :(得分:0)

你不必写

APP_STL := c++_shared 

只包括: -

ConnectionString
在您的Application.mk中

这应该使它工作,现在libc ++ _ shared.so将捆绑