京东6.18刚买的华硕U305UA笔记本,然后倒腾ElementaryOS,结果发现触摸板不好用,升级linux内核后可以用了但是手势不好用,最后装了Ubuntu16.04就好使了,但是,又偶然的发现屏幕大范围的漏光,加上底部垫脚不平的问题,所以又换了一台,满满的期待这台能够解决问题,结果发现新换的这台竟然是别人用过退货的,我勒个去,果断退货了,想买macbook pro,结果发现活动结束了,macbook pro又恢复了原价...
想买个笔记本真难啊,当然土豪就另说了,想买什么就买什么。
不知不觉又扯淡了...
最近Google的更新很频繁啊,每次打开Android Studio的时候总会有更新,但是自从更新到2.1.2之后,每次编译运行项目的时候总会崩溃,报找不到so库的异常。
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.example.demo-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.demo-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "libstlport_shared.so"
其实应该就是jniLibs文件夹下面的so库加载出错了,由于项目比较宽泛,jniLibs只有armeabi这样一个文件夹,并没有armeabi-v7a,arm64-v8a, x86, x86_64, mips, mips64这几个文件夹,因为所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,所以理论上只需要在armeabi文件夹中放置所有的.so文件就可以了。
在一个设备上安装应用后,只有该设备支持的CPU架构对应的文件夹中的.so文件才会被安装和加载。例如,在arm64设备上,jniLibs/arm64-v8a/目录中如果存在.so文件的话,就会被安装,如果不存在.so文件的花,就会选择armeabi-v7a中的.so文件,如果该文件夹下也不存在的话,就会选择默认的.so文件,也就是armeabi文件夹下的.so文件。
知道原因了也就知道怎么解决了:
- 要么在每个文件夹下都编译对应CPU架构的.so文件(不能简单的把armeabi目录中的文件拷贝到对应的文件夹中,否则会出现
java.lang.UnsatisfiedLinkError: dlopen failed: "libxxx.so" is 32-bit instead of 64-bit
的异常); - 上面的做法比较痛苦,不同的CPU都要编译一遍,如果这个库没有开源也没有对其他平台做支持的话,那就只能呵呵了,所以建议采用如下做法:
a) 在项目中添加gradle.properties
文件,写入:
android.useDeprecatedNdk=true
b) 在build.gradle
中加入如下代码:
defaultConfig {
ndk {
// 加了其他的文件夹(比如 armeabi-v7a,x86等)可能会出问题
abiFilters "armeabi"
}
}
遇到同样问题的小伙伴如果上面两种方法都不能解决问题的话,那就自行Google吧。