dart/flutter:使用 ffi 从 C/C++ 获取数据数组?
dart/flutter: getting data array from C/C++ using ffi?
The official flutter tutorial on C/C++ interop through ffi 仅涉及调用 C++ 函数并获取单个 return 值。
目标
如果我在 C/C++ 端创建了一个数据缓冲区,但想传送到 dart/flutter-side 以显示怎么办?
问题
根据@MilesBudnek 的提示,我正在通过尝试将内存从 Dart 安全释放到 C/C++ 来测试 Dart 的 FFI。测试重用 the official struct sample .
我可以将数组作为飞镖 Pointer
,但我不清楚如何轻松地将数组作为集合进行迭代。
代码
我正在像这样实现 Dart 端 C 数组绑定:
在struct.h
struct Array
{
int* array;
int len;
};
和一对简单的allocation/deallocation测试函数:
struct Array* get_array();
int del_array(struct Array* arr);
然后在 structs.dart
中的 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');
这给我打印出来
array.array: Pointer<Int32>: address=0x7fb0a5900000
问题
我可以轻松地将数组指针转换为 List
吗?类似于:
final array = arrayPointer.ref.array.toList();
array.forEach(index, elem) => print("array[$idx]: $elem");
======
老问题(可以跳过)
问题
我不清楚如何通过 dart/flutter.C/C++ 从 C/C++ 检索这种矢量数据。
可能的解决方案
更重要的是,如何从各个线程推送C++端的数据?
如果没有内置支持,我会立即考虑实施一些通信方案。
选项 #1:网络
我可以通过 TCP 套接字进行网络连接。但如果有更简单的解决方案,我不愿意去那里。
选项 #2:文件 I/O
使用 C/C++ 将数据写入文件,然后让 dart/flutter 轮询文件并传输数据。这不是实时友好的。
那么,还有更好的选择吗?
解决了。
按照this issue, the 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"));
这给了我:
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
The official flutter tutorial on C/C++ interop through ffi 仅涉及调用 C++ 函数并获取单个 return 值。
目标
如果我在 C/C++ 端创建了一个数据缓冲区,但想传送到 dart/flutter-side 以显示怎么办?
问题
根据@MilesBudnek 的提示,我正在通过尝试将内存从 Dart 安全释放到 C/C++ 来测试 Dart 的 FFI。测试重用 the official struct sample .
我可以将数组作为飞镖 Pointer
,但我不清楚如何轻松地将数组作为集合进行迭代。
代码
我正在像这样实现 Dart 端 C 数组绑定:
在struct.h
struct Array
{
int* array;
int len;
};
和一对简单的allocation/deallocation测试函数:
struct Array* get_array();
int del_array(struct Array* arr);
然后在 structs.dart
中的 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');
这给我打印出来
array.array: Pointer<Int32>: address=0x7fb0a5900000
问题
我可以轻松地将数组指针转换为 List
吗?类似于:
final array = arrayPointer.ref.array.toList();
array.forEach(index, elem) => print("array[$idx]: $elem");
======
老问题(可以跳过)
问题
我不清楚如何通过 dart/flutter.C/C++ 从 C/C++ 检索这种矢量数据。
可能的解决方案
更重要的是,如何从各个线程推送C++端的数据? 如果没有内置支持,我会立即考虑实施一些通信方案。
选项 #1:网络
我可以通过 TCP 套接字进行网络连接。但如果有更简单的解决方案,我不愿意去那里。
选项 #2:文件 I/O
使用 C/C++ 将数据写入文件,然后让 dart/flutter 轮询文件并传输数据。这不是实时友好的。
那么,还有更好的选择吗?
解决了。
按照this issue, the 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"));
这给了我:
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