能否在C中使用Dart函数作为回调函数?

3

使用ffi,是否可以将指向dart函数的指针传递到C模块(即* .so库)中,并直接从* .so库访问此dart函数并通过回调使用它?


你看过这个吗:https://api.dart.dev/stable/2.7.2/dart-ffi/Pointer/fromFunction.html? - julemand101
也许可以。我能在哪里找到使用此函数的示例? - Michael Kanzieper
2个回答

5
非常感谢提供的信息,这正是我所需要的。
dart:
int myPlus(int a, int b) {
  print("dart.myPlus.a=$a,b=$b. $a+$b => ${a + b}");
  return a + b;
}

main() {
  ...   
  ffi.Pointer<ffi.NativeFunction<NativeIntptrBinOp>>
    pointer = ffi.Pointer.fromFunction(myPlus, 0);
  print(pointer);

  ffi.Pointer<ffi.NativeFunction<NativeApplyTo42And74Type>>
    p17 = dylib.lookup("ApplyTo42And74");
  ApplyTo42And74Type applyTo42And74 = p17.asFunction();
  int result = applyTo42And74(pointer);
  print("result => $result");
}

c:

#include <stdio.h>
#include <stdint.h>

typedef intptr_t (*IntptrBinOp)(intptr_t a, intptr_t b);

intptr_t ApplyTo42And74(IntptrBinOp binop) {
  printf("ApplyTo42And74()\n");
  intptr_t retval = binop(42, 74);
  printf("returning %lu\n", retval);
  return retval;
}

结果:

Pointer<NativeFunction<(IntPtr, IntPtr) => IntPtr>>: address=0x7fb4acd98000
ApplyTo42And74()
dart.myPlus.a=42,b=74. 42+74 => 116
returning 116
result => 116

问题在 Github 上提供了类似的示例代码:https://github.com/dart-lang/sdk/issues/35761 - Maks
但是我收到了错误信息:“'fromFunction' 给定的类型 'Function' 必须是有效的 'dart:ffi' 本地函数类型。尝试更改类型,仅使用 'dart:ffi' 的成员。” - somebody4

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接