#java #interop #bridge #extern #java-class #file-path

bin+lib rs4j

一个小巧、自动、高效且易于使用的Rust到Java桥接器

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日

#96FFI

每月27次下载

MIT许可证

38KB
965

rs4j

Crates.io Version docs.rs

一个小巧、自动、高效且易于使用的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