1

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

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

我正在尝试从 C 库中调用一个函数(小文件对话框)。

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

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"} */

方法。

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

如果是这种情况,我该如何准备 dart 中的数组以将其传递给 C?

4

1 回答 1

1

我可以通过创建一个指向 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;
    );
于 2021-07-14T20:02:21.057 回答