S-JIS[2024-09-21] 変更履歴

j4rs Jvm

Rustj4rsのJvmのメモ。


概要

Jvmは、JNIを呼び出すためメソッドが用意されている構造体
JvmインスタンスはJvmBuilderで生成する。

use j4rs::Jvm;
    let jvm: Jvm = JvmBuilder::new().〜.build()?;

Javaのオブジェクト(インスタンス)はInstance構造体で表される。
Javaのプリミティブ型の値やnullもInstanceで表される。

メソッド(やコンストラクター)の引数にはInvocationArg列挙型を渡す。
InvocationArgは、Javaとしての引数の型と値をペアで保持する。


Jvmの各メソッドの戻り型のResultは、標準ライブラリー(std)のResultではなく、j4rs::errors::Result

これは以下のような感じで定義されている。(標準ライブラリーのResultのエイリアス(別名))

pub type Result<T> = std::result::Result<T, J4RsError>;

Jvmのメソッド

Jvmのメソッド(抜粋)。


Jvmの初期設定に関するメソッド

メソッド 説明
deploy_artifact<T: JavaArtifact>(&self, artifact: &T) -> Result<()> 指定されたアーティファクト(jarファイル)をクラスパスに追加する。 アーティファクトの例

Javaのインスタンスを操作するメソッド

メソッド 説明 Java相当
create_instance(&self, class_name: &str, inv_args: &[impl Borrow<InvocationArg>]) -> Result<Instance> 指定されたクラスのインスタンスを生成する。
(コンストラクターを呼び出す)
let s = jvm.create_instance("java.lang.String", InvocationArg::empty())?; var s = new java.lang.String();
static_class(&self, class_name: &str) -> Result<Instance> 指定されたクラスのstaticメソッドやstaticフィールドへのアクセス用Instanceを取得する。 let system = jvm.static_class("java.lang.System")?;
let system_out = jvm.field("out")?;
var systemOut = java.lang.System.out;
invoke(&self, instance: &Instance, method_name: &str, inv_args: &[impl Borrow<InvocationArg>]) -> Result<Instance> Instanceのメソッドを呼び出す。 let arg = InvocationArg::try_from("abc")?;
jvm.invoke(&system_out, "println", &[arg])?;
 
var arg = "abc";
systemOut.println(arg);
field(&self, instance: &Instance, field_name: &str) -> Result<Instance> Instanceのフィールドの値を取得する。 let point = jvm.create_instance("java.awt.Point", InvocationArg::empty())?;
let x = jvm.field(&point, "x")?;
let x: i32 = jvm.to_rust(x)?;
 
var point = new java.awt.Point();
int x = point.x;
static_class_field(&self, class_name: &str, field_name: &str) -> Result<Instance> 指定されたクラスのstaticフィールドの値を取得する。
Javaの列挙型の列挙子もこのメソッドで取得できる。
let system_out = jvm.static_class_field("java.lang.System", "out")?; var systemOut = java.lang.System.out;
invoke_static(&self, class_name: &str, method_name: &str, inv_args: &[impl Borrow<InvocationArg>]) -> Result<Instance> 指定されたクラスのstaticメソッドを呼び出す。 let arg = InvocationArg::try_from(123)?;
let s = jvm.invoke_static("java.lang.String", "valueOf", &[arg])?;
var arg = 123;
var s = java.lang.String.valueOf(arg);
cast(&self, from_instance: &Instance, to_class: &str) -> Result<Instance> 指定されたクラスにキャストしたInstanceを作る。 let s = jvm.create_instance("java.lang.String", InvocationArg::empty())?;
let o = jvm.cast(&s, "java.lang.Object")?;
var s = new java.lang.String();
var o = (java.lang.Object)s;
check_equals(&self, instance: impl Borrow<Instance>, inv_arg: impl Borrow<InvocationArg>) -> Result<bool> Javaのequalsメソッドによる比較を行う。
プリミティブ型にも対応している。
nullチェックの例
let s1 = jvm.create_instance("java.lang.String", InvocationArg::empty())?;
let s2 = jvm.create_instance("java.lang.String", InvocationArg::empty())?;
let check = jvm.check_equals(&s1, InvocationArg::from(s2))?;
var s1 = new java.lang.String();
var s2 = new java.lang.String();
var check = s1.equals(s2);
clone_instance(&self, instance: &Instance) -> Result<Instance> Instanceの複製を作る。
(Javaのcloneメソッドの呼び出しではない)
let s = jvm.create_instance("java.lang.String", InvocationArg::empty())?;
let s2 = jvm.clone_instance(&s)?;
 

RustとJavaの値の変換を行うメソッド

メソッド 説明 Java相当
to_rust<T>(&self, instance: Instance) -> Result<T> jInstanceをRustのデータ型の値に変換する。
let t = jvm.invoke_static("java.lang.System", "currentTimeMillis", InvocationArg::empty())?;
let t: i64 = jvm.to_rust(t)?;
long t = java.lang.System.currentTimeMillis();
to_rust_boxed<T>(&self, instance: Instance) -> Result<Box<T>> jInstanceをRustのデータ型の値に変換する。    
java_list(&self, inner_class_name: impl Into<&str>, inv_args: Vec<impl TryInto<InvocationArg, Error=J4RsError>>) -> Result<Instance> JavaのListを作成する。 let v = vec!["a", "b", "c"];
let list = jvm.java_list("java.lang.String", v)?;
var list = java.util.Arrays.<java.lang.String>asList("a", "b", "c");
java_map(&self, key_class_name: impl Into<str>, value_class_name: impl Into<&str>, inv_args: HashMap<impl TryInto<InvocationArg, Error=J4RsError>, impl TryInto<InvocationArg, Error=J4RsError>>) -> Result<Instance> JavaのMapを作成する。 let m = HashMap::from([
    ("a", 1),
    ("b", 2),
]);
let map = jvm.java_map("java.lang.String", "java.lang.Integer", m)?;
var map = java.util.HashMap<java.lang.String, java.lang.Integer>();
map.put("a", 1);
map.put("b", 2);

j4rsへ戻る / Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま