#java-class #coap #iot #networking #wasm #no-std

no-std toad-jni

JNI 抽象和绑定,用于 toad 生态系统

24 个版本 (14 个重大更新)

1.0.0 2023 年 5 月 22 日
0.16.1 2023 年 4 月 26 日

#14 in #java-class

MIT/Apache

660KB
14K SLoC

crates.io docs.rs Maintenance

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::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 许可证定义的,您有意提交以包含在作品中的任何贡献,都将按照上述方式双重许可,不附加任何额外条款或条件。

依赖项

~6–19MB
~219K SLoC