【发布时间】:2020-07-07 19:34:09
【问题描述】:
The official flutter tutorial on C/C++ interop through ffi 仅涉及调用 C++ 函数并获取单个返回值。
目标
如果我在 C/C++ 端创建了一个数据缓冲区,但想交付到 dart/flutter 端显示怎么办?
问题
根据@MilesBudnek 的提示,我正在测试 Dart 的 FFI,尝试将内存从 Dart 安全释放到 C/C++。测试重用the official struct sample。
我可以将数组作为 dart Pointer,但我不清楚如何轻松地将数组迭代为集合。
代码
我正在实现这样的 Dart 端 C 数组绑定:
在struct.h
struct Array
{
int* array;
int len;
};
还有一对简单的分配/解除分配测试函数:
struct Array* get_array();
int del_array(struct Array* arr);
然后在 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');
这给了我打印出来
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++ 端推送数据? 如果没有内置支持,我想我需要实现一些通信方案。
选项 #1:网络
我可以通过 TCP 套接字进行网络连接。但如果有更简单的解决方案,我不愿意去那里。
选项 #2:文件 I/O
使用 C/C++ 将数据写入文件,并让 dart/flutter 轮询文件并流式传输数据。这不是实时友好的。
那么,还有更好的选择吗?
【问题讨论】:
-
我对dart/flutter不太熟悉,不过貌似支持pointers。因此,您将返回指向 C++ 代码分配的数组的第一个元素的指针,使用 dart 中的数据,然后将该指针传递回 C++ 代码中的另一个函数以释放内存。例如,查看他们的structs example(尽管在该示例中他们从未释放
malloc分配的内存)。 -
@MilesBudnek 我更新了问题,请您看一下?感谢之前的提示。
标签: c++ flutter dart language-interoperability