簡體   English   中英

使用獨立工具鏈(由NDK腳本生成)編譯的Libogg嘗試從錯誤文件-libogg.so.0而不是libogg.so加載自身

[英]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.solibogg.so.0libogg.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.9i686-linux-android-gcc-4.9mipsel-linux-android-gcc-4.9 它們都是使用類似的腳本生成的。

如果我將libogg.so.0libogg.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.

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