note_40:加载aar中的so失败
加载aar中的so失败
参考:
- FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
- Android7.0加载.so文件报UnsatisfiedLinkError异常解决
- 优化ApK大小之ABI Filters 和 APK split
- Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解
- More than one file was found with OS independent path ‘lib/arm64-v8a/libsqlite.so’
1. 导入aar的apk
(1) 先clean再build;invalidate cache and restart;build两次
(2) 导入的aar的名字或版本号写错
(3) 在proguard-rule.pro加上aar里面调用System.loadLibrary()
的类
一个可能的情况是,aar里面调用System.loadLibrary
的那个类被混淆了。
(4) 资源被压缩
如果报FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed,那么aar的res
目录下有一个raw
的文件夹或者有assets
目录,里面放着资源,这些资源在被打包的时候可能会被压缩。仅仅在aar的build.gradle的aaptOptions
设置noCompress
还不够,还要引入这个aar的app的build.gradle里面写。参照FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed。
2. aar
假设Android.mk
、.aidl
、CMakeLists
、native-cpp
、jni
目录下的代码……这些文件都没问题。
(1) 资源被压缩
如果报FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed,那么aar的res
目录下有一个raw
的文件夹或者有assets
目录,里面放着资源,这些资源在被打包的时候可能会被压缩。参照FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed,在aar的build.gradle的aaptOptions
设置noCompress
。
(2) so文件放的地方
so文件默认放的地方是和src.main.java
同级的jniLibs
。如果放到了别的地方,例如libs
的话,就需要在build.gradle里面写清楚。
以libs为例
android {
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
api fileTree(dir: 'libs', include: ['*.so'])
}
(3) defaultConfig配置ndk框架
aar里面是要引用so文件的,如果不配置ndk
框架,就有可能报Android7.0加载.so文件报UnsatisfiedLinkError异常解决。so文件分了多少种类型,那么abiFilters
里面就要写多少种。如果很确定有一些类型不会用到的话,那么可以把这些目录下的so文件删掉,abiFilters
里面也不用写。
例如,
defaultConfig {
ndk {
// moduleName就是loadLibrary里面填写的so的名称
// 正常情况下需要去掉开头的lib
// 不过因为Android.mk里面是有配置moduleName的
// 所以这里写不写或者写错了也不会有影响
moduleName "jni_myso"
abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "mips", "mips64", "x86", "x86_64"
}
}
如果这个so库是在当前这个aar里面对jni进行打包而弄出来的话,这个时候务必重新ndk-build
,否则abiFilters
里面的更改会无效。如果是自己在别的地方打包的话,那么需要重新改那个地方的build.gradle
以及重新ndk-build
。
关于abiFilters
可以参考优化ApK大小之ABI Filters 和 APK split和Android Studio gardle 配置 ndk 指定 ABI: abiFilters 详解。
(4) 在proguard-rule.pro加上aar里面调用System.loadLibrary()
的类
一个可能的情况是,调用System.loadLibrary
的那个类被混淆了。
More than one file was found with OS independent path
极有可能是引用的模块或者各种包有冲突或者重复。
More than one file was found with OS independent path ‘lib/arm64-v8a/libsqlite.so’
More than one file was found with OS independent path ‘protobuf.meta’
More than one file was found with OS independent path 'lib/armeabi-v7a/libcardioDecider.so #186
本文地址:https://blog.csdn.net/S_u_mm_er/article/details/108807867
上一篇: fastdfs文件上传
推荐阅读
-
Android中替换WebView加载网页失败时的页面
-
js中图片加载失败,显示默认图片的问题如何解决?
-
note_40:加载aar中的so失败
-
html - mac中php加载smarty模板失败,有没有可能是php.ini设置的问题?
-
html - mac中php加载smarty模板失败,有没有可能是php.ini设置的问题?
-
IE及IE6浏览器中判断JS文件加载成功失败的方法_javascript技巧
-
js中图片加载失败,显示默认图片的问题如何解决?
-
IE及IE6浏览器中判断JS文件加载成功失败的方法_javascript技巧
-
解决父页面加载iframe时,src链接中参数值过大导致加载失败的问题_html/css_WEB-ITnose
-
打开php.ini文件中的 error_reporting选项导致mysql扩展加载失败