use crate::{env::Env, signature::Signature, value::Value, Class, Type};
use jni::objects::{JObject, JValueGen};
#[derive(Clone, Copy)]
pub struct Object<'a> {
env: &'a Env<'a>,
object: &'a JObject<'a>,
}
impl<'a> Object<'a> {
pub fn new(env: &'a Env<'a>, object: &'a JObject<'a>) -> Object<'a> {
Object { env, object }
}
pub fn call_method(
&self,
name: &str,
signature: Signature,
args: &[Value],
) -> jni::errors::Result<JValueGen<JObject<'_>>> {
let signature: String = signature.into();
let mut jni_env = self.env.get_jni_env();
jni_env.call_method(
self.object,
name,
signature,
args
.iter()
.map(|o| self.env.new_value(*o))
.collect::<Vec<JValueGen<&JObject>>>()
.as_slice(),
)
}
pub fn get_field(
&self,
name: &str,
r#type: Type,
) -> jni::errors::Result<JValueGen<JObject<'_>>> {
let r#type: String = r#type.into();
let mut jni_env = self.env.get_jni_env();
jni_env.get_field(self.object, name, r#type)
}
pub fn set_field(
&self,
name: &str,
r#type: Type,
value: Value,
) -> jni::errors::Result<()> {
let r#type: String = r#type.into();
let mut jni_env = self.env.get_jni_env();
jni_env.set_field(self.object, name, r#type, self.env.new_value(value))
}
pub fn get_object(&self) -> &'a JObject<'a> {
self.object
}
pub fn get_class(&self) -> jni::errors::Result<Class> {
let jni_env = self.env.get_jni_env();
Ok(Class::new(self.env, jni_env.get_object_class(self.object)?))
}
}