2014-08-28 139 views
1

我一直在嘗試編譯/鏈接/運行使用NDK的Android項目,並且有2個階段的NDK編譯。我已經能夠使用GNU-libstdC++進行編譯,而無需包含CryptoPP,這是用於加密的OpenSSL庫的一個很好的替代方案。使用CryptoPP,我收到標題中指出的運行時錯誤。Android運行時錯誤 - dlopen失敗:無法找到「libcryptopp.so」引用的符號「__cxa_end_cleanup」

在編譯我的Android NDK項目時,我沒有編譯器錯誤,但是在運行時,CryptoPP庫在定位符號「__cxa_end_cleanup」時遇到問題。我試過使用STLport以及GNU-libstdC++手動重新編譯libcryptopp.so文件,並且都導致相同的運行時錯誤。我一直在按照http://www.cryptopp.com/wiki/Android_(Command_Line)的說明進行操作。更改編譯器時,我一直在正確更改APP_STL。

網上看,似乎這個錯誤與C++異常處理,因此我試着從Android.mk 刪除行「LOCAL_CPP_FEATURES + =異常」,使異常沒有被啓用,但同樣,運行期間相同的錯誤。

我也在JNI的Java端以正確的,反向的順序加載庫。 System.loadLibrary(「cryptopp」)在加載我的其他定製庫之前。

我也嘗試過在armeabi /文件夾中加入stlport_shared.so,然後加載第一個,在cryptopp之前,以及相同的錯誤。

同樣,我在GNU-libstdC++編譯時嘗試了libsupC++。armeabi /文件夾中的一個庫,因爲這是添加異常處理的C++庫,並且在Android.mk中包含對它的引用「LOCAL_CFLAGS + = -lsupC++」「LOCAL_WHOLE_STATIC_LIBRARIES:= libsupC++一個」

有沒有人有使用CryptoPP與Android類似的問題?如果是這樣,你如何配置你的makefile來正確鏈接庫?最後,任何想法,爲什麼這不會導致編譯過程中的錯誤,只有在運行時?完整的錯誤被粘貼如下:

E/dalvikvm(15888)的dlopen( 「/ data/app中-LIB/com.example.test_app/libcryptopp.so」)失敗:dlopen的失敗:無法找到符號「__cxa_end_cleanup 「引用」libcryptopp.so「...

+0

在維基,在[執行程序](http://www.cryptopp.com/wiki/Android_%28Command_Line%29#Execute_the_Program),'ANDROID_STL_LIB'('/ opt/android-ndk-r9/sources/cxx-stl/stlport/libs/armeabi/libstlport_shared.so')也被推送到設備。你有沒有嘗試在'armeabi /'文件夾中包含'libstlport_shared.so'?此外,沒有理由嘗試在文件夾中包含靜態存檔('* .a')。 – jww 2014-08-29 09:55:26

+0

「我也嘗試過在armeabi /文件夾中加入stlport_shared.so,然後先加載,然後再加入cryptopp,並且出現同樣的錯誤。」 是的,也試過了,謝謝你的建議!我仍然得到與這個缺失的cxa_end_cleanup符號相關的運行時錯誤 – DanielG 2014-08-29 18:38:52

+1

您是如何在這裏弄出來的?我在你提供的參考資料中發現了一個錯誤 - Crypto ++ wiki,交叉編譯腳本,Crytpo ++補丁和預建庫(不幸的是,我把它們全寫了)。 Crypto ++的GNUMakefile沒有包含LDLLIBS或LDFLAGS,所以共享對象缺少對libstlport_shared.so的依賴。這些問題現在已經修復,並且材料已經更新。 – jww 2014-09-03 06:05:04

回答

0

您好我在使用NDK和STL時遇到同樣的問題,我剛纔解決了它。我發現我的本地庫取決於STL,但Dalvik VM並未自動從系統加載它,即使我將它打包到APK文件中。因此,我嘗試通過在JAVA文件中添加該行來自行加載它:

System.loadLibrary(「stlport_shared」);

凡我Application.mk樣子:

APP_ABI := armeabi-v7a-hard 
APP_STL := stlport_shared 

也許這將有助於你

相關問題