Dart/Flutter ffi(外部函数接口)本机回调,例如:sqlite3_exec
Dart/Flutter ffi (Foreign Function Interface) native callbacks eg: sqlite3_exec
您好,我正在使用 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
中的第三个参数是指向回调的函数指针。
因此,如果我使用 ffi
在 dart 中调用此函数,我需要传递一个函数指针:并且在 dart:ffi
Pointer
class 中有一个名为 fromFunction
接受一个 dart 静态函数和一个 exceptionalReturn
;但只需调用此函数即可获取 dart 托管函数的函数指针:引发 (sigterm)
并且 dart 代码不再在此过程中工作。
所以我的问题是:有什么方法可以在 dart 中获得本机回调,如 Python、c#、..
额外:
有什么方法可以将 dartino
包含在 flutter
项目中,因为这个 ForeignDartFunction 涵盖了我需要的内容。
我有一个例子可以工作。希望您能根据自己的情况进行调整。
示例 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
和 returns 124
您好,我正在使用 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
中的第三个参数是指向回调的函数指针。
因此,如果我使用 ffi
在 dart 中调用此函数,我需要传递一个函数指针:并且在 dart:ffi
Pointer
class 中有一个名为 fromFunction
接受一个 dart 静态函数和一个 exceptionalReturn
;但只需调用此函数即可获取 dart 托管函数的函数指针:引发 (sigterm)
并且 dart 代码不再在此过程中工作。
所以我的问题是:有什么方法可以在 dart 中获得本机回调,如 Python、c#、..
额外:
有什么方法可以将 dartino
包含在 flutter
项目中,因为这个 ForeignDartFunction 涵盖了我需要的内容。
我有一个例子可以工作。希望您能根据自己的情况进行调整。
示例 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
和 returns 124