转载请注明出处:https://blog.csdn.net/a512337862/article/details/90811375
前言
最近,因为项目需要开始接触Flutter。简单了解了一下语法之后,准备先将一个aar文件导入新建的Flutter文件。结果其中的坎坷让人不忍直视,好歹最终还是成功了。这里简单的写个博客,纪录一下。(开发环境:AndroidStudio)
导入流程
导入aar文件没有太多的东西,简单写一下流程,放一下截图。
-
File > New > New Module 或者 项目根目录 右键 > New > Module
-
Import .JAR/.AAR Package>Next
-
选择arr文件,设置module 名称。
-
**到这里,fllutter app下会自动生产一个module,里面包含你导入的aar文件和一个build.gradle文件。但是,这样导入的arr文件,我在android中没办法直接引用,所以只能把这个module拷贝到android目录下。**如果有人知道原因和解决办法,希望能留言指导。
-
修改android目录下,setting.gradle和android/app下build.gradle,在setting.gradle中添加include ‘:<moudleName>’,在build.gradle引用这个Moudle,这个和Android开发一致。
这样导入后,如果aar中没有jni调用,基本上也就可以使用了。但是还是有一个我至今无法解决的问题:导入aar之后,Android中的代码提示和自动补全就完全没有办法用了,所以代码都只能手敲。 google,百度了好久都没没办法解决,希望知道原因和解决办法能留言。
jni相关
如果aar中存在jni相关的代码,可能还会碰到一些奇怪的问题,下面纪录一下我碰到的问题已经解决办法。
java.lang.UnsatisfiedLinkError: No implementation found for XXXXX
这里表示,你的aar文件中没有对应的so文件。可以重新编译aar支持armeabi-v7a,或者修改flutter项目中的android/app/build.gradle文件,使其支持对应的arm。因为我的aar中只支持armeabi,修改如下图,根据实际需求进行修改:
couldn’t find “libflutter.so”
如果修改flutter项目中的android/app/build.gradle文件“abiFilters”,可能会出现这个问题,是因为flutter中并没有将对应libflutter.so打包到apk中。解决办法:
- 修改android/app/build.gradle,删除 ndk {abiFilters “XXX”}或者修改为 ndk {abiFilters “armeabi-v7a”},这个方法只能在aar没有jni或者jni支持armeabi-v7a时可以使用。
- 找到flutter sdk文件夹,在<flutter sdk>\bin\cache\artifacts\engine文件夹中会有多个android-armXXX文件夹,对应了各个arm,找到自己项目中对应arm,解压其中的flutter.jar,能找到对应的flutter.so,并把它拷贝到你的项目jniLibs中,就OK了。
UnsatisfiedLinkError: dlopen failed: XXX has unexpected e_machine: 3
这里的报错原因就是因为上方解压的flutter.jar获取的flutter.so和项目中的支持的arm是不对应的,重新选择正确的即可。
参考资料链接
https://github.com/flutter/flutter/issues/18939
https://github.com/flutter/flutter/issues/18494
https://www.jianshu.com/p/bad29e18c8e2
https://juejin.im/post/5c3444116fb9a049e6606bc4
https://juejin.im/post/5c2260e9e51d45778a5c8cd2