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 日 |
#222 在 Rust 模式
3,890 每月下载量
35KB
675 行
jnix
此软件包提供高级扩展,以帮助在 Rust 代码中使用 JNI。内部,它使用 jni-rs
软件包进行低级 JNI 操作。
提供一些辅助特质,例如
还提供了一个辅助类型 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