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

时间:2016-06-30 09:04:14

标签: java java-native-interface rust jna

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

  1. JNI
  2. JNA
  3. JNR FFI
  4. JNI看起来很好而且足够强大,但你必须这样做 手写太多代码。

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

    所以我想知道生成JNI代码会有多困难 使用宏或编译器插件的struct#[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 } } ? 此编译器应匹配具体结构的traits实现, 还有struct

    native

    使用pub函数为struct和Java类创建Java类,并生成包含特征函数的no_mangle {{1}}函数。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

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

插件目前不稳定,不适用于非夜间生锈;你可能想要使用syntex,它为编译器插件提供了一个稳定的接口。你也可以写一个raw plugin(参见here获取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的尴尬。

答案 2 :(得分:0)

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

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