在我的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库?
答案 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>
OR
和/或
答案 2 :(得分:0)
你不必写
APP_STL := c++_shared
只包括: -
ConnectionString
在您的Application.mk中这应该使它工作,现在libc ++ _ shared.so将捆绑