今天遇到一個坑,項目里之前有jni庫的支持,原本運行正常,在導入Realm后運行時提示找不到so庫 報錯信息如下:
java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com..-1/base.apk"],nativeLibraryDirectories=[/data/app/com..-1/lib/arm64, /data/app/com..-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]]] couldn't find "****.so"
1.分析問題:
查看日志可得知,應用在運行時去加載本地動態(tài)鏈接庫時發(fā)現(xiàn)找不到,而這個路徑很明顯是arm64和arm64-v8a,指明我的手機是arm64位的,并且我的項目中包含這個arm64的動態(tài)鏈接庫文件夾,當需要加載本地庫時系統(tǒng)會找到這個文件夾里,但是發(fā)現(xiàn)并沒有,于是報錯。
2.跟蹤問題:
觀察我原來的項目中其他的動態(tài)鏈接庫,發(fā)現(xiàn)只有armeabi、armeabi-v7a和x86,確實沒有arm64,但是也并沒有arm64的動態(tài)鏈接庫文件夾,查看build文件:

發(fā)現(xiàn)原來是realm有這個版本的so庫,問題就是realm的多版本so庫所導致的。
3.解決辦法
如果手動把realm重新編譯 去除這個so庫是可以的,但是太過復雜,依靠我們強大的gradle進行打包配置即可。
在對應的build.gradle的android{}中添加如下代碼即可完美解決:
packagingOptions { exclude "lib/arm64-v8a/librealm-jni.so"}