跨语言通信——dart::ffi

ffi是一个比一般通信更底层的机制,接近于jni或者jsi。主要用来做dart和c++的interop。

方法定义和绑定

dart call c++

官方demo是:

import 'dart:ffi'; // For FFI
import 'dart:io'; // For Platform.isX

final DynamicLibrary nativeAddLib = Platform.isAndroid
    ? DynamicLibrary.open("libnative_add.so")
    : DynamicLibrary.process();
final int Function(int x, int y) nativeAdd =
  nativeAddLib
    .lookup<NativeFunction<Int32 Function(Int32, Int32)>>("native_add")
    .asFunction();
nativeAdd(1, 2);
  • DynamicLibrary#open->ffi_dynamic_library_patch#_open->Ffi_dl_open->ffi_dynamic_library#DN_Ffi_dl_open(宏定义出来的)->DN_HelperFfi_dl_open(宏)->LoadExtensionLibrary->dlopen(posix方法)
  • DynamicLibrary#lookup->ffi_dynamic_library_patch#Ffi_dl_lookup->仍然是宏定义到ResolveSymbol->dlsym(posix)
  • Pointer#asFunction,是通过front_end的transform进行直接inline的,其实调用的是_asFunctionInternal->ffi.cc#DN_Ffi_asFunctionInternal(宏)->call.cc#TrampolineFunction(直接使用dartvm构造出来一个新的方法,用来转调c++方法)
  • 调用dart_api_impl.cc#Dart_Invoke->Instance(Closure)#Invoke->InvokeInstanceFunction->DartEntry#InvokeFunction->DartEntry#InvokeCode
  • 会在kernel_to_il.cc中对ffi相关调用进行转换,直接把call变成FfiCallInstr。(这部分基本没看懂)

c++ call dart

也是在kernel_to_il.cc中,通过BuildGraphOfFfiCallback来转换的。

类型约束及传输

所有数据也都是通过kernel_to_il.cc来进行数据传递的,所有操作都是针对内存地址直接进行操作的。
数据和方法对象直接通过dartVM api分配到了老生代怼上,可以直接走gc。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值