京東6.18剛買的華碩U305UA筆記本磕诊,然后倒騰ElementaryOS填物,結(jié)果發(fā)現(xiàn)觸摸板不好用,升級(jí)linux內(nèi)核后可以用了但是手勢(shì)不好用霎终,最后裝了Ubuntu16.04就好使了滞磺,但是,又偶然的發(fā)現(xiàn)屏幕大范圍的漏光莱褒,加上底部墊腳不平的問(wèn)題击困,所以又換了一臺(tái),滿滿的期待這臺(tái)能夠解決問(wèn)題,結(jié)果發(fā)現(xiàn)新?lián)Q的這臺(tái)竟然是別人用過(guò)退貨的阅茶,我勒個(gè)去蛛枚,果斷退貨了,想買macbook pro脸哀,結(jié)果發(fā)現(xiàn)活動(dòng)結(jié)束了蹦浦,macbook pro又恢復(fù)了原價(jià)...
想買個(gè)筆記本真難啊,當(dāng)然土豪就另說(shuō)了撞蜂,想買什么就買什么盲镶。
不知不覺(jué)又扯淡了...
最近Google的更新很頻繁啊,每次打開(kāi)Android Studio的時(shí)候總會(huì)有更新蝌诡,但是自從更新到2.1.2之后溉贿,每次編譯運(yùn)行項(xiàng)目的時(shí)候總會(huì)崩潰,報(bào)找不到so庫(kù)的異常浦旱。
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"
其實(shí)應(yīng)該就是jniLibs文件夾下面的so庫(kù)加載出錯(cuò)了宇色,由于項(xiàng)目比較寬泛,jniLibs只有armeabi這樣一個(gè)文件夾闽寡,并沒(méi)有armeabi-v7a代兵,arm64-v8a, x86, x86_64, mips, mips64這幾個(gè)文件夾,因?yàn)樗械膞86/x86_64/armeabi-v7a/arm64-v8a設(shè)備都支持armeabi架構(gòu)的.so文件爷狈,所以理論上只需要在armeabi文件夾中放置所有的.so文件就可以了植影。
在一個(gè)設(shè)備上安裝應(yīng)用后,只有該設(shè)備支持的CPU架構(gòu)對(duì)應(yīng)的文件夾中的.so文件才會(huì)被安裝和加載涎永。例如思币,在arm64設(shè)備上,jniLibs/arm64-v8a/目錄中如果存在.so文件的話羡微,就會(huì)被安裝谷饿,如果不存在.so文件的花,就會(huì)選擇armeabi-v7a中的.so文件妈倔,如果該文件夾下也不存在的話博投,就會(huì)選擇默認(rèn)的.so文件,也就是armeabi文件夾下的.so文件盯蝴。
知道原因了也就知道怎么解決了:
- 要么在每個(gè)文件夾下都編譯對(duì)應(yīng)CPU架構(gòu)的.so文件(不能簡(jiǎn)單的把a(bǔ)rmeabi目錄中的文件拷貝到對(duì)應(yīng)的文件夾中毅哗,否則會(huì)出現(xiàn)
java.lang.UnsatisfiedLinkError: dlopen failed: "libxxx.so" is 32-bit instead of 64-bit
的異常); - 上面的做法比較痛苦捧挺,不同的CPU都要編譯一遍虑绵,如果這個(gè)庫(kù)沒(méi)有開(kāi)源也沒(méi)有對(duì)其他平臺(tái)做支持的話,那就只能呵呵了闽烙,所以建議采用如下做法:
a) 在項(xiàng)目中添加gradle.properties
文件翅睛,寫(xiě)入:
android.useDeprecatedNdk=true
b) 在build.gradle
中加入如下代碼:
defaultConfig {
ndk {
// 加了其他的文件夾(比如 armeabi-v7a,x86等)可能會(huì)出問(wèn)題
abiFilters "armeabi"
}
}
遇到同樣問(wèn)題的小伙伴如果上面兩種方法都不能解決問(wèn)題的話,那就自行Google吧捕发。