本文是阅读dart ffi相关的代码记录。
源码的位置
分成几个部分,dart的代码在sdk/lib/ffi下,有4个文件
- annotations.dart
- dynamic_library.dart : 定义DynamicLibrary类,用于加载so库
- ffi.dart 定义Pointer类
- native_type.dart 定义NativeType
Pointer相关的实际实现的代码,
在runtime/lib/ffi_path.dart, 定义的对应的native实现,关键的如
- Pointer.asFunction对应 Ffi_asFunction
- fromFunction 对应Ffi_fromFunction
- 等等
runtime/lib/ffi_dynamic_library_patch.dart定义DynamicLibrary的实现
- DynamicLibrary._open对应 Ffi_dl_open
- DynamicLibrary.lookup 对应 Ffi_dl_lookup
- 等等
对应的c++类
runtime/lib/ffi_dynamic_library.cc 实现open, loopkup等函数
runtime/lib/ffi.cc 实现fromFunction, asFunction等函数
lookup取得函数指针
dart的用法
import 'dart:ffi' as ffi;
import 'dart:io' show Platform;
// FFI signature of the hello_world C function
typedef hello_world_func = ffi.Void Function();
// Dart type definition for calling the C foreign function
typedef HelloWorld = void Function();
main() {
// Open the dynamic library
var path = "./hello_library/libhello.so";
if (Platform.isMacOS) path = './hello_library/libhello.dylib';
if (Platform.isWindows) path = r'hello_library\Debug\hello.dll'