我正在使用崩溃报告服务跟踪我们的安卓应用程序(使用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)
我可以在互联网上找到的几个关于这个错误的提及(例如这个Google Groups post)讨论了构建库的问题,这导致每次应用程序运行时都会发生这个错误。关于为什么这种情况可能会零星发生的信息很少。This post是我能找到的最接近的了。
根据崩溃的痕迹,看起来任何特定的用户都会经常遇到这种情况;我不确定这些用户是否能够正确地加载lib。有没有人知道是什么原因导致这种情况只会偶尔发生?我可以做不同的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)
Application.mk:
APP_STL := stlport_static
APP_CFLAGS += -std=c++11
发布于 2018-12-17 04:55:40
如果您是构建.so库以供他人使用的第三方,那么设置-Wl,--hash-style=both
似乎是最好的主意。这让您可以更快地加载Gnu样式的散列,并获得SysV散列的向后兼容性。
发布于 2015-02-21 06:36:27
您尝试加载的库很可能是使用-Wl,--hash-style=gnu
构建的。直到最近,Android才支持这一点(afaik,这甚至不是L)。您需要使用-Wl,--hash-style=sysv
构建您的库。
你是如何构建cpplibrary.so
的?如果您没有做任何事情来手动切换到gnu散列样式,这可能是NDK中的一个bug。
发布于 2020-01-09 00:12:26
我在使用Android Cmake时遇到过这个问题,我已经按照changelog设置了-DANDROID_PLATFORM=23
,GNU散列样式从API23开始可用,并且由于ANDROID_PLATFORM
被设置为23,标志--hash-style=gnu
被自动设置。
我已经修复了这个问题,只需降低-DANDROID_PLATFORM=21
,然后将标志设置为标志--hash-style=both
https://stackoverflow.com/questions/28638809
复制相似问题