FFI 与原生交互(dart:ffi)
通过 dart:ffi
调用本地动态库,与 C 交互。
基本流程
- 定义 C 签名与 Dart 函数类型;通过
DynamicLibrary.open
加载并绑定。
import 'dart:ffi' as ffi;
typedef c_add = ffi.Int32 Function(ffi.Int32, ffi.Int32);
typedef dart_add = int Function(int, int);
final dylib = ffi.DynamicLibrary.open('libmath.so');
final add = dylib.lookupFunction<c_add, dart_add>('add');
注意事项
- 内存所有权与释放;对齐与结构体布局;ABI/平台差异。
结构体与指针示例
import 'dart:ffi' as ffi;
import 'package:ffi/ffi.dart' as pkg;
class Point extends ffi.Struct {
@ffi.Int32()
external int x;
@ffi.Int32()
external int y;
}
typedef c_len = ffi.Int32 Function(ffi.Pointer<Point>);
typedef dart_len = int Function(ffi.Pointer<Point>);
final lib = ffi.DynamicLibrary.open('libgeom.so');
final len = lib.lookupFunction<c_len, dart_len>('point_len');
void main() {
final p = pkg.calloc<Point>();
p.ref
..x = 3
..y = 4;
final v = len(p);
pkg.calloc.free(p);
}