android N : UnsatisfiedLinkError
来源:互联网 发布:淘宝有好货文案兼职 编辑:程序博客网 时间:2024/05/08 07:47
在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
- android UnsatisfiedLinkError错误
- android ndk UnsatisfiedLinkError 错误
- Android java.lang.UnsatisfiedLinkError
- android ndk程序UnsatisfiedLinkError解决方案
- android ndk程序UnsatisfiedLinkError解决方案
- android ndk程序UnsatisfiedLinkError解决方案
- android java.lang.UnsatisfiedLinkError: 异常
- android ndk程序UnsatisfiedLinkError解决方法
- java.lang.unsatisfiedlinkerror(Android)
- android studio java.lang.UnsatisfiedLinkError
- Java.lang.UnsatisfiedLinkError android studio
- Android java.lang.UnsatisfiedLinkError错误
- android UnsatisfiedLinkError及后续错误
- Android Studio java.lang.UnsatisfiedLinkError
- UnsatisfiedLinkError
- Android报错android java.lang.UnsatisfiedLinkError:
- Android 百度地图 java.lang.UnsatisfiedLinkError
- Zeldman年度设计箴言(2015)
- 按钮添加行
- Android: java.lang.NoSuchMethodeError: xxx.xxx.checkSelfPermission
- C语言error返回值简单列表
- kafka java api 消费入es
- android N : UnsatisfiedLinkError
- 基于运行时栈的状态机设计
- 使用Perl进行网页数据抓取[初学者简明版]
- 第五周 项目3 括号的匹配
- swift中UISlider的使用
- 准确判断ListView滑动到最底部的小技巧
- Neatbeans中JUnit4测试套件(TestSuite)的使用
- USB枚举过程
- Android service命令介绍