Android NDK 不满意链接错误 : "dlopen failed: empty/missing DT_HASH"

标签 android c++ android-ndk linker java-native-interface

我正在使用崩溃报告服务跟踪我们的 Android 应用程序(使用 NDK 加载自定义 C++ 库)的崩溃。少数用户遇到以下崩溃:

java.lang.UnsatisfiedLinkError: dlopen failed: empty/missing DT_HASH in "cpplibrary.so" (built with --hash-style=gnu?)
   at java.lang.Runtime.loadLibrary(Runtime.java:365)
   at java.lang.System.loadLibrary(System.java:526)

我可以在 Internet 上找到关于此错误的几次提及(例如这个 Google Groups post )讨论了构建库的问题,这导致每次运行应用程序时都会发生此错误。关于为什么这种情况会偶尔发生的信息很少。 This post是我能找到的最接近的。

根据崩溃痕迹,似乎任何特定用户都会不断地经历这种情况;我不确定这些用户是否能够正确加载库。有没有人知道什么可能导致这种情况有时发生?我可以通过不同的方式构建 NDK 来尝试阻止它吗?

谢谢!

编辑:This post提到了两种有条件地获得此类错误的方法;我会调查他们。

Edit2:构建文件: Android.mk(节选):

include $(CLEAR_VARS)
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
LOCAL_C_INCLUDES := <Source Path>...
LOCAL_CFLAGS := -DANDROID -Wall
LOCAL_CPPFLAGS := -DENABLE_SDK_DEBUGGING=1 -DENABLE_SDK_LOGGING=1
LOCAL_MODULE := cpplibrary
LOCAL_SRC_FILES := <Source Files> / ...

LOCAL_LDLIBS    := -llog -landroid
LOCAL_STATIC_LIBRARIES := cpplibrary
include $(BUILD_SHARED_LIBRARY)

应用程序.mk:

APP_STL := stlport_static
APP_CFLAGS += -std=c++11

最佳答案

如果您是第三方构建 .so 库供他人使用,设置 -Wl,--hash-style=both 似乎是最好的主意。这使您可以更快地加载 Gnu 风格的散列和 SysV 散列的向后兼容性。

如果您仅支持 Android 8 及更高版本,则无需支持 SysV 哈希。

关于Android NDK 不满意链接错误 : "dlopen failed: empty/missing DT_HASH",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28638809/

相关文章:

c++ - 静态二维数组和动态二维数组的内存映射之间的区别?

android - 如何在 Android NDK 中比较两个 jbyte 数组

android - 指向 stdio FILE 的指针出现编译器错误

Android 在按钮上显示/隐藏 Tabwidget 单击

c++ - 使用 std::move 在开头插入 vector 的中间元素不起作用

android - mac os 中 android studio 中正确的 Assets 文件夹路径是什么

c++ - SFINAE 在评估模板参数中的 constexpr 时失败?

android - NDK : are x86 binaries needed for the Razr i?

java - 如何设置开关右侧的文本位置(如复选框)

java - ListView 将刷新已存在的项目,并且不会添加新项目