如何在 dart ffi 中将字符串列表传递给 C

How to pass a list of strings to C In dart ffi

我正在学习如何使用 dart ffi。

我没有太多的 C 经验或知识。

我正在尝试调用 C 库中的函数 (tiny file dialogs)。

我可以调用其他函数,但是我不能调用这个函数

char * tinyfd_saveFileDialog(
        char const * aTitle , /* NULL or "" */
        char const * aDefaultPathAndFile , /* NULL or "" */
        int aNumOfFilterPatterns , /* 0 */
        char const * const * aFilterPatterns , /* NULL or {"*.jpg","*.png"} */
        char const * aSingleFilterDescription ) /* NULL or "image files" */
{

主要问题是没看懂

char const* const * a FilterProperties, / *Null or {"*.jpg", "*.png"} */

表示。

据我所知,this issue C 函数要求一个字符串数组。 arg aNumberOfFilterPatterns 定义数组的长度。

如果是这样,我如何在 dart 中准备数组以将其传递给 C?

我可以通过创建一个指向 char 的指针来做到这一点

像这样

/// Define the type like this
typedef SaveFileDialogD = Pointer<Utf8> Function(
 
  Pointer<Pointer<Utf8>> listOfStrings,

);

在动态库中查找函数


SaveFileDialogD saveFileDialog = dylib
    .lookupFunction<SaveFileDialogC, SaveFileDialogD>('dylib');

创建一个函数将字符串的 Dart 列表转换为更 C 语言友好的内容

/// Don't forget to run malloc.free with result!
Pointer<Pointer<Utf8>> strListToPointer(List<String> strings) {
  List<Pointer<Utf8>> utf8PointerList =
      strings.map((str) => str.toNativeUtf8()).toList();

  final Pointer<Pointer<Utf8>> pointerPointer =
      malloc.allocate(utf8PointerList.length);

  strings.asMap().forEach((index, utf) {
    pointerPointer[index] = utf8PointerList[index];
  });

  return pointerPointer;
}

最后像这样调用C函数

Pointer<Utf8> result;
    final strListPointer = strListToPointer(["one", "two", "three"]);

    result = saveFileDialog(
       strListPointer;
    );