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

时间:2015-09-29 13:59:09

标签: android

我的Android应用程序崩溃,并向我提供以下错误消息:

  

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

7 个答案:

答案 0 :(得分:15)

由于以下在Android M中已更改的事实,崩溃即将到来。

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

有关详细信息,请参阅此link

答案 1 :(得分:3)

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

我看到这个问题只在使用目标版本为23时才出现。Reading other posts很容易识别用旧的ndk工具编译的libs(ndk-build,更具体,但我不是确切地知道该工具后来是否满足了新的需求。

我使用了来自ZBar project的依赖关系libiconv。所以我认为重新编译它会有所帮助,并有所帮助。我使用ndk-build工具重新编译zbar和iconv库。

我希望它足够了。

答案 2 :(得分:2)

这与Android 6.0(Marshmallow)从OpenSSL切换到BoringSSL有关。

您的异常发生在引用的库代码中。请与供应商联系以获取修复程序或手动包含OpenSSL库以避免此问题。

另见:https://sourcedna.com/blog/20150806/predicting-app-crashes-on-android-m.html

答案 3 :(得分:2)

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

defaultConfig {
  targetSdkVersion 22
}

答案 4 :(得分:1)

尝试将targetSdkVersion中的build.gradle更改为22中的APP_PLATFORM := android-22application.mk中的getBoundingClientRect().top + body.scrollTop。 这在我的环境中起作用。

答案 5 :(得分:1)

不确定这是否对某人有帮助,但是我遇到了类似的错误,这就是我的解决方法。 我的问题是我有一个使用sqlchiper .so文件的库模块,这些.so文件在我的app模块中,但是实现此sqlitechiper的依赖项在库模块build.gradle中。

api 'net.xxxx:android-database-sqlcipher:xxx@aar'

但是我们决定将库模块转换为.aar文件,并将其作为依赖项添加到应用程序模块中,这就是我遇到崩溃java.lang.UnsatisfiedLinkError: dlopen failed:的时候。而且我在应用程序层中使用了sqlitechiper.jar,所以我也没有遇到任何编译时错误。

在应用程序层中添加依赖项并从应用程序层中删除sqlitechiper.jar文件依赖项已解决了该问题。

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

答案 6 :(得分:0)

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

android.ndk {
     <...> //rest of lines
     cppFlags.add("-fPIC") //generate position independent code
     <...> 
}