rus jni

参考资料:
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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注