2013-01-09 54 views
1

我有2個共享庫:lib1.solib2.soAndroid:動態加載共享庫

lib1.so包含一些在lib2.so中定義的函數。從C程序我加載lib1.so使用以下調用:

dlopen("lib1.so", RTLD_NOW); 

兩個庫在當前目錄中呈現。我的程序在桌面Linux(Ubuntu,Debian)下運行,但不在Android下運行。在Android的dlopen下返回一個錯誤並退出。我試圖設置:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 

但它沒有幫助。

我完全困惑,爲什麼這段代碼在Android下無法運行。我無法在Android的動態鏈接器上找到任何有用的文檔。所以,我沒有解釋爲什麼它不起作用。

詳情:

  1. 的Android與Linux內核2.6.35 armv7l
  2. objdump顯示lib1.so libc.so需要和lib2.so
  3. objdump顯示lib2.so只需要libc.so

回答

1

好的。我剛剛找到一個解決方案。添加-lgcc到lib1.so的鏈接器選項已經解決了它。它看起來像編譯器已經自動生成了一些來自libgcc的特殊內置函數的調用。它還需要-lc,因爲編譯器還會自動生成對memcpy的特殊調用。

0

我不太清楚你的項目。但我認爲,使用System.loadLibrary從服務加載庫更好)。

System.loadLibrary(lib.so); 在你的情況下,首先加載lib2.so,然後只加載lib1.so

1

如果dlopen由於某種原因不起作用,你有沒有嘗試致電dlerror找出真正的問題是什麼?

+0

dlerror():無法加載庫:reloc_library [1311]:23061找不到'__aeabi_fcmpgt'... – psihodelia