FlutterとC/C++通信

2962 ワード

1.前言:
会社の戦略調整による.IOSとandroidスタッフは十分に発揮する必要があります.議論の結果はフラッシュ(主に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データとよく付き合います.そこで今回はInt 8の配列を例にとりましょう.
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]}");
  }

}