簡體   English   中英

Android NDK無法加載libc ++ _ shared.so,獲取“無法定位符號'rand'引用

[英]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 ,但是一些自定義代碼?),但你仍然可以嘗試:

  • 使用GCC的GNU標准庫,將GCC 4.8作為工具鏈

要么

  • 使用Clang編譯器,將libc ++作為標准庫

AND / OR

  • 使用靜態鏈接進行“調試”(在缺少某些內容之前不會鏈接,允許您在不弄亂Java和JNI的情況下找到原因)

你不必寫

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

只包括: -

APP_STL := c++_shared 

在你的Application.mk中應該使它工作,現在libc ++ _ shared.so將被捆綁

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM