官方文档:在 iOS 中使用 dart:ffi 调用本地代码
dart 调用ios 代码
ios代码通常包括:
c++/c/objc/swift
dart通过dart:ffi直接调用IOS侧的实现。
在IOS侧:
实现c方法:
可以放在cpp 中,也可以放在m文件中,还可以是swift文件
//__attribute__((visibility("default"))) __attribute__((used))
extern "C" __attribute__((visibility("default"))) __attribute__((used))
int32_t native_add_objc(int32_t x, int32_t y) {
return x + y;
}
只有当在cpp文件中用extern "C"
关于extern "C"的用法 参考文章: c和c++语言的混合编程
如果是swift使用下面前缀导出,以确保它们对 Dart 可见:
@_cdecl("myFunctionName")
在dart侧实现dart 方法和 ios native方法的完成DynamicLibrary绑定:
创建一个native_add.dart文件:
import 'dart:ffi'; // For FFI
import 'dart:io'; // For Platform.isX
final DynamicLibrary nativeAddLib = Platform.isAndroid
? DynamicLibrary.open('libnative_add.so')
// : DynamicLibrary.process();
: DynamicLibrary.executable();
final int Function(int x, int y) nativeAdd = nativeAddLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>('native_add')
.asFunction();
final int Function(int x, int y) nativeAddObjc = nativeAddLib
.lookup<NativeFunction<Int32 Function(Int32, Int32)>>('native_add_objc')
.asFunction();
dart上调用:
nativeAdd(1, 2)
nativeAddObjc(1, 2)
Center(
child: TextButton(
child: Text('nativeAdd: ${result}\n'),
onPressed: () {
result = '${nativeAdd(1, 2)}';
setState(() {});
},
),
),
Center(
child: TextButton(
child: Text('nativeAddObjc: ${result}\n'),
onPressed: () {
result = '${nativeAddObjc(1, 2)}';
setState(() {});
},
),
),
这样就完成了dart通过使用dart:ffi对 IOS native 方法(c/c++/objc/swift)的调用。
总结一下dart:ffi实现原理;
dart:ffi 是 Dart 语言提供的一种 FFI(Foreign Function Interface)的实现方式,用于在 Dart 代码中直接调用 C 代码中的函数。dart:ffi 实现的核心原理是使用 Dart VM 中的动态链接库(dynamic library)机制,将 Dart 代码和 C 代码进行链接。
在 Dart 代码中使用 dart:ffi 调用 C 函数的基本步骤如下:
-
定义 C 函数的接口
在 Dart 中定义 C 函数的接口,包括函数名、参数类型和返回类型。这些定义会被编译为 C 语言的函数声明。 -
加载动态链接库
在 Dart 代码中使用 DynamicLibrary 类加载 C 语言编译后的动态链接库。 -
获得 C 函数指针
在 Dart 代码中使用 Pointer<NativeFunction> 类获得 C 函数的指针。 -
调用 C 函数
在 Dart 代码中使用 NativeFunction 类的 asFunction 方法将 C 函数指针转换为 Dart 函数,然后可以直接调用该函数。
dart:ffi中最关键的类是 DynamicLibrary、Pointer 和 NativeFunction。DynamicLibrary 用于加载动态链接库,Pointer 用于操作指针,NativeFunction 用于将 C 函数指针转换为 Dart 函数。
总之,dart:ffi 实现的核心是将 Dart 代码和 C 代码进行链接,通过指针操作在 Dart 代码中调用 C 函数,从而实现了 FFI 的功能。
网友评论