我想从 Java / Android调用Rust代码,我发现有3个变体: JNI JNA JNR FFI JNI看起来很好而且足够强大,但你必须这样做 手写太多代码. JNA,如果不考虑它crashes on my machine,需要手工编写Java结构数据类
> 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-bindgen和corrode,它们在另一个方向上工作;他们分别将c标题和任意c代码转换为生锈.我不知道这是否真的有用.
JNI-sys提供低级JNI绑定; rust-on-mobile是一个使用它的小项目.另请参阅First steps with Rust and Java,这是一篇博客文章,展示了一些让人感觉不舒服的雏形.
最后,有cbox,它可以让你解决所有权和FFI的尴尬.