Android M崩溃java.lang.UnsatisfiedLinkError:dlopen失败:

Android M崩溃java.lang.UnsatisfiedLinkError:dlopen失败:,android,Android,我的Android应用程序正在崩溃,并显示以下错误消息: java.lang.UnsatisfiedLinkError:dlopen失败:找不到 崩溃即将来临,因为以下事实在安卓M中已经发生了改变 “在以前版本的Android上,如果您的应用程序请求系统加载带有文本重定位的共享库,系统会显示警告,但仍允许加载库。从本版本开始,如果应用程序的目标SDK版本为23或更高,系统将拒绝此库。为了帮助您检测库是否加载失败,您的应用程序应该记录dlopen(3)故障,并包含dlerror(3)调用返回的问题

我的Android应用程序正在崩溃,并显示以下错误消息:

java.lang.UnsatisfiedLinkError:dlopen失败:找不到


崩溃即将来临,因为以下事实在安卓M中已经发生了改变

“在以前版本的Android上,如果您的应用程序请求系统加载带有文本重定位的共享库,系统会显示警告,但仍允许加载库。从本版本开始,如果应用程序的目标SDK版本为23或更高,系统将拒绝此库。为了帮助您检测库是否加载失败,您的应用程序应该记录dlopen(3)故障,并包含dlerror(3)调用返回的问题描述文本。要了解有关处理文本重新定位的更多信息,请参阅本指南“


有关更多详细信息,请参阅此

这与Android 6.0(棉花糖)从OpenSSL切换到BoringSSL有关

引用的库代码中出现异常。请与供应商联系以获得修复,或手动包含OpenSSL库以避免此问题


另请参见:

作为一个简单的答案,您只需要在构建配置中针对android 22 sdk而不是android 23。 例如,使用gradle时:

defaultConfig {
  targetSdkVersion 22
}

尝试将
build.gradle
中的
targetSdkVersion
更改为
22
APP\u平台:=android-22
中的
application.mk

这在我的环境中起到了作用。

在此之前,我必须说,我不理解这个主题背后的所有细节,但我将尝试引导您走上帮助我的道路

我发现这个问题只有在使用目标版本as 23时才出现。很容易发现,在使用旧ndk工具编译的LIB中出现了这种情况(更具体地说,是ndk build,但我不知道该工具是否是为了满足新的需求而出现的)

这发生在我使用libiconv时,它是来自的一个依赖项。所以我认为重新编译它会有帮助,而且很有帮助。我使用ndk构建工具重新编译zbar和iconv libs


我希望它足够了。

我可以通过在gradle脚本中的NDK中添加以下行,使它在更新的SdkVersions中工作

android.ndk {
     <...> //rest of lines
     cppFlags.add("-fPIC") //generate position independent code
     <...> 
}
android.ndk{
//其余线路
cppFlags.add(“-fPIC”)//生成与位置无关的代码
}

不确定这是否对某人有帮助,但我也有类似的错误,这就是我如何修复它的原因。 我的问题是我有一个库模块,其中我使用了sqlchiper.so文件,这些.so文件在我的应用程序模块中,但是实现这个sqlitechiper的依赖项在library module build.gradle中

api 'net.xxxx:android-database-sqlcipher:xxx@aar'
但我们决定将库模块转换为.aar文件,并将其作为依赖项添加到app模块,这是在我遇到崩溃时发生的
java.lang.UnsatisfiedLinkError:dlopen failed:
。我在app层中使用了一个sqlitechiper.jar,所以我也没有得到任何编译时错误

在应用层中添加依赖项,并从应用层中删除sqlitechiper.jar文件依赖项,解决了这个问题。


在阅读了几个stackoverflow的答案后,我了解到,如果直接添加.aar文件,则添加到.aar文件中的依赖项不会在应用程序层中以传递方式包含,如果使用compile/api/implementation将其作为依赖项添加,则这些依赖项将以传递方式添加。

我建议查看和e:另一个解决方案23仅限我的要求如果需要使用Android API 23,这不是一个解决方案。如果我将目标设置为22,那么运行Android Marshmallow的设备是否可以从play store下载。或者更具体地说,如果手机中安装了Marshmallow,则此应用程序的目标设置为22,用户是否可以看到?是的,它将起作用你不能在Android Studio 3.1上使用API 22,而我在Android 6(23)上体验过这一点,在我的Nexus 6P(Android 7,24)上体验过同样的APK(目标24)没有出现同样的问题。有什么想法吗?@MarkCarter我需要检查Android N中发生了什么变化,您没有观察到此崩溃!我可以确认,对于相同的APK(仅限armeabi-v7a),崩溃发生在23(emulator和N5),而不是24(emulator和N6P)。我在Android 6(arm64构建)上也有相同的故障在安卓7设备(在我的7.0设备中为未修改的Nexus 6)上不会失败的设备,都是真正的硬件。同样重要的是尝试:它只会在安装apk后第一次运行应用程序时失败。如果我退出(2)应用程序(或重新启动设备)并再次启动应用程序,它工作正常!它使用NDK 13B为SDK 25构建的应用程序。会发生什么?”“文本重定位共享库”是什么意思?