use crate::{env::Env, signature::Signature, value::Value, Type};
use jni::objects::{JClass, JObject, JValueGen};
pub struct Class<'a> {
env: &'a Env<'a>,
class: JClass<'a>,
}
impl<'a> Class<'a> {
pub fn new(env: &'a Env<'a>, class: JClass<'a>) -> Class<'a> {
Class { env, class }
}
pub fn call_static_method(
&self,
name: &str,
signature: Signature,
args: &[Value],
) -> jni::errors::Result<JValueGen<JObject<'_>>> {
let class = &self.class;
let signature: String = signature.into();
let mut jni_env = self.env.get_jni_env();
jni_env.call_static_method(
class,
name,
signature,
args
.iter()
.map(|o| self.env.value(*o))
.collect::<Vec<JValueGen<&JObject>>>()
.as_slice(),
)
}
pub fn new_instance(&self, signature: Signature, args: &[Value]) -> jni::errors::Result<JObject> {
let class = &self.class;
let signature: String = signature.into();
let mut jni_env = self.env.get_jni_env();
jni_env.new_object(
class,
signature,
args
.iter()
.map(|o| self.env.value(*o))
.collect::<Vec<JValueGen<&JObject>>>()
.as_slice(),
)
}
pub fn get_static_field(
&self,
name: &str,
r#type: Type,
) -> jni::errors::Result<JValueGen<JObject<'_>>> {
let class = &self.class;
let r#type: String = r#type.to_string();
let mut jni_env = self.env.get_jni_env();
jni_env.get_static_field(class, name, r#type)
}
pub fn get_class(self) -> JClass<'a> {
self.class
}
}