java_bindgen/
test_utils.rs

1use std::sync::{Arc, OnceLock};
2
3use jni::objects::JClass;
4
5static JVM_CACHE: OnceLock<Arc<jni::JavaVM>> = OnceLock::new();
6
7pub fn get_jvm() -> Arc<jni::JavaVM> {
8    JVM_CACHE
9        .get_or_init(|| {
10            let args = jni::InitArgsBuilder::new()
11                .version(jni::JNIVersion::V8)
12                .option("-Xcheck:jni")
13                .build()
14                .expect("Failed to parse JVM args");
15            let jvm = jni::JavaVM::new(args).expect("Failed to start JVM");
16            Arc::new(jvm)
17        })
18        .clone()
19}
20
21pub fn run_in_jvm(
22    fun: for<'a> fn(&mut jni::JNIEnv<'a>, jni::JNIEnv<'a>, JClass) -> crate::exception::JResult<()>,
23) -> crate::JResult<()> {
24    let jvm = get_jvm();
25    let mut test_env = jvm.attach_current_thread_as_daemon()?;
26    let env = jvm.attach_current_thread_as_daemon()?;
27    fun(&mut test_env, env, JClass::default())
28}