use crate::{Env, Global, Local, Ref, ReferenceType};
use jni_sys::*;
use std::marker::PhantomData;
#[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(unsafe { Ref::from_raw(env, self.object) })
}
}
pub unsafe fn into_local<'env>(self, env: Env<'env>) -> Option<Local<'env, T>> {
unsafe { self.into_ref(env) }.map(|r| r.as_local())
}
pub unsafe fn into_global(self, env: Env) -> Option<Global<T>> {
unsafe { self.into_ref(env) }.as_ref().map(Ref::as_global)
}
}