出現原因
RT,在Andoridsutdio中調用.so庫出現如現標題所示錯誤,該怎么解決。首先出現這個錯誤的原因是因為你的cpu架構是64位的。而你的.so庫在編譯的時候沒有支持64位cpu。** 經@lolstudio 提醒, 如果這個.so的庫是你自己弄的,那你重新生成下支持64位cpu的.so庫出來就行了,剩下的文字就不用看了,本文適用于你沒法對.so做操作的朋友。** 查看cpu架構,可以通過adb shell 命令。進入/system/目錄下有一個build.prop文件,這個里面有一行 ro.product.cpu.abi=xx就是你所要的信息,具體命令如下:
adb shell
cd /system
cat build.prop
apk包在安裝的時候,系統會把包中與自己的abi對應的lib目錄中的so庫文件拷貝到system分區中,32位機器中只有一個目錄/system/lib,64位機器中有兩個目錄/system/lib和/system/lib64,app啟動進行鏈接時,64位機器中會先到/system/lib64目錄中去找,這時候肯定找不到。如果沒有找到再到/system/lib目錄中去找。如果你把32位的so庫拷貝到了lib64目錄中,會導致鏈接失敗,同樣,64位的so庫被拷貝到lib目錄中也會導致失敗,所以so庫要和目錄一一對應。
解決方案
首先我的目錄結構是這樣的:
我的.so并沒有放在新建的jniLibs目錄中,這個關系應該不大,兩種方式都可以。
我的cpu架構是 ro.product.cpu.abi=arm64-v8a
而我的只有一個CPU架構就是armebi-v7a,我們要做的就是阻止生成arm64-v8a;
正常情況打開apk的lib結構如下:
方案如下:
- 首先在project目錄下的 gradle.properties中添加一句
android.useDeprecatedNdk=true - 在app的build.gradle中的defaulConfig下添加如下:
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
這時候你解壓開生成的apk包,會發現目錄lib結構如下:
OK,這樣就解決了我的這個問題,網絡上有一些別的阻止生成arm64-v8a,但是不好使。