use std::mem;
use log::debug;
use crate::{objects::JObject, JNIEnv};
pub struct AutoLocal<'a: 'b, 'b> {
obj: JObject<'a>,
env: &'b JNIEnv<'a>,
}
impl<'a, 'b> AutoLocal<'a, 'b> {
pub fn new(env: &'b JNIEnv<'a>, obj: JObject<'a>) -> Self {
AutoLocal { obj, env }
}
pub fn forget(self) -> JObject<'a> {
let obj = self.obj;
mem::forget(self);
obj
}
pub fn as_obj<'c>(&self) -> JObject<'c>
where
'a: 'c,
{
self.obj
}
}
impl<'a, 'b> Drop for AutoLocal<'a, 'b> {
fn drop(&mut self) {
let res = self.env.delete_local_ref(self.obj);
match res {
Ok(()) => {}
Err(e) => debug!("error dropping global ref: {:#?}", e),
}
}
}
impl<'a> From<&'a AutoLocal<'a, '_>> for JObject<'a> {
fn from(other: &'a AutoLocal) -> JObject<'a> {
other.as_obj()
}
}