报的错是加载的so库找不到,我的项目module是A,引用了moduleB作为library,而这个so库在moduleB中
先上现象:
项目两个月前已经完成了,当时我只是在别人代码的基础上加了个小功能,过了两个月又需要我重新编译个版本,恰巧我以前没有编译一个版本备份,恰巧资讯科的同事误把我的账号给删了后又帮我把电脑重新换了个系统,恰巧我的项目是保存在C盘桌面上被Copy到了E盘,恰巧我把我的SDK编译工具和各种版本更新到了最新,结果打开项目,编译成功了,运行时却报了上边的错。
然后我不断试,不断Clean,不断Rebuild,结果还是不行,每次都是这个错
“java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.ion360u.vr.panodemo-2/base.apk"],nativeLibraryDirectories=[/data/app/com.ion360u.vr.panodemo-2/lib/arm64, /system/fake-libs64, /data/app/com.ion360u.vr.panodemo-2/base.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libion360uvr.so"”,试的次数太多,我都要崩溃了,主要是以前都没有问题,代码也没改,就编译工具的版本升到了3.0.1,还报了错,主要原因是libion360uvr.so这个库找不到。
最终在https://stackoverflow.com/questions/27186726/java-lang-unsatisfiedlinkerror-dalvik-system-pathclassloader找到了解决方案,现在对StackOverFlow真的是大爱啊。
说白了就是有些Android设备有64位进程,每次加载本地库的时候会先找到arm64的文件夹来编译,而项目中并没有arm64的文件夹,所以就报了错。
按照这个方法进行修改:
1.在gradle中添加过滤条件,NDK只用存在的文件夹,这样gradle编译的时候就会先编译NDK中包含的库文件夹,而不是所有的;
2.在gradle.properties中添加:
android.useDeprecatedNdk=true
这句话的意思应该是降低NDK,就是指在加载library时用gradle配置中过滤的文件夹中的so库来编译。
3.多clean几遍
可是还是不行,没办法,我把这个so库复制了一份放到moduleA的jniLibs下,试了还是不行,真的已经崩溃了,我重新复制了下以前的项目,按照以上的步骤配置了下,试了好多次,居然成功了,对比了下两个项目的gradle,我发现我无意之间在moduleA的gradle中添加了
compile 'com.android.support:support-v4:26.1.0'
即添加了support v4包的支持,项目中一直用的是support v7包,于是我把support v4包这句注销了,最终发现运行没有报错了。
最终问题解决了,发现也就上边的几步,可是却耽误了我两天的时间,记录下来,以供下次参考。