【问题标题】:Dart FFI bindings to ***struct: iterate over 'result'Dart FFI 绑定到 ***struct:迭代“结果”
【发布时间】:2022-01-05 04:48:04
【问题描述】:

我正在尝试将 FFI 绑定写入 C 库,该库具有使用 ***Struct 作为其参数之一的函数:

typedef struct {
    char *name;
    char *value;
} StructType;

extern void theFunction(StructType ***list);

应该调用哪个,使用的结果如下:

const StructType **struct_list;
theFunction(&struct_list);

for (int i = 0; struct_list[i]; i++) {
    StructType *entry = struct_list[i];
    printf("name: %s, value %s\n", entry->name, entry->value);
}

我这辈子都不知道如何为此创建 Dart FFI 绑定。我试过Pointer<Pointer<Pointer<StructType>>>。实际绑定(lookup().asFunction())似乎有效,对实际函数的 call 似乎有效,但我只是不知道如何在函数调用后迭代 ***struct_list进入StructTypes 的列表。

有人能举一个小例子来说明如何实现吗?

[编辑] 我很接近......只是无法访问结构的各个成员。这是我目前正在使用的方法。请注意,我在这里使用了一个名为“Item”的结构,我认为这使事情更容易阅读:

class Item extends Struct {
    external Pointer<Utf8> name;
    external Pointer<Utf8> value;
}

late int Function(Pointer<Pointer<Pointer<Item>>>) getItems;
typedef getItemsNative_t = Int32 Function(Pointer<Pointer<Pointer<Item>>>);

getItems = library.lookup<NativeFunction<getItemsNative_t>('get_items').asFunction();

Pointer<Pointer<Pointer<Item>>> pppItem = calloc();
getItems(pppItem);

Pointer<Pointer<Item>> ppItem = pppItem.value;
int idx = 0;
Pointer<Item> pItem = ppItem.elementAt(idx).value; // *item
while (pItem != nullptr) {
    Item item = pItem.ref; // IS THIS CORRECT?
    print('name = ${item.name.toDartString()}');
    print('value = ${item.value.toDartString()}');
    pItem = ppItem.elementAt(++idx).value;
}
calloc.free(pppItem);

几乎有效。它“访问”每个项目,除了每个成员访问返回“名称”的值,而不是“值”。

我一定是在“这是正确的”评论那一行做错了什么,但我不知道它是什么。有人有什么想法/建议吗?

【问题讨论】:

    标签: dart ffi


    【解决方案1】:

    我很尴尬。我的真实代码比上面显示的要复杂一些,结果证明我的测试用例不正确:(

    因此,以上(在 [EDIT] 下)都有效。关闭这个。

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      相关资源
      最近更新 更多