Собственные обратные вызовы Dart / Flutter ffi (интерфейс функций Foreig), например: sqlite3_exec - PullRequest
0 голосов
/ 01 мая 2020

Здравствуйте. Я использую dart: ffi для создания интерфейса с моей родной библиотекой c / c ++. и мне нужен был способ получить обратный вызов из c для дротика в качестве примера в 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 классе есть функция с именем fromFunction, которая принимает функцию dart stati c и exceptionalReturn; но просто вызывая эту функцию, чтобы получить указатель на функцию управляемой функции dart: (sigterm) повышается, и код dart больше не работает в процессе.

Итак, мой вопрос: есть ли способ получить встроенный обратный вызов в dart, как в Python, c#, ..

Дополнительно: есть ли способ включить dartino в проект flutter, поскольку эта ForeignDartFunction покрывает то, что мне нужно.

1 Ответ

0 голосов
/ 02 мая 2020

У меня есть пример для работы. Надеюсь, вы можете адаптировать это к вашему случаю.

Пример 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

...