ffi实战-使公司flutter移动应用不再依赖原生网络库
大约 2 分钟
ffi实战-使公司flutter移动应用不再依赖原生网络库
ffi介绍
Dart 2.5 已经开始,增加了dart:ffi 外部函数接口,用于直接从 Dart 调用 C 代码。
由于原生应用会涉及到C层调用,ffi的产生,就可以实现flutter底层跨平台,摆脱对原生应用原生库的依赖,从而减少flutter和原生项目的交互。
eg: 本文就是将网络请求彻底采用flutter和C实现,获取和加密网络参数不再通过ios或者android的原生网络库获取
参考链接
项目地址
- 1. Demo地址
- 2. C语言实现地址
- 3. 教资项目地址公司内部项目,不方便展示
一、Demo模拟调用(根据参考链接实现了项目)
项目地址:见项目地址1
Demo运行步骤:
- 配置ndk路径
- android 运行主脚本生成相关so ./build_android.sh
- ios 运行主脚本生成动态库,启动项目需要注意是否依赖,android也需要注意
遇到的大小坑
- ios运行失败 需要添加动态库
- ffi/dart导入 Utf8 需要增加依赖
- android运行失败,需要主动配置jni路径,或者将包拷贝的项目默认jni路径上
- 加上app_id字段后拼接的字符异常,申请的内存地址少了security_key长度
- 无缘无故拼接的字符串前面多了个空格,导致md5后跟demo的不一样
- 无缘无故拼接的字符异常,申请的内存地址没有memset进行初始化 ,这应该也是5的原因
- 运行ios时报detected buffer overflow ,md5文件数组申请位数少了
二、实战模拟 公司登陆校验
1、C语言生成加密字段
项目地址: 将java代码用c写出来,并用ffi进行调用 ,具体参考项目地址:见项目地址2
public final static String generateNormalizedString(Map<String, String> paramMap,String sigParamKey) {
Set<String> params = paramMap.keySet();
List<String> sortedParams = new ArrayList<String>(params);
Collections.sort(sortedParams);
StringBuilder sb = new StringBuilder();
for (String paramKey : sortedParams) {
if (paramKey.equals(sigParamKey)) {
continue;
}
//参数值只取前50个字符
sb.append(paramKey).append('=')
.append(StringUtils.substring(paramMap.get(paramKey), 0, 50));
}
return sb.toString();
}
2. 教资App Flutter版集成ffi
见项目地址3