Flutter和C/C++通信

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( Pointer data,int length) allCount = nativeAddLib
    .lookup,Int32)>>("allCount").asFunction()
static int allCoutWithCpp(List source){
     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 Pointer Function() getData = nativeAddLib.lookup< NativeFunction< Pointer Function()>>("getData").asFunction();

 

static void getDataWithCpp()
{
  Pointer result =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]}");
  }

}

 

你可能感兴趣的:(Flutter_)