hhstore/blog

Flutter/Dart + FFI + Zig: call a Zig function from Dart using FFI

hhstore opened this issue · 7 comments

related:

flutter 插件:

zig 篇:

一些讨论:

ref:

Flutter 使用 FFI 调用 Zig 示例:

之前 c 调用 zig 的示例:

应用场景:

  • ✅ 基于 zig 构建 app 的 core lib 层. 利用 zig 极强的 C 互操作性 和 跨平台能力.
  • ✅ zig 简单/强大 + 易上手, 完美替代 rust 在此领域的应用. (rust 语法噪音大)
  • ✅ 使用 zig CC + zig @cImport() , 可以更容易 wrap 一些 C lib, hook 绑定给 flutter/dart 使用(同样替代 rust).

基本步骤:

  • 基本和 rust ffi 操作类似, 但更简单. zig 复用 c 代码能力更强.

✅ zig 侧: 写 zig 代码.

  1. 写 zig 代码: https://github.com/better-dart/learn-dart/blob/main/packages/ffi-core-zig/src/main.zig#L4
  2. 基于 zig v0.6 生成 c 头文件
  3. 运行 zig build, 生成 二进制 bin 文件: ffi-core-zig/zig-out/lib 路径下.

✅ dart 侧:

  1. 基于 dart ffigen 工具, 生成 binding 代码 generated_bindings.
  2. 运行 example/main.dart
    • 指定 上面生成的 zig bin 库文件.
  3. 运行结果日志:
 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

✅ 关键代码:

  • 后面有交叉编译完整截图.

image

详细的运行脚本:

✅ zig gen ffi and run:

✅ dart run example:

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

image

1

1

1

this is not working please maintain it...