flapigen
用于连接用 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++ 代码。