Официальное руководство по флаттеру по взаимодействию C / C ++ с помощью ffi касается только вызова функции C ++ и получения единственного возвращаемого значения.
Цель
Что если я у вас есть буфер данных, созданный на стороне C / C ++, но вы хотите показать его на стороне dart / flutter?
Проблема
С подсказкой @MilesBudnek я тестирую FFI Дартса пытаясь получить безопасное освобождение памяти от Dart к C / C ++. Тест повторно использует официальный образец структуры .
Я мог бы получить массив в виде дротика Pointer
, но мне неясно, как легко итерировать массив как коллекцию.
Код
Я реализую привязку массива Dart-side C следующим образом:
In struct.h
struct Array
{
int* array;
int len;
};
и пару простых Функции проверки распределения / освобождения:
struct Array* get_array();
int del_array(struct Array* arr);
Затем на стороне Дартса в 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");
======
Старый вопрос (вы можете пропустить это)
Проблема
Мне непонятно, как извлекать такие векторные данные из C / C ++ с помощью dart / flutter.
Возможные решения
Что более важно, как получить sh данные со стороны C ++ из различных потоков? Если встроенной поддержки нет, мне бы пришлось реализовать некоторые схемы связи.
Вариант № 1: Сеть
Я мог бы работать в сети через TCP-сокеты. Но я не хочу, чтобы там было go, если есть более простые решения.
Вариант № 2: файловый ввод / вывод
Записать данные в файл с помощью C / C ++ и позволить dart / flutter опросить файл и поток данных закончился. Это не в реальном времени.
Итак, есть ли лучшие варианты?