在android N上使用 .so作为apk的第三方库的时候,会发生java.lang.UnsatisfiedLinkError:

09-27 12:17:01.280 D/ListenSoundModel( 3635): Load libxxxjni
09-27 12:17:01.292 D/AndroidRuntime( 3635): Shutting down VM
——— beginning of crash
09-27 12:17:01.293 E/AndroidRuntime( 3635): FATAL EXCEPTION: main
09-27 12:17:01.293 E/AndroidRuntime( 3635): Process: com.qualcomm.xxx, PID: 3635
09-27 12:17:01.293 E/AndroidRuntime( 3635): java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file “/data/app/xxxApp.apk”],nativeLibraryDirectories=[/data/app-lib/xxxApp, /system/lib64, /vendor/lib64]]] couldn’t find “libxxxjni.so”
09-27 12:17:01.293 E/AndroidRuntime( 3635): at java.lang.Runtime.loadLibrary0(Runtime.java:972)
09-27 12:17:01.293 E/AndroidRuntime( 3635): at java.lang.System.loadLibrary(System.java:1530)

09-27 12:17:01.293 E/AndroidRuntime( 3635): at android.os.Handler.dispatchMessage(Handler.java:102)
09-27 12:17:01.293 E/AndroidRuntime( 3635): at android.os.Looper.loop(Looper.java:154)

这在google的变更说明有 介绍https://developer.android.com/preview/behavior-changes.html#ndk,

具体是什么原因呢,怎么解决这种问题呢,google给出了一个官方的解决办法(如上链接),这里也给出另外一种方法。

首先,主要原因是google在N上对.so库的加载进行了限制,限制了so库指从部分指定的路径进行加载,不在这个路径的so提示
java.lang.UnsatisfiedLinkError: dlopen failed: library “xxx.so” not found 或
java.lang.UnsatisfiedLinkError: dlopen failed: library “/vendor/lib64/xxx.so” needed or dlopened by “/system/lib64/libnativeloader.so” is not accessible for the namespace “classloader-namespace” 或 其他异常错误提示。

N上对so库加载的搜索路径方式为ld_library_path, runtime path, permit path,不在这个搜索路径下则加载失败。

从代码层面看,主要是类加载器ClassLoader的相关处理,
code1: (loadedApk.java getClassLoader()) check sdk version
// DO NOT SHIP: this is a workaround for apps loading native libraries
// provided by 3rd party apps using absolute path instead of corresponding
// classloader; see http://b/26954419 for example.
if (mApplicationInfo.targetSdkVersion <= 23) {
libraryPermittedPath += File.pathSeparator + “/data/app”;
}

Code2: (loadedApk.java getClassLoader()) N add a new PermittedPath
String libraryPermittedPath = mDataDir;

Code3: (native_loader.cpp) use the new namespace rule with search path: ld_library_path, runtime path, permit path.

在明白原因之后,
解决办法则是将自己的so加入到允许路径的白名单里面,具体操作为,如果不改代码实现,则导出设备的/vendor/etc/public.libraries.txt 或/etc/public.libraries.txt文件,将so名字添加进去,在push到设备,重启即可。

android N : UnsatisfiedLinkError相关推荐

  1. 分析Android :java.lang.UnsatisfiedLinkError: dlopen failed * is 32-bit instead of 64-bit

    Crash 日志: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.ireader.plug.sdk/iread ...

  2. 【错误记录】Android Studio 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | 指定 APK 打包动态库的 CPU 架构 )

    文章目录 一.报错信息 二.解决方案 ( 指定 APK 打包动态库的 CPU 架构 ) 一.报错信息 外部引用 so 动态库 , 如果只有一个 armeabi-v7a 的动态库 , 那么如果在 arm ...

  3. 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )

    文章目录 一.报错信息 二.解决方案 ( Android Studio 配置外部 so 动态库两种方法 ) 1.jniLibs 目录存放 2.libs 目录存放 一.报错信息 外部引用 so 动态库 ...

  4. 【错误记录】Android NDK 错误排查记录 ( java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader )

    文章目录 一. 报错信息 二. 错误分析 三. 报错时使用的 Gradle 和 Gradle 插件版本的配置 四. 修改方案 五. 总体分析 一. 报错信息 报错信息 : 2020-06-14 12: ...

  5. Android java.lang.UnsatisfiedLinkError

    原文链接:http://blog.csdn.net/greenmemo/article/details/51777140 项目中使用sqlcipher加密数据库,使用了so库,模拟器运行的时候报错,换 ...

  6. android ndk程序UnsatisfiedLinkError解决方案

    1.UnsatisfiedlinkError:dll名称.说明dll没有放到合适的位置.对于Android开发,我们一般把so放在libs目录下,但是还是会出现这个错误.根本原因System.load ...

  7. android通过Jni加载so库遇到UnsatisfiedLinkError问题!!!

    错误信息: java.lang.UnsatisfiedLinkError: hsl.p2pipcam.nativecaller.NativeCaller at hsl.p2pipcam.manager ...

  8. Android之解决java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has text relocations

    1.问题 项目导入别人的so,有个项目没问题,但是这个有问题,运行提示这个错误 java.lang.UnsatisfiedLinkError: dlopen failed: ××××.so: has ...

  9. 关于android某些手机java.lang.UnsatisfiedLinkError: No implementation found for ......的问题

    最近手上的一个项目,用了很多第三方库,也有一些调用C++库的内容. 过程当中遇到了java.lang.UnsatisfiedLinkError这样的问题.之前没有遇到过,而且是部分手机的问题,耗费了一 ...

  10. 推荐两个Android模拟器,轻松解决模拟器调试java.lang.UnsatisfiedLinkError: dlopen failed~~

    转载请声明出处:http://blog.csdn.net/u013067166/article/details/52155380         导读:不知道大家有没有做过JNI开发.地图开发等等,在 ...

最新文章

  1. Java Web项目配置环境搭建-如何增加Tomcat服务 Tomcat[内含Tomcat7资源]
  2. 用python画小猪佩奇(非原创)
  3. 测试使用2mH的工字型电感在接收150kHz导航信号中性能
  4. php拆分数字字符串方法
  5. 实现1-2+3-4+5-6+…+99-100的算法的程序
  6. 浪潮之巅-读书笔记一
  7. Opencv之缺少api-ms-win-downlevel-shlwapi-l1-1-0
  8. 使用openssl库实现RSA、AES数据加密
  9. 单例模式(学习小记)
  10. LED显示屏智能化监控运维管理解决方案
  11. TeamViewer正版许可证到底多少钱?
  12. 【Matlab函数知识点合集】新手入门第十四天
  13. 程序员写简历的注意事项
  14. unity帧动画事件多次播放
  15. 农历 java_公历农历互相转换的Java日历工具类详解
  16. 2021年焊工(初级)最新解析及焊工(初级)找解析
  17. 惠普打印机故障代码_HP打印机故障代码
  18. HBase --------- 深入了解HBase架构(架构组建及HBase工作原理)
  19. 如何解决百度云下载大文件限速问题
  20. tunnel和channel区别

热门文章

  1. linux卸载exe文件怎么恢复,linux中误删除程序包恢复实例
  2. 机器学习可解释性之shap模块的使用——基础用法(一)
  3. 卸载IE9重装IE9无法安装的原因及解决方法
  4. Logistic Regression - IBM 员工离职预测
  5. 【leetcode】Reaching Points
  6. pycharm2019+破解补丁
  7. 射灯安装方法图解_射灯安装图解
  8. 又是一江春水自东流!
  9. 《关键对话,如何高效能沟通》读书笔记(上)
  10. 苹果mac系统隐藏文件的显示和取消显示