Le tutoriel officiel de flutter sur l'interopérabilité C/C++ grâce à ffi n'aborde que l'appel d'une fonction C++ et l'obtention d'une seule valeur de retour.
Objectif
Que se passe-t-il si j'ai créé un tampon de données du côté C/C++, mais que je veux le transmettre au côté fléchette/flutter pour l'afficher ?
Problème
Avec le conseil de @MilesBudnek, je teste la FFI de Dart en essayant d'avoir une désallocation de mémoire sûre de Dart vers C/C++. Le test réutilise l'échantillon officiel de la structure .
Je pourrais avoir l'Array comme une fléchette. Pointer
mais je ne vois pas comment itérer facilement le tableau comme une collection.
Code
J'implémente une liaison de tableau C côté Dart comme ceci :
En struct.h
struct Array
{
int* array;
int len;
};
et une paire de fonctions de test simples d'allocation/désallocation :
struct Array* get_array();
int del_array(struct Array* arr);
Puis sur le côté Dart dans 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');
Cela me donne l'impression
array.array: Pointer<Int32>: address=0x7fb0a5900000
Question
Puis-je convertir le pointeur de tableau en un List
facilement ? Quelque chose comme :
final array = arrayPointer.ref.array.toList();
array.forEach(index, elem) => print("array[$idx]: $elem");
\======
Ancienne question (vous pouvez sauter cette étape)
Problème
Je ne vois pas très bien comment récupérer ce type de données vectorielles en C/C++ par dart/flutter.
Solutions possibles
Plus important encore, comment pousser les données du côté C++ à partir de différents threads ? S'il n'y a pas de support intégré, il me faudrait, de mémoire, mettre en place des schémas de communication.
Option n° 1 : mise en réseau
Je pourrais faire du réseau à travers des sockets TCP. Mais je suis réticent à aller jusque là s'il existe des solutions plus simples.
Option n° 2 : E/S de fichiers
Écrire des données dans un fichier avec C/C++, et laisser dart/flutter interroger le fichier et transmettre les données. Cette méthode n'est pas adaptée au temps réel.
Alors, y a-t-il de meilleures options ?