use jni::JNIEnv;
use jni::JavaVM;
use jni::AttachGuard;
use std::sync::{Arc, OnceLock};
static JVM_INSTANCE: OnceLock<Arc<JavaVM>> = OnceLock::new();
pub struct RiJavaContext {
jvm: Arc<JavaVM>,
}
impl RiJavaContext {
pub fn init(env: JNIEnv) -> Self {
let jvm = env.get_java_vm().expect("Failed to get JavaVM");
let jvm_arc = Arc::new(jvm);
let _ = JVM_INSTANCE.set(jvm_arc.clone());
Self { jvm: jvm_arc }
}
pub fn get_env(&self) -> AttachGuard<'_> {
self.jvm
.attach_current_thread()
.expect("Failed to attach current thread to JVM")
}
pub fn get_jvm() -> Option<Arc<JavaVM>> {
JVM_INSTANCE.get().cloned()
}
}
pub fn get_env() -> Option<AttachGuard<'static>> {
JVM_INSTANCE.get().and_then(|jvm| {
jvm.attach_current_thread().ok()
})
}