дротик / флаттер: получение массива данных из C / C ++ с использованием ffi? - PullRequest
0 голосов
/ 27 марта 2020

Официальное руководство по флаттеру по взаимодействию 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 опросить файл и поток данных закончился. Это не в реальном времени.

Итак, есть ли лучшие варианты?

1 Ответ

0 голосов
/ 30 марта 2020

Решено.

Согласно этой проблеме , API asTypedList - это путь к go.

. Вот код это работает для меня

  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
...