dart/flutter:使用 ffi 从 C/C++ 获取数据数组?

kak*_*kyo 4 c++ language-interoperability dart flutter

通过 ffi 的 C/C++ 互操作的官方 flutter 教程只涉及调用 C++ 函数和获取单个返回值。

目标

如果我在 C/C++ 端创建了一个数据缓冲区,但想传递到 dart/flutter 端显示怎么办?

问题

根据@MilesBudnek 的提示,我正在通过尝试从 Dart 到 C/C++ 进行安全的内存释放来测试 Dart 的 FFI。测试重用了官方的 struct sample

我可以将 Array 作为 dart 获取Pointer,但我不清楚如何轻松地将数组迭代为集合。

代码

我正在实现一个像这样的 Dart 端 C 数组绑定:

struct.h

struct Array
{
    int* array;
    int len;
};
Run Code Online (Sandbox Code Playgroud)

和一对简单的分配/解除分配测试函数:

struct Array* get_array();
int del_array(struct Array* arr);
Run Code Online (Sandbox Code Playgroud)

然后在 Dart 端structs.dart

typedef get_array_func = Pointer<Array> Function();
typedef del_array_func = void Function(int arrAddress);

...

  final getArrayPointer = dylib.lookup<NativeFunction<get_array_func>>('get_array');
  final getArray = getArrayPointer.asFunction<get_array_func>();
  final arrayPointer = getArray();
  final array = arrayPointer.ref.array;
  print('array.array: $array');
Run Code Online (Sandbox Code Playgroud)

这给了我打印出来

array.array: Pointer<Int32>: address=0x7fb0a5900000
Run Code Online (Sandbox Code Playgroud)

我可以List轻松地将数组指针转换为 a吗?就像是:

final array = arrayPointer.ref.array.toList();
array.forEach(index, elem) => print("array[$idx]: $elem");
Run Code Online (Sandbox Code Playgroud)

======

老问题(你可以跳过这个)

问题

我不清楚如何通过 dart/flutter 从 C/C++ 检索这种矢量数据。

可能的解决方案

更重要的是,如何从C++端从各个线程推送数据?如果没有内置支持,我就需要实现一些通信方案。

选项#1:网络

我可以通过 TCP 套接字进行网络连接。但如果有更简单的解决方案,我不愿意去那里。

选项 #2:文件 I/O

使用 C/C++ 将数据写入文件,并让 dart/flutter 轮询文件并流式传输数据。这不是实时友好的。

那么,还有更好的选择吗?

kak*_*kyo 6

解决了。

根据这个问题,API asTypedList是要走的路。

这是对我有用的代码

  final getArrayPointer = dylib.lookup<NativeFunction<get_array_func>>('get_array');
  final getArray = getArrayPointer.asFunction<get_array_func>();
  final arrayPointer = getArray();
  final arr = arrayPointer.ref.arr;
  print('array.array: $arr');
  final arrReal = arr.asTypedList(10);
  final arrType = arrReal.runtimeType;
  print('arrReal: $arrReal, $arrType');
  arrReal.forEach((elem) => print("array: $elem"));
Run Code Online (Sandbox Code Playgroud)

这给了我:

array.array: Pointer<Int32>: address=0x7f9eebb02870
arrReal: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], Int32List
array: 0
array: 1
array: 2
array: 3
array: 4
array: 5
array: 6
array: 7
array: 8
array: 9
Run Code Online (Sandbox Code Playgroud)