赞
踩
错误分析:
加载.so包报错,在这个错误后面一般还会跟一串路径,在这个路径下面没有找到当前需要的.so包.一般是程序在运行过程中调用System.loadLibrary(“xxxxxxxx”)的时候报错的.
解决思路:
检查自己是不是把libxxxxxx.so文件放在正确的位置,然后重新打包。
so包放的位置分为两种,一种是放在libs文件夹下面(一般是兼容以前的Eclipse的工程),一种是放在jniLibs文件夹下(现在用AndroidStudio新建的工程一般都是这种).
放在libs文件夹的要在在model下的build.gradle中的android内添加以下代码:
- sourceSets {
- main {
- jniLibs.srcDirs = ['libs']
- }
- }
放在jniLibs文件夹的不需要以上操作,但是一定要注意文件的位置有没有放对地方,jniLibs文件夹要新建在工程main目录下,其他地方就要上述操作指定位置了.
上述操作完后还是继续报错.查看NDK是不是排除了你的设备架构,看你的代码里是否添加了如下代码:
- android {
- defaultConfig {
- ........//此处省略其他设置
- ndk {
- abiFilters "armeabi"
- }
- }
- }
这个设置就是只加载armabi架构(目录下)的so库,如果是别的架构,就会找不到。
解决:
可以添加自己需要的架构,这样做的好处是apk体积可以变小代码.
放置 .so 文件的正确姿势:
• 为了减小 apk 体积,只保留 armeabi 和 armeabi-v7a 两个文件夹,并保证这两个文件夹中 .so 数量一致
• 对只提供 armeabi 版本的第三方 .so,原样复制一份到 armeabi-v7a 文件夹
存放so的规则:
你应该尽可能的提供专为每个ABI优化过的.so文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个ABI目录提供对应的.so文件。
除了上述原因外还有可能是so库对应的架构不正确,这个就得找so库提供者了.
额外记录下加载so库的方法:
1.System.load(): 参数为库文件的绝对路径,可以是任意路径。
2.System.loadLibrary():参数为库文件名,不包含库文件的扩展名。在使用时去掉名字前面的lib和后面的.so
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。