ffi实战-使公司flutter移动应用不再依赖原生网络库

东方盛慧科技大约 2 分钟flutterflutter

ffi实战-使公司flutter移动应用不再依赖原生网络库

ffi介绍

Dart 2.5 已经开始,增加了dart:ffi 外部函数接口,用于直接从 Dart 调用 C 代码。

由于原生应用会涉及到C层调用,ffi的产生,就可以实现flutter底层跨平台,摆脱对原生应用原生库的依赖,从而减少flutter和原生项目的交互。

eg: 本文就是将网络请求彻底采用flutter和C实现,获取和加密网络参数不再通过ios或者android的原生网络库获取

参考链接

项目地址

一、Demo模拟调用(根据参考链接实现了项目)

项目地址:见项目地址1

Demo运行步骤:

  1. 配置ndk路径
  2. android 运行主脚本生成相关so ./build_android.sh
  3. ios 运行主脚本生成动态库,启动项目需要注意是否依赖,android也需要注意

遇到的大小坑

  1. ios运行失败 需要添加动态库
  2. ffi/dart导入 Utf8 需要增加依赖
  3. android运行失败,需要主动配置jni路径,或者将包拷贝的项目默认jni路径上
  4. 加上app_id字段后拼接的字符异常,申请的内存地址少了security_key长度
  5. 无缘无故拼接的字符串前面多了个空格,导致md5后跟demo的不一样
  6. 无缘无故拼接的字符异常,申请的内存地址没有memset进行初始化 ,这应该也是5的原因
  7. 运行ios时报detected buffer overflow ,md5文件数组申请位数少了

二、实战模拟 公司登陆校验

Alt
Alt

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

上次编辑于:
贡献者: 雷勋