我想从Java / Android调用Rust代码,我发现有3个变体:
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}}函数。
答案 0 :(得分:4)
最后我创建了这样的project (link to github repository)来自动化 绑定创建。
答案 1 :(得分:3)
为了提供类似工作的#[jni]
注释,您需要使用编译器插件。这将是一个很棒的工具,但就我所知,它还没有存在。
如果你想创建一个能够做到这一点的项目,那么周围有一些工具可能会有所帮助。
插件目前不稳定,不适用于非夜间生锈;你可能想要使用syntex,它为编译器插件提供了一个稳定的接口。你也可以写一个raw plugin(参见here获取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的尴尬。
答案 2 :(得分:0)