最近关注到 Bolt FFI,这是一个能把 Rust 库自动导出为多语言绑定的工具。它的定位很清晰:把业务逻辑集中在 Rust 中,一次编写,多端复用。

它解决了什么问题

跨平台开发中,核心逻辑往往需要为每个平台单独实现一遍。Bolt FFI 的做法是反过来的:用 Rust 写好核心业务,然后通过它自动生成 Swift、Kotlin、Java、C#、TypeScript 等语言的绑定和平台包。生成的代码会处理好类型转换、内存管理和错误传播,调用方完全不需要手动操作指针。

和 JNI、typeshare 的区别

JNI 是 Java/Kotlin 和 C/C++ 等原生代码交互的标准方式,Android 开发里很常见。它能力强,也足够底层,但需要自己维护 native 方法签名、类型转换、线程和内存边界,写起来更像是在手工搭桥。Bolt FFI 则把这部分自动化了,目标不是只服务 JVM,而是一次从 Rust 生成多端绑定。

typeshare 解决的是另一个问题:它可以从 Rust 类型生成 TypeScript、Kotlin、Swift 等语言的数据类型定义,适合共享接口模型和数据结构。但它不负责函数调用、动态库加载、内存管理和跨语言运行时绑定。简单说,typeshare 更像“共享类型声明”,Bolt FFI 更像“把 Rust 库包装成可直接调用的多端 SDK”。

使用方式很直接

  1. 在 Rust 项目中引入 boltffi
  2. #[data] 标记数据结构,#[export] 标记函数
  3. 运行 boltffi pack <平台> 生成对应产物

比如:

use boltffi::*;

#[data]
pub struct Point {
    pub lat: f64,
    pub lng: f64,
}

#[export]
pub fn distance(from: Point, to: Point) -> f64 {
    let dlat = to.lat - from.lat;
    let dlng = to.lng - from.lng;
    (dlat * dlat + dlng * dlng).sqrt()
}

生成的 Swift 代码就是原生的 struct 和函数,Kotlin 会是协程风格,Java 用 CompletableFuture,C# 用 Task,TypeScript 则是 Promise + WASM。错误也会被映射为各语言的原生异常。

性能是亮点

Bolt FFI 采用零拷贝设计:原生类型和只含原生字段的结构体直接跨边界传递,不需要序列化。对比 UniFFI,传递 1,000 个结构体时快了 611 倍;对比 wasm-bindgen,1,000 个十字段结构体快了 453 倍。这个差距在批量数据传输场景下非常可观。

支持的语言

目前完整支持 Swift、Kotlin、Java、C# 和 TypeScript(WASM)。C 是部分支持,Python 和 Dart 在开发中,C++、Ruby、Scala、Go 等也在路线图里。

适用场景

如果你正在用 Rust 写跨平台 SDK,或者想把现有 Rust 核心库暴露给移动端和桌面端,Bolt FFI 提供了一条比手写 FFI 更省心的路径。它把繁琐的绑定生成和平台打包自动化了,同时性能损失极小。

如果项目里还涉及 WebSocket 调试,可以顺手看看 tests.ws:它把在线 WebSocket 测试器、Echo Server、调试扩展和多语言 WebSocket 指南放在一起,适合快速验证连接、收发消息和查协议细节。

有兴趣的话可以看看官方文档和示例项目。