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

2022-09-04 03:42:23

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

  1. 断续器
  2. 金航
  3. 金诺尔菲

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类创建Java类,并生成包装特征函数的函数。nativepubno_mangle


答案 1

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

有一些零碎的工具可能会有所帮助,如果你想创建一个这样做的项目。

插件目前不稳定,并且不适用于非夜间生锈;您可能希望使用syntex,它为编译器插件提供了稳定的接口。你也可以写一个原始插件(请参阅此处以获取API),但大多数人将无法使用它。

生锈的切达干酪,它生成c头文件;你可以看看它是如何工作的。该框架的作者似乎也在研究一个更通用的绑定生成框架,但我不知道它是否处于活动状态。你也许能够将切达干酪的输出挂接到像JNAerator这样的东西上,但它可能不会在java端创建最漂亮的接口。

还有锈蚀剂和腐蚀剂,它们在另一个方向起作用;它们分别将 c 标头和任意 c 代码转换为 rust。我不知道这是否真的有帮助。

JNI-sys提供低级JNI绑定;Rust-on-mobile是一个使用它的小项目。另请参阅 Rust 和 Java 的 First steps,这是一篇博客文章,其中介绍了一些连接内容的基本知识。

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


答案 2

最后,我创建了这样的项目(链接到github存储库)来自动创建绑定。


推荐