Android NDK UnsatisfiedLinkError:"dlopen失败:空/丢失DT_HASH"

Tba*_*ams 7 c++ java-native-interface linker android android-ndk

我正在使用崩溃报告服务跟踪我们的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)
Run Code Online (Sandbox Code Playgroud)

我可以在互联网上找到的这个错误(例如这个Google Groups帖子)讨论了构建lib的问题,这会导致每次运行应用程序时都会出现此错误.几乎没有关于为什么偶尔会发生这种情况的信息. 这篇文章是我能找到的最接近的帖子.

根据崩溃痕迹,看起来任何特定的用户都会经历这种不断的延伸; 我不确定这些用户是否能够正确加载lib.有没有人对有时可能导致这种情况发生的想法有所了解?我可以以不同的方式进行NDK构建以试图阻止它吗?

谢谢!

编辑:这篇文章提到了有条件地获得这种错误的两种方法; 我会照顾他们.

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)
Run Code Online (Sandbox Code Playgroud)

Application.mk:

APP_STL := stlport_static
APP_CFLAGS += -std=c++11
Run Code Online (Sandbox Code Playgroud)

Joh*_*man 5

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

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