[英]Libogg compiled with standalone toolchain (generated by NDK script) tries to load itself from incorrect file - libogg.so.0 instead of libogg.so
我正在嘗試將libogg添加到我的android NDK項目中。
我正在使用SDL庫隨附的項目模板。
我在Windows上,因此以下所有腳本均在Linux終端仿真器MSYS下執行。
首先,我生成了一個獨立的工具鏈。
android-ndk/build/tools/make-standalone-toolchain.sh --platform=android-12 --system=windows-x86_64 --toolchain=arm-linux-androideabi-4.9 --install-dir=Y:/gcc_android_androideabi-4.9_api12/
然后我建立了圖書館。
make clean
configure CC="/y/gcc_android_androideabi-4.9_api12/bin/arm-linux-androideabi-gcc" LIBS="-lgnustl_shared" CFLAGS="-mthumb" --host=arm-linux-androideabi
make
然后,我將生成的libogg.so
復制到我的項目文件夾中,並將以下內容添加到我的jni/src/Android.mk
:
...
include $(CLEAR_VARS)
LOCAL_MODULE := ogg-prebuilt
LOCAL_SRC_FILES := ../../prebuilt-libs/$(TARGET_ARCH_ABI)/libogg.so
include $(PREBUILT_SHARED_LIBRARY)
...
LOCAL_SHARED_LIBRARIES := ... ogg-prebuilt ...
...
類似的代碼對於我使用的另一個庫也能正常工作。
ndk-build
成功找到我的庫並將其添加到.apk
。
當我調用System.loadLibrary("ogg");
時出現問題System.loadLibrary("ogg");
在運行時。 動態鏈接器給我錯誤消息說類似
找不到庫“ libogg.so.0”。
我確定我的庫加載代碼正常,因為它適用於我擁有的其他庫。
來自動態鏈接器的錯誤很有趣,因為make
不僅生成了單個libogg.so
。 它生成了3個名稱完全相同的完全相同的文件: libogg.so
, libogg.so.0
和libogg.so.0.8.2
。
我試圖用libogg.so.0
替換libogg.so
並適當地調整了Android.mk
,但是NDK構建腳本對我大吼大叫,說預建的共享庫必須具有.so
擴展名。 我試圖僅將libogg.so.0
復制到libs/
文件夾,但是NDK構建腳本在構建.apk
時將其忽略。
然后,我在十六進制編輯器中打開libogg.so
並搜索libogg
。 我發現只有一種情況: libogg.so.0[NUL]
。 我將.0
替換為2 [NUL]
,因此它變成了libogg.so[NUL][NUL][NUL]
,現在庫已完美加載。
我可以使用所有使用的工具鏈重現此錯誤: arm-linux-androideabi-gcc-4.9
, i686-linux-android-gcc-4.9
和mipsel-linux-android-gcc-4.9
。 它們都是使用類似的腳本生成的。
如果我將libogg.so.0
或libogg.so.0.8.2
重命名為libogg.so
並使用它而不是原始libogg.so
,該錯誤仍然存在。 正如我所說,這三個文件都具有相同的內容。
雖然我可以制作sed
腳本來在必要時自動修復.so
文件中的庫名,但我想知道是否有更好的解決方案來解決此問題。
也許我必須添加一些標志來configure
?
我對此稍有改動的修正是從libogg的構建系統中刪除版本信息。
在具有libogg源代碼的目錄中,打開文件src/Makefile.am
並更改此行:
libogg_la_LDFLAGS = -no-undefined -version-info @LIB_CURRENT@:@LIB_REVISION@:@LIB_AGE@
至
libogg_la_LDFLAGS = -avoid-version
如果沒有安裝automake,則可以在運行./configure
之后更改生成的Makefile。 找到libogg_la_LDFLAGS
並對上述詳細內容進行類似的更改。 在Linux上,像這樣的sed單行代碼可以完成此任務:
sed -i 's/^libogg_la_LDFLAGS.*/libogg_la_LDFLAGS = -avoid-version/g' src/Makefile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.