【发布时间】:2014-10-22 22:06:39
【问题描述】:
我一直在尝试编译/链接/运行一个使用 NDK 的 Android 项目,并且有 2 个阶段的 NDK 编译。我已经能够在不包含 CryptoPP 的情况下使用 GNU-libstdc++ 进行编译,CryptoPP 是用于加密的 OpenSSL 库的绝佳替代品。使用 CryptoPP,我收到标题中注明的运行时错误。
编译我的 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 += exceptions”中删除该行,以便不启用异常,但同样在运行时出现同样的错误。
我还在 JNI 的 Java 端以正确、反向的顺序加载库。 System.loadLibrary("cryptopp") 在加载我的其他定制库之前出现。
我也尝试在 armeabi/ 文件夹中包含 stlport_shared.so 并在 cryptopp 之前先加载,同样的错误。
同样,我尝试在使用 GNU-libstdc++ 编译时将 libsupc++.a 库包含在 armeabi/ 文件夹中,因为这是添加异常处理的 C++ 库,并且在 Android.mk 中包含了对它的引用 " LOCAL_CFLAGS += -lsupc++" 和 "LOCAL_WHOLE_STATIC_LIBRARIES := libsupc++.a"
有没有人在 Android 上使用 CryptoPP 时遇到过类似的问题?如果是这样,您是如何配置您的 makefile 以正确链接库的?最后,知道为什么这在编译期间不会导致错误,而且只会在运行时导致错误吗?完整的错误贴在下面:
E/dalvikvm(15888): dlopen("/data/app-lib/com.example.test_app/libcryptopp.so") 失败:dlopen 失败:找不到“libcryptopp.所以”...
【问题讨论】:
-
在 wiki 上,Execute the Program 下,
ANDROID_STL_LIB(/opt/android-ndk-r9/sources/cxx-stl/stlport/libs/armeabi/libstlport_shared.so) 也被推送到设备。您是否尝试在您的armeabi/文件夹中包含libstlport_shared.so?此外,没有理由尝试在文件夹中包含静态存档 (*.a)。 -
“我也尝试在 armeabi/ 文件夹中包含 stlport_shared.so 并在 cryptopp 之前先加载,同样的错误。” 是的,也试过了,谢谢你的建议!我仍然得到与这个丢失的 cxa_end_cleanup 符号相关的相同运行时错误
-
你是怎么过来的?我在您提供的参考资料中发现了一个错误——Crypto++ wiki、交叉编译脚本、Crytpo++ 补丁和预建库(遗憾的是,这些都是我编写的)。错误是 Crypto++ 的
GNUMakefile没有不 包含LDLLIBS或LDFLAGS,因此共享对象缺少对libstlport_shared.so的依赖。问题现已修复,材料已更新。 -
ping...你做的怎么样?
标签: android android-ndk linker runtimeexception crypto++