1. 程式人生 > >.so相容32位和64位

.so相容32位和64位

安卓的相容性是一個很令人頭疼的問題,這幾天又遇到了,還好還是解決了。

我遇到的問題是,我在網上下載了一個功能庫,裡面帶了一個xxx.so動態庫,問題它是32位的。但是,早兩天拿了一臺arm-64位的手機進行測試時,發現它居然崩潰了!淚崩了好久...

起初報錯資訊是:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.xxx.xxx-1/base.apk"],nativeLibraryDirectories=[/data/app/com.xxx.xxx-1/lib/arm64, /vendor/lib64, /system/lib64]]] couldn't find "xxx.so",

主要是說找不到這個64位的xxx.so庫,好吧,我確實沒有建arm64-v8a資料夾,更別說是裡面還要放一個64位的xxx.so庫了。

算了,還是建一個arm64-v8a資料夾,把xxx.so庫拷貝進去。然後,然後還是崩潰了。。。

報錯資訊是:
java.lang.UnsatisfiedLinkError: dlopen failed: "/data/app/com.xxx.xxx-2/lib/arm64/xxx.so" is 32-bit instead of 64-bit
at java.lang.Runtime.loadLibrary(Runtime.java:371)
at java.lang.System.loadLibrary(System.java:988)

果然這麼直接暴力是不行的,xxx.so是個該死的32位的庫,問題是當初我找到這個庫的時候,就只有這麼一個庫,我去哪找個64位的來呀?我都沒有c++的原始檔!
然後只能百度啊,谷歌了。。。爬了會帖子發現,最多的是然你配置NDK編譯條件,Android.mk LOCAL_MULTILIB := 32,哎,悲傷了好久。。。
不過,幸運的我還是找到了解決的辦法:
1.在build.gradle中配置如下:
android {
    ...
defaultConfig {
....
ndk {
moduleName"native"
abiFilters"armeabi","armeabi-v7a","x86","mips"

}
    }
    ...
}

2.在gradle.properties中配置android.useDeprecatedNdk=true。(android的A是小寫a的,CSDN會自動修改)開始迷糊了半天,專案中怎麼沒有這個檔案呢?為啥別人的專案中都有,看了下同事的專案,一樣的沒有。然後查了下,原來是用來配置變數引數的,好吧,那就新建一個吧。

然後就搞定啦!