接触到过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,希望能帮助到你们。