月度归档: 2021 年 9 月

  • Flutter和Rust混合编程

    Rust语言本身就是跨平台的,加上很多性能上的优势,很多代码可以在一定程度上复用。

    Flutter的FFI支持可以让我们调用本地代码,也就是可以做到Flutter和Rust混合编程。

    Rust改造

    为了减少改动,我一般会引入一个新的项目,直接在原项目名基础上加上ffi。

    这个项目的主要用途在于定义对外暴露的接口,并在构建时输出so等文件。

    在Cargo.toml中新增两个依赖

    [dependencies]
    rust-project = { path = "../rust-project" }
    
    [build-dependencies]
    cbindgen = "0.14.3"
    dart-bindgen = "0.1.7"

    其中cbindgen帮助我们从Rust代码生成C/C++的头文件,dart-bindgen(现在用ffigen了)帮助我们从头文件生成dart绑定。

    Flutter插件

    有了上一步的so和dart文件后我们就可以调用了,但是出于隔离和复用的考虑,这里不直接在Flutter项目中使用,而是先包装成Plugin。

    按照设计,Flutter插件可以用于封装与平台专用代码进行的通信,由于上一步已经生成了绑定,所以这里只做最基础的封装和注册。

    import 'ffi.dart' as ffi;
    
    class Plugin {
      int functionName(int a, int b) {