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

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

> JNI
> JNA
> JNR FFI

JNI看起来很好而且足够强大,但你必须这样做
手写太多代码.

JNA,如果不考虑它crashes on my machine,需要手工编写Java结构数据类型描述,
JNR FFI相同的问题.

所以我想知道生成JNI代码有多难
对于具有宏或编译器插件的traits和struct?
此编译器应匹配具体结构的traits实现,
还有结构

#[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
    }
}

并使用本机函数为struct和Java类创建Java类,并生成包含traits函数的pub no_mangle函数.

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

如果你想创建一个这样做的项目,那么周围有一些工具可能会有所帮助.

插件目前不稳定,不适用于非夜间生锈;你可能想要使用syntex,它为编译器插件提供了一个稳定的接口.你也可以写一个raw plugin(参见here for API),但是大多数人都无法使用它.

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

还有rust-bindgencorrode,它们在另一个方向上工作;他们分别将c标题和任意c代码转换为生锈.我不知道这是否真的有用.

JNI-sys提供低级JNI绑定; rust-on-mobile是一个使用它的小项目.另请参阅First steps with Rust and Java,这是一篇博客文章,展示了一些让人感觉不舒服的雏形.

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

相关文章
相关标签/搜索