use std::marker::PhantomData;
use jni_sys::*;
use crate::{Env, Global, Local, Ref, ReferenceType};
#[repr(transparent)]
pub struct Arg<T: ReferenceType> {
object: jobject,
_class: PhantomData<T>,
}
impl<T: ReferenceType> Arg<T> {
pub unsafe fn from_raw(object: jobject) -> Self {
Self {
object,
_class: PhantomData,
}
}
pub fn as_raw(&self) -> jobject {
self.object
}
pub unsafe fn into_ref<'env>(self, env: Env<'env>) -> Option<Ref<'env, T>> {
if self.object.is_null() {
None
} else {
Some(Ref::from_raw(env, self.object))
}
}
pub unsafe fn into_local<'env>(self, env: Env<'env>) -> Option<Local<'env, T>> {
if self.object.is_null() {
None
} else {
Some(Local::from_raw(env, self.object))
}
}
pub unsafe fn into_global(self, env: Env) -> Option<Global<T>> {
if self.object.is_null() {
None
} else {
let jnienv = env.as_raw();
let object = ((**jnienv).v1_2.NewGlobalRef)(jnienv, self.object);
Some(Global::from_raw(env.vm(), object))
}
}
}