#jni #java #java-class #ffi #proc-macro

jnix

为 Rust 代码中使用 JNI 提供高级扩展

12 个版本

0.5.1 2023 年 10 月 24 日
0.5.0 2022 年 9 月 16 日
0.4.0 2021 年 2 月 18 日
0.3.0 2020 年 11 月 27 日
0.1.0 2019 年 11 月 22 日

#222Rust 模式

Download history 1397/week @ 2024-04-14 1019/week @ 2024-04-21 569/week @ 2024-04-28 509/week @ 2024-05-05 1153/week @ 2024-05-12 720/week @ 2024-05-19 848/week @ 2024-05-26 917/week @ 2024-06-02 926/week @ 2024-06-09 1057/week @ 2024-06-16 980/week @ 2024-06-23 670/week @ 2024-06-30 528/week @ 2024-07-07 716/week @ 2024-07-14 1256/week @ 2024-07-21 1367/week @ 2024-07-28

3,890 每月下载量

Apache-2.0 OR MIT

35KB
675

jnix

此软件包提供高级扩展,以帮助在 Rust 代码中使用 JNI。内部,它使用 jni-rs 软件包进行低级 JNI 操作。

提供一些辅助特质,例如

  • AsJValue:允许 JNI 类型转换为 JValue 包装类型。
  • IntoJava:允许 Rust 类型转换为 Java 类型。
  • FromJava:允许 Rust 类型从 Java 类型创建。

还提供了一个辅助类型 JnixEnv,它是一个 JNIEnv 包装器,包含预加载类的内部类缓存。

如果使用 derive 功能标志编译,该软件包还导出过程宏到 derive IntoJava 和到 derive FromJava,这使得编写转换代码变得容易得多。例如:

use jnix::{
    jni::{objects::JObject, JNIEnv},
    JnixEnv, FromJava, IntoJava,
};

// Rust type definition
#[derive(Default, FromJava, IntoJava)]
#[jnix(package = "my.package")]
pub struct MyData {
    number: i32,
    string: String,
}

// A JNI function called from Java that creates a `MyData` Rust type, converts it to a Java
// type and returns it.
#[no_mangle]
#[allow(non_snake_case)]
pub extern "system" fn Java_my_package_JniClass_getData<'env>(
    env: JNIEnv<'env>,
    _this: JObject<'env>,
    data: JObject<'env>,
) -> JObject<'env> {
    // Create the `JnixEnv` wrapper
    let env = JnixEnv::from(env);

    // Convert parameter to Rust type
    let data = MyData::from_java(&env, data);

    // Create a new `MyData` object by converting from the Rust type. Since a smart pointer is
    // returned from `into_java`, the inner object must be "leaked" sothat the garbage collector
    // can own it afterwards
    data.into_java(&env).forget()
}
package my.package;

public class MyData {
    public MyData(int number, String string) {
        // This is the constructor that is called by the generated `IntoJava` code
        //
        // Note that the fields don't actually have to exist, the only thing that's necessary
        // is for the target Java class to have a constructor with the expected type signature
        // following the field order of the Rust type.
    }

    // These getters are called by the generated `FromJava` code
    public int getNumber() {
        return 10;
    }

    public String getString() {
        return "string value";
    }
}

许可证:Apache-2.0 OR MIT

依赖项

~1.7–7.5MB
~56K SLoC