Rustのj4rsクレートのメモ。
j4rs(Java for Rust)はRustからJavaのコードを呼び出すことが出来るクレート(ライブラリー)。
j4rsは内部でJNIを呼び出している。要するにj4rsはJNIのラッパーである。
〜 [dependencies] j4rs = "0.20.0"
j4rsはJava9以降に対応している。
(Java8でも専用のClassLoaderを指定すれば使えるらしい)
JvmBuilderのbuildメソッドによってJvmインスタンスが生成される。
このとき、JavaVMが作られている。
JavaVMを作る際は、環境変数JAVA_HOMEが設定されているときはその下のjavaコマンドが使われる。
環境変数JAVA_HOMEが設定されていないときは、パスが通っているjavaコマンドが使われる。
use j4rs::{errors::J4RsError, Instance, InvocationArg, JvmBuilder};
fn main() -> Result<(), J4RsError> { let mut builder = JvmBuilder::new(); let jvm = builder.build()?; let system_out: Instance = jvm.static_class_field("java.lang.System", "out")?; // System.out let arg = InvocationArg::try_from("hello, j4rs")?; jvm.invoke(&system_out, "println", &[arg])?; // System.out.println(arg) Ok(()) }
まず、JvmBuilderを使ってJvmインスタンスを作る。
JNIを呼び出すメソッドはJvm構造体に定義されているので、それを使う。
Javaのメソッドを呼び出す際の引数はInvocationArg列挙型で指定する。
メソッドの返り値(Javaから返されるインスタンス)はInstance構造体で返される。