首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android NDK UnsatisfiedLinkError:"dlopen失败:DT_HASH为空/缺失“

Android NDK UnsatisfiedLinkError:"dlopen失败:DT_HASH为空/缺失“
EN

Stack Overflow用户
提问于 2015-02-21 05:48:27
回答 8查看 10.7K关注 0票数 12

我正在使用崩溃报告服务跟踪我们的安卓应用程序(使用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
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2018-12-17 04:55:40

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

票数 4
EN

Stack Overflow用户

发布于 2015-02-21 06:36:27

您尝试加载的库很可能是使用-Wl,--hash-style=gnu构建的。直到最近,Android才支持这一点(afaik,这甚至不是L)。您需要使用-Wl,--hash-style=sysv构建您的库。

你是如何构建cpplibrary.so的?如果您没有做任何事情来手动切换到gnu散列样式,这可能是NDK中的一个bug。

票数 3
EN

Stack Overflow用户

发布于 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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28638809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档