10

您好,我正在使用 dart:ffi 与我的原生 c/c++ 库构建接口。我需要一种方法来获取从 c 到 dart 的回调作为 sqlite 中的示例:

int sqlite3_exec(
    sqlite3*,                                  /* An open database */
    const char *sql,                           /* SQL to be evaluated */
    int (*callback)(void*,int,char**,char**),  /* Callback function */
    void *,                                    /* 1st argument to callback */
    char **errmsg                              /* Error msg written here */
);

第三个参数sqlite3_exec是指向回调的函数指针。所以如果我在 dart 中调用这个函数,ffi我需要传递一个函数指针:并且在dart:ffi Pointer类中有一个名为fromFunctionwitch 的函数接受一个 dart 静态函数和一个exceptionalReturn; 但只需调用此函数即可获取 dart 托管函数的函数指针:(sigterm)引发 a 并且 dart 代码不再在该过程中工作。

所以我的问题:有没有办法在 dart 中获得本机回调,如 Python、c#、..

额外:有什么方法可以包含dartinoflutter项目中,因为这个ForeignDartFunction涵盖了我需要的东西。

4

1 回答 1

21

我有一个例子可以工作。希望您可以根据自己的情况进行调整。

示例 C 函数

EXTERNC int32_t foo(
                    int32_t bar,
                    int32_t (*callback)(void*, int32_t)
                    ) {
    return callback(nullptr, bar);
}

飞镖代码

首先是typedefs. 我们需要两个用于原生函数foo,一个用于 Dart 回调。

typedef example_foo = Int32 Function(
    Int32 bar, Pointer<NativeFunction<example_callback>>);
typedef ExampleFoo = int Function(
    int bar, Pointer<NativeFunction<example_callback>>);

typedef example_callback = Int32 Function(Pointer<Void>, Int32);

和回调代码

  static int callback(Pointer<Void> ptr, int i) {
    print('in callback i=$i');
    return i + 1;
  }

和查找

  ExampleFoo nativeFoo =
    nativeLib.lookup<NativeFunction<example_foo>>('foo').asFunction();

最后,像这样使用它:

  int foo(int i) {
    return nativeFoo(
      i,
      Pointer.fromFunction<example_callback>(callback, except),
    );
  }

正如预期的那样,foo(123)打印flutter: in callback i=123并返回124

于 2020-05-01T21:16:59.137 回答