24 个版本 (14 个重大更新)
1.0.0 |
|
---|---|
0.16.1 | 2023 年 4 月 26 日 |
#14 in #java-class
660KB
14K SLoC
toad-jni
jni 的高级包装,使 Java & Rust FFI 变得简单而有趣
全局变量
toad_jni::global
提供了使用全局 JVM 处理器的选项 (toad_jni::global::jvm()
由 toad_jni::global::init()
设置)。
使用 JVM 全局是完全可选的,除非 您计划在 toad_jni::java::util::ArrayList
上使用 Rust 特征实现,例如 IntoIterator
。
类型
所有 Java 类型签名都可以由实现 toad_jni::java::Type
特征的 Rust 类型表示,该特征对所有 toad_jni::java::Class
自动实现。
类
类通过实现 2 个特征在 toad_jni
中表示
字段和方法
有几个高级镜头式结构体,用于与字段、方法和构造函数交互
toad_jni::java::构造函数
toad_jni::java::静态字段
toad_jni::java::静态方法
toad_jni::java::字段
toad_jni::java::方法
所有这些类型都使用 toad_jni::java::Type
将 Rust 类型转换为相应的 JVM 类型签名。
例如,java.lang.String.format(String, ..Object)
的 StaticMethod
表示形式将是
use toad_jni::java::lang::Object;
use toad_jni::java::StaticMethod;
static STRING_FORMAT: StaticMethod<String, fn(String, Vec<Object>) -> String> =
StaticMethod::new("format");
建议将这些结构体存储在局部 static
变量中,以便它们可以缓存类的内部 JNI ID 和方法,但这不是必需的。
示例
考虑以下 Java 类
package com.foo.bar;
public class Foo {
public final static long NUMBER = 123;
public String bingus = "bingus";
public Foo() { }
public static String bar() {
return "bar";
}
public void setBingus(String newBingus) {
this.bingus = newBingus;
}
}
该类的 Rust API 将类似于
use toad_jni::java;
pub struct Foo(java::lang::Object);
java::object_newtype!(Foo);
impl java::Class for Foo {
const PATH: &'static str = "com/foo/bar/Foo";
}
impl Foo {
pub fn new(e: &mut java::Env) -> Self {
static CTOR: java::Constructor<Foo, fn()> = java::Constructor::new();
CTOR.invoke(e)
}
pub fn number(e: &mut java::Env) -> i64 {
static NUMBER: java::StaticField<Foo, i64> = java::StaticField::new("NUMBER");
NUMBER.get(e)
}
pub fn bar(e: &mut java::Env) -> String {
static BAR: java::StaticMethod<Foo, fn() -> String> = java::StaticMethod::new("bar");
BAR.invoke(e)
}
pub fn bingus(&self, e: &mut java::Env) -> String {
static BINGUS: java::Field<Foo, String> = java::Field::new("bingus");
BINGUS.get(e, self)
}
pub fn set_bingus(&self, e: &mut java::Env, s: String) {
static SET_BINGUS: java::Method<Foo, fn(String)> = java::Method::new("setBingus");
SET_BINGUS.invoke(e, self, s)
}
}
许可证
根据您的选择,许可协议为
- Apache 许可证 2.0 版本,(LICENSE-APACHE 或 http://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交以包含在作品中的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。
依赖项
~6–19MB
~219K SLoC