【问题标题】:Android runtime error- dlopen failed: cannot locate symbol "__cxa_end_cleanup" referenced by "libcryptopp.so"Android 运行时错误-dlopen 失败:找不到“libcryptopp.so”引用的符号“__cxa_end_cleanup”
【发布时间】: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 没有 包含LDLLIBSLDFLAGS,因此共享对象缺少对libstlport_shared.so 的依赖。问题现已修复,材料已更新。
  • ping...你做的怎么样?

标签: android android-ndk linker runtimeexception crypto++


【解决方案1】:

您好,我在使用 NDK 和 STL 时遇到了同样的问题,我刚刚解决了。我发现我的本机库将依赖于 STL,但即使我将它打包到 APK 文件中,Dalvik VM 也不会自动从系统加载它。因此,我尝试通过在 JAVA 文件中添加以下行来自己加载它:

System.loadLibrary("stlport_shared");

我的 Application.mk 的样子:

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

也许对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多