参考资料:
https://docs.rs/jni/latest/jni/
https://github.com/jni-rs/jni-rs/tree/master/example
首先,创建一个 HelloWorld.java 文件
class HelloWorld { private static native String hello(String input); static { System.loadLibrary("mylib"); } public static void main(String[] args) { String output = HelloWorld.hello("josh"); System.out.println(output); } }
编译这个文件,并生成 .h 头文件
javac -h . HelloWorld.java 或者用全路径 /usr/lib/jvm/java-11-openjdk-amd64/bin/javac HelloWorld.java -h .
可以看到 生成了一个HelloWorld.h文件
3. 创建rust 库
cargo --lib new mylib
4. 编辑Cargo.toml
... [dependencies] jni = "*" [lib] crate_type = ["cdylib"]
5. 创建 mylib/src/lib.rs
use jni::JNIEnv; use jni::objects::{JClass, JString}; use jni::sys::jstring; #[no_mangle] pub extern "system" fn Java_HelloWorld_hello(env: JNIEnv, _: JClass, input: JString) -> jstring { let input: String = env.get_string(input).expect("Couldn't get java string!").into(); let output = env.new_string(format!("Hello, {}!", input)) .expect("Couldn't create java string!"); output.into_inner() }
6. 编译运行
cd mylib cargo build cd .. LD_LIBRARY_PATH=/path/to/mylib/target/debug java HelloWorld 或者 java -Djava.library.path=mylib/target/debug/ HelloWorld