java_bindgen/
test_utils.rs1use 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}