android ndk undeSouniedlinkError:" dlopen失败:空/丢失dt_hash"

 2023-01-19    396  

问题描述

我正在使用我们的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组发布)讨论构建LIB的问题,这会导致每次运行应用程序时发生此错误.关于为什么可能会偶尔会发生这种情况的信息很少. 这篇文章是我可以找到的最接近的.

android ndk undeSouniedlinkError:" dlopen失败:空/丢失dt_hash"

基于崩溃的痕迹,看起来任何特定用户都会不断地体验到伸展运动.我不确定这些用户是否能够正确加载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)

application.mk:

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

推荐答案

如果您是第三方建筑.So库供他人使用,则设置-Wl,–hash-style=both似乎是最好的主意.这使您更快地加载了GNU风格的哈希和SYSV哈希的后退兼容性.

如果您只支持Android 8及以后,则无需支持SYSV哈希.

其他推荐答案

您要加载的库很可能是由-Wl,–hash-style=gnu构建的.直到最近,Android才得到支持(Afaik这甚至不在L中).您需要使用-Wl,–hash-style=sysv.

构建库

您是如何构建cpplibrary.so的?如果您没有做任何手动切换到GNU HASH样式的事情,则可能是NDK中的错误.

其他推荐答案

我在使用Android Cmake时遇到了这个问题,我已经设置了
-DANDROID_PLATFORM=23
按照 changElog gnu hash样式可从API 23获得,并且由于ANDROID_PLATFORM的设置为23,因此自动设置了标志–hash-style=gnu.

我仅通过降低-DANDROID_PLATFORM=21就修复了这一点,然后将标志设置为标志–hash-style=both

以上所述是小编给大家介绍的android ndk undeSouniedlinkError:" dlopen失败:空/丢失dt_hash",希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25788.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。