如何为 Rust 代码自动化 Java 绑定?

How to automate Java bindings for Rust code?

我想从 Java / Android 调用 Rust 代码,我发现了 3 个变体:

  1. JNI
  2. JNA
  3. JNR FFI

JNI看起来不错,够强大,但你得 手写代码太多了。

JNA,如果不考虑它在我的机器上崩溃,需要在Java中手写Rust结构数据类型描述, JNR FFI.

同样的问题

所以我想知道生成 JNI 代码有多难 traitsstruct 使用宏或编译器插件? 这个编译器应该匹配具体结构的特征实现, 还有结构

#[JNI]
struct Foo {
    a: i32,
}

trait Boo {
    fn f(&self, b: f64) -> f64;
}
#[JNI]
impl Boo for Foo {
    fn f(&self, b: f64) -> f64 {
        0f64
    }
}

并为结构创建 Java 类 并使用 native 函数创建 Java 类,并生成 pub no_mangle包装特征函数的函数。

您可以使用 jnaerator 自动生成 JNA 的结构映射。

或者,如果您想使用 JNI(并编译更多本机代码),您应该使用 SWIG

为了提供像那样工作的 #[jni] 注释,您需要使用编译器插件。这将是一个很棒的工具,但据我所知,它还不存在。

如果您想创建一个执行此操作的项目,周围有一些零碎的工具可能会有所帮助。

插件目前不稳定,不适用于非夜间生锈;你可能想用 syntex, which provides a stable interface to compiler plugins. You could also write a raw plugin (see here 代替 API),但大多数人无法使用它。

rusty-cheddar,生成c头文件;你可以看看它是如何工作的。它的作者似乎也在研究一个更通用的绑定生成框架,但我不知道它是否活跃。您也许可以将 cheddar 的输出连接到 JNAerator 之类的东西,但它可能不会在 java 端创建最漂亮的界面。

还有rust-bindgen and corrode,它们在另一个方向起作用;他们分别将 c 头文件和任意 c 代码翻译成 rust。我不知道这是否真的有帮助。

JNI-sys provides low-level JNI bindings; rust-on-mobile is a small project that uses it. Also see First steps with Rust and Java,一个博客 post,展示了一些基本的连接方法。

最后,还有 cbox,它可以让您解决所有权和 FFI 的尴尬问题。

最后我创建了这样的 project (link to github repository) 来自动化 绑定创建。