Flutter/Dart + FFI + Zig: call a Zig function from Dart using FFI
hhstore opened this issue · 7 comments
hhstore commented
Flutter 使用 FFI 调用 Zig 示例:
- ✅ https://github.com/better-dart/learn-dart
- ✅ https://github.com/better-dart/learn-dart/blob/main/packages/ffi-binding/example/main.dart#L15
- 完整使用示例.
之前 c 调用 zig 的示例:
应用场景:
- ✅ 基于 zig 构建 app 的 core lib 层. 利用 zig 极强的 C 互操作性 和 跨平台能力.
- 支持交叉编译: 支持平台
- ✅ zig 简单/强大 + 易上手, 完美替代 rust 在此领域的应用. (rust 语法噪音大)
- ✅ 使用 zig CC + zig @cImport() , 可以更容易 wrap 一些 C lib, hook 绑定给 flutter/dart 使用(同样替代 rust).
- 扩展阅读: #362
- 关于 zig CC 应用: https://ruoyusun.com/2022/02/27/zig-cc.html
基本步骤:
- 基本和 rust ffi 操作类似, 但更简单. zig 复用 c 代码能力更强.
✅ zig 侧: 写 zig 代码.
- 写 zig 代码: https://github.com/better-dart/learn-dart/blob/main/packages/ffi-core-zig/src/main.zig#L4
- 基于 zig v0.6 生成 c 头文件
- 运行
zig build
, 生成 二进制 bin 文件:ffi-core-zig/zig-out/lib
路径下.
✅ dart 侧:
- 基于 dart ffigen 工具, 生成 binding 代码 generated_bindings.
- 运行 example/main.dart
- 指定 上面生成的 zig bin 库文件.
- 运行结果日志:
➤ task binding:run
task: [binding:run] fvm dart run ./example/main.dart
baseDir: Directory: '/Users/dev/Documents/iSpace/better-dart/learn-dart/packages'
zigBinDir: /Users/dev/Documents/iSpace/better-dart/learn-dart/packages/ffi-core-zig/zig-out/lib
call zig add, 2
✅ 关键代码:
- 后面有交叉编译完整截图.
详细的运行脚本:
✅ zig gen ffi and run:
✅ dart run example:
hhstore commented
zig 交叉编译截图:
- ✅ 支持交叉编译: 编译指令
# https://ziglang.org/download/0.8.0/release-notes.html#Support-Table
build:
cmds:
- zig build
- zig build -Dtarget=x86_64-linux
- zig build -Dtarget=x86_64-macos
- zig build -Dtarget=x86_64-windows
- zig build -Dtarget=aarch64-macos
- ls -al zig-out/lib/
# - ls -al .
ignore_error: true
- ✅ https://ziglearn.org/chapter-3/#cross-compilation
- 支持的平台列表:
CPU 架构 + OS 类型
- 支持的平台列表:
hhstore commented
Zig FFI 扩展阅读:
- ✅ zig 交叉编译: https://ziglearn.org/chapter-3/#cross-compilation
- ✅ zig 与C ABI 互操作性: https://ziglearn.org/chapter-4/
zig @cImport():
关于 zig CC / zig C++:
hhstore commented
1
hhstore commented
1
hhstore commented
1
dhrubrawat66 commented
this is not working please maintain it...