29个版本 (10个破坏性版本)
0.11.2 | 2023年7月31日 |
---|---|
0.10.2 | 2023年7月27日 |
#536 在 Rust模式
每月211次下载
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