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を主として、その他は類似しています
基礎知識、直接コードをつけましょう
メソッド宣言
メソッド呼び出し:
これは公式のDEMOの書き方で、何も言うことはありません.正常に走ることもできます.
2.2 Flutter入力配列パラメータ
説明:うちの会社はbyte、charデータとよく付き合います.そこで今回はInt 8の配列を例にとりましょう.
C++のコード
Flutterのコード
//allocateこの方法は、ffiからcopyが出てくるファイルが必要です.後でallocateをアップロードします.
実行結果OK.検証に合格しました.
2.3 Flutter returnポインタ.
これは穴に出会って、配列を返して、得られた値はずっと間違っています.なぜなら、ローカル配列は、メソッドの実行が完了すると回収されるからです.ポインタの方式に変更します.
Flutterのコード
会社の戦略調整による.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]}");
}
}