8个不稳定版本 (3个破坏性更新)
0.4.1 | 2024年2月9日 |
---|---|
0.4.0 | 2024年2月9日 |
0.3.1 | 2024年2月9日 |
0.2.1 | 2024年2月9日 |
0.1.1 | 2024年2月9日 |
#96 在 FFI
每月27次下载
38KB
965 行
rs4j
一个小巧、自动、高效且易于使用的Rust到Java桥接器。
用法
rs4j
通过使用自定义语言语法将代码翻译成Rust和Java代码。
使用此工具的一个好方法是创建一个构建脚本,并自动编译您的代码。
您可以通过运行以下命令将此包添加到您的构建脚本中
cargo add rs4j --build
以下是一个示例 build.rs
use rs4j::build::BindgenConfig;
use anyhow::Result;
fn main() -> Result<()> {
// Make a new config
BindgenConfig::new()
// Set the package for export
.package("your.package.here")
// Where to save the Rust bindings
.bindings(format!("{}/src/bindings.rs", env!("CARGO_MANIFEST_DIR")))
// Where the input files are
.glob(format!("{}/bindings/**/*.rs4j", env!("CARGO_MANIFEST_DIR")))?
// Where to save java classes (is a directory)
.output(format!("{}/java", env!("CARGO_MANIFEST_DIR")))
// Enable JetBrains annotations
.annotations(true)
// Go!
.generate()?;
Ok(())
}
完成上述操作后,使用您的 lib.rs
(或其他文件)来包含生成的绑定
// Put any imports that are needed for the bindings here.
use path::to::Dependency;
// You can even define structs in the file, just before the bindings!
// Include the generated code.
include!("bindings.rs");
语法
绑定语言语法相对简单。您首先定义一个类,然后填写其方法和项目。
基本语法概述如下
// This class, Thing, takes in one type parameter, `A`.
// You can omit this if it doesn't take any type parameters.
class Thing<A> {
// This makes it so that Rust knows that the type for `A`
// will have `Clone + Copy`. This doesn't change anything
// on the Java side, it's just so that Rust will compile.
bound A: Clone + Copy;
// Here, the Rust function's name is `new`, but in Java that's
// illegal as it is a reserved keyword. To combat this, you can
// specify a different name for the function in Java and the real
// one in Rust.
[new] static fn of(value: A) -> Thing;
// This gets the value. Since this is in snake_case, rs4j will
// automatically convert it into camelCase, renaming this to
// `get_value` on the Java side.
fn get_value() -> A;
// This marks this function as mutable, meaning in Rust it will
// mutate the struct, as if it took a `&mut self` as an argument.
mut fn set_value(value: A);
// You can even include trait methods, as long as Rust can find the
// trait it belongs to!
fn clone() -> A;
};
支持
以下原始类型受到支持
Rust | Java |
---|---|
String |
String |
str |
String |
bool |
Boolean |
u8 |
Byte |
u16 |
Short |
u32 |
Integer |
u64 |
Long |
u128 |
BigInteger |
i8 |
Byte |
i16 |
Short |
i32 |
Integer |
i64 |
Long |
i128 |
BigInteger |
f32 |
Float |
f64 |
Double |
() |
Void |
* 不全是原始类型,但我将它们视为原始类型。
依赖关系
~3–14MB
~112K SLoC