![](/img/trans.png)
[英]Is AOSP's libc++.so the same as NDK's libc++_shared.so?
[英]Android NDK cannot load libc++_shared.so, gets "cannot locate symbol 'rand' reference
在我的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庫?
真正的錯誤是別的:rand()不存在,因為Android-21不兼容。
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "rand" referenced by
有關詳細信息,請參閱此主題 。
建議的解決方法是在jni / Application.mk中降級您的API並將其設置為低於Android-21的值 。 如果您需要Android-21,那么Google實際上建議您發送多個APK文件。 啊。
問題完全在原生方面。 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
,但是一些自定義代碼?),但你仍然可以嘗試:
要么
AND / OR
你不必寫
System.loadLibrary("c++_shared");
只包括: -
APP_STL := c++_shared
在你的Application.mk中應該使它工作,現在libc ++ _ shared.so將被捆綁
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.