1.前言:
由于公司战略调整。IOS和android人员需要充分发挥。讨论后的结果是转Flutter(主要是看Flutter招聘的人员挺多的。最开始也调研了QT,并且维护和开发过几个项目。发现QT用的人真心不多。唯一业内比较推广的项目QGC了,网站上招聘的也少。还有一个原因是QT大量用到了自己的API,虽然用到的是C++,但是对个人成长也是帮助不大。)
2.调研目的:Flutter和C/c++的交互,为以后使用Flutter开发C/C++项目做铺垫。
2.1.Flutter 传入基本参数,Flutter反馈基本参数,调研就以Int为主,其他类似
基础知识,直接上代码吧
方法声明
final DynamicLibrary nativeAddLib = Platform.isAndroid ? DynamicLibrary.open("libtestC.so") : DynamicLibrary.open("some.framework/some"); final int Function(int x, int y) nativeAdd = nativeAddLib .lookup>("native_add") .asFunction();
方法调用:
static int addWithCpp(int x, int y) { return nativeAdd(x, y); }
这个是官方的DEMO写法,没啥好说的。也能正常跑起来。
2.2 Flutter 传入数组参数,
说明:我们公司经常和byte,char数据打交道。所以此次就以Int8的数组为例子吧。
C++的代码
int32_t allCount(char data[] ,int length) { int32_t a = 0; for (int i = 0; i < length; ++i) { LOGE("=====%d",data[i]); a += data[i]; } return a; }
Flutter的代码
final int Function( Pointerdata,int length) allCount = nativeAddLib .lookup ,Int32)>>("allCount").asFunction()
static int allCoutWithCpp(Listsource){ Pointer soureData = allocate (count:source.length); final pointerList = soureData.asTypedList(source.length); pointerList.setAll(0, source); return allCount(soureData,source.length); }
//allocate这个方法,需要一个文件,从ffi里面copy出来的,稍后我会把allocate上传的
运行结果OK.验证通过。
2.3 Flutter return一个指针。
这个遇到一个坑,返回数组,得到的值一直不对。原因是:局部数组,方法执行完成后,会被回收。改成指针的方式。
c/C++的代码 char* getData() { if(data != nullptr ) { free(data); } data = (char *)malloc(4); *(data +0) = 100; *(data +1) = 101; *(data +2) = 102; *(data +3) = 103; LOGE("data address %lld,%d",&data[0],data); for (int i = 0; i <3; ++i) { LOGE("=========%d,%d",i,data[0]); } return data; }
Flutter的代码
final PointerFunction() getData = nativeAddLib.lookup< NativeFunction< Pointer Function()>>("getData").asFunction();
static void getDataWithCpp() { Pointerresult =getData(); final pointerList = result.asTypedList(4); for(int i = 0 ; i < 4 ; i ++ ) { var char = result.elementAt(i); int a = char.value; print("char:$char,,,$a"); print("数组===${pointerList[i]}"); } }