接觸到過Jni的童鞋們應該看著個crash會比較眼熟,對,就是so文件找不到,而引發的錯誤。
“java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader..............couldn't find "xxxxxxx.so"”
當時遇到這個問題是我很疑惑,報錯報的是外部項目的so文件找不到(這里簡稱外so),AAR里的so文件(這里簡稱內so)卻沒有報錯,可我確實在引入了這個AAR之后,編譯生成的APK報錯了。
第一個想法:會不會是本身gradle本身不支持編譯生成APK時將內so文件打包進APK呢?
跟著我就去谷歌大法了一波,結果還真的在某些gradle版本里是不支持打包的,需要自身在外部項目里加入內so。ANDROID動態加載 使用SO庫時要注意的一些問題?但有個問題,我這邊是最新你的gradle,而且報錯報的是外so找不到,那就pass掉了這種可能。但我還是嘗試性地將內so復制到外部的lib里去編譯了一遍,徒勞。。。。
第二個想法:會不會是so文件重名了?
顯然不會,我還不至于在這個問題上折騰那么久。
那么問題來了,到底是什么原因呢?
通過分析crash日志,我發現一個問題:
nativeLibraryDirectories=[/data/app/xxx-1/lib/arm64, /data/app/xxx-1/base.apk!/lib/arm64-v8a, /vendor/lib64, /system/lib64]
我外部的lib里并沒有那么多文件夾啊!!!!
這個就是crash的原因所在了。
當AAR內部的so文件類型比外部多時,會導致外部的so文件找不到。
所以果斷的剔除了AAR中不需要的so文件夾“arm64”,“arm64-v8a”,“x86”。
再次編譯,OK,齊活了。88,希望能幫助到你們。