Flutter/Dart FFI:如何从C++异步调用Dart方法

3

我试图从我的C++库中调用一个Dart方法。当我在设置指针的同一方法中直接调用它时,它能够正常工作。但是当我稍后调用它(例如从另一个C++方法中),我会得到一个错误。

有没有一种方法可以在C++中调用主要的Dart线程?或者你有其他的解决方案吗?

Dart部分:

@override
void initState() {
  initHandler(Pointer.fromFunction<result_callback>(resultCallback));
  super.initState();
}

static void resultCallback(Pointer<Void> ptr, int result) {
  print("Hey Dart, i am done! Result: " + result.toString());
}

typedef result_callback = Void Function(Pointer<Void>, ffi.Int32);
typedef _init = Void Function(Pointer<NativeFunction<result_callback>>);
typedef _InitFunc = void Function(Pointer<NativeFunction<result_callback>>);
final _InitFunc initHandler = cppLib.lookup<NativeFunction<_init>>('initHandler').asFunction();

C++部分

typedef void(*dartResultHandler)(void*, int32_t);
dartResultHandler nativeHandler;

void setDartHandler(dartResultHandler _dartResultHandler) {
  nativeHandler = _dartResultHandler;
}

extern "C" {
  __attribute__((visibility("default"))) __attribute__((used)) void initHandler(void (*_dartResultHandler)(void*, int32_t)) {
      _dartResultHandler(nullptr, 500);
      setDartHandler(_dartResultHandler);
  }
}

这里记录了日志:“嘿,Dart,我完成了!结果:500”。

稍后,C++ 部分会调用

nativeHandler(nullptr,1000); 

在另一个方法中,我遇到了错误:
E/Dart    (26335): ../../third_party/dart/runtime/vm/runtime_entry.cc: 3518: error: Cannot invoke native callback outside an isolate.
E/DartVM  (26335): version=2.10.4 (stable) (Wed Nov 11 13:35:58 2020 +0100) on "android_arm64"
E/DartVM  (26335): pid=26335, thread=32701, isolate_group=(nil)(0x0), isolate=(nil)(0x0)
E/DartVM  (26335): isolate_instructions=0, vm_instructions=79df5f1720
E/DartVM  (26335):   pc 0x00000079df70460c fp 0x00000079c177b780 /data/app/com.example.libtest_flutter-sP2r6HRVpXyy23c0p-vDFQ==/lib/arm64/libflutter.so+0x172860c
E/DartVM  (26335): -- End of DumpStackTrace

在您的演示中,C++能够成功调用Dart方法吗?我之前不知道C++如何调用Dart的方法。这是我的问题 - Liu Silong
这个问题解决了吗?如果您已经解决了,请添加答案。 - Sanjay
1个回答

0

C++端调用线程可能不是隔离线程,因此Flutter引擎会抛出错误。 您可以尝试使用Dart_Port_DL替换C++调用Dart代码。

// The function is thread-safe; you can call it anywhere on your C++ code
 Dart_PostCObject_DL(m_dart_port_dl, &msg);

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