29个版本 (10个破坏性版本)

0.11.2 2023年7月31日
0.10.2 2023年7月27日

#536Rust模式

Download history 7/week @ 2024-03-14 62/week @ 2024-03-28 32/week @ 2024-04-04

每月211次下载

MIT许可证

45KB
1K SLoC

jnat

jni crate的包装器

查看文档

示例

使用cargo new --lib mylib创建一个新的Cargo库项目,并在Cargo.toml中添加以下内容

[dependencies]
jnat = [latest version]

[lib]
crate-type = ["cdylib"]

src/lib.rs中添加以下内容

use jnat::{
  jnat_macros::jnat,
  jni::{objects::JClass, JNIEnv}, // jni crate, re-exported by jnat
  Class,
  Env,
  Signature,
  Type,
};

jnat!(HelloWorld, caller, (JNIEnv, JClass) -> ());

fn caller(env: JNIEnv, class: JClass) {
  let mut env = Env::new(&env);
  let class = Class::new(&mut env, class);

  class
    .call_static_method("hello", Signature::new(&[], Type::Void), &[])
    .unwrap();
}

然后,运行cargo build。创建一个名为HelloWorld.java的新文件,并添加以下内容

public class HelloWorld {
  private static native void caller();

  static {
    System.loadLibrary("mylib");
  }

  public static void main(String[] args) {
    HelloWorld.caller();
  }

  public static void hello() {
    System.out.println("Hello, world!");
  }
}

使用javac -h . HelloWorld.java编译Java文件。然后,运行java -Djava.library.path=path/to/target/debug HelloWorld。你应该会在控制台看到Hello, world!被打印出来。

注意

  • Jnat默认导出jni。如果您想使用jni的不同版本,您可以禁用默认功能或jni功能。
  • Jnat导出一个宏,jnat::jnat_macros::jnat(如上例所示),该宏用于生成Java_HelloWorld_caller函数。可以通过禁用默认功能或jni-macros功能来禁用此宏。请注意,宏保留原始函数以防止不直观的行为(因此,您可以在Rust代码中仅调用example()而不是Java_org_example_Class_example(),同时仍然允许Java调用它)。

依赖项

~1–13MB
~100K SLoC