如何在 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;
);
我正在学习如何使用 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;
);