#java #swig #jni #cpp

flapigen

将Rust编写的库与其他语言连接的工具

15个版本

0.7.0 2024年6月5日
0.6.0 2023年4月16日
0.6.0-pre92022年3月15日
0.6.0-pre72020年9月5日
0.6.0-pre132022年7月14日

FFI 中排名第 58

Download history 477/week @ 2024-04-28 721/week @ 2024-05-05 474/week @ 2024-05-12 485/week @ 2024-05-19 398/week @ 2024-05-26 617/week @ 2024-06-02 653/week @ 2024-06-09 583/week @ 2024-06-16 749/week @ 2024-06-23 442/week @ 2024-06-30 251/week @ 2024-07-07 363/week @ 2024-07-14 369/week @ 2024-07-21 363/week @ 2024-07-28 331/week @ 2024-08-04 439/week @ 2024-08-11

每月下载量 1,524

BSD-3-Clause

800KB
22K SLoC

flapigen Build Status License Rust Documentation

用于将Rust编写的程序或库与其他语言连接的工具。外语言API生成器 - flapigen。原名rust_swig更改为不与swig混淆。目前实现了对 C++Java 的支持,但你也可以为任何你喜欢的语言编写支持。有关如何将flapigen集成到你的项目的说明,请查看这里

假设你有以下Rust代码

struct Foo {
    data: i32
}

impl Foo {
    fn new(val: i32) -> Foo {
        Foo{data: val}
    }

    fn f(&self, a: i32, b: i32) -> i32 {
        self.data + a + b
    }

    fn set_field(&mut self, v: i32) {
        self.data = v;
    }
}

fn f2(a: i32) -> i32 {
    a * 2
}

并且你想在Java中编写类似的东西

Foo foo = new Foo(5);
int res = foo.f(1, 2);
assert res == 8;

或者在你想在C++中编写类似的东西

Foo foo(5);
int res = foo.f(1, 2);
assert(res == 8);

为了实现它,flapigen建议以下功能,在Rust项目中你将写(用Rust语言)

foreign_class!(class Foo {
    self_type Foo;
    constructor Foo::new(_: i32) -> Foo;
    fn Foo::set_field(&mut self, _: i32);
    fn Foo::f(&self, _: i32, _: i32) -> i32;
    fn f2(_: i32) -> i32;
});

这就完成了,作为结果,flapigen为Rust函数生成JNI包装器以及用于调用这些JNI函数的Java代码,或者在C++和C++代码中生成用于调用这些C函数的C兼容包装器。

如果你想自动为你生成接口文件(包含 foreign_class! 等内容的文件),请查看 rifgen

用户指南

📚 在这里阅读 flapigen 用户指南!📚

依赖项

~5–14MB
~182K SLoC