From a12c26328ca930e0e8619ae9258dcd167889c99b Mon Sep 17 00:00:00 2001 From: zaaarf Date: Sun, 22 Sep 2024 18:53:39 +0200 Subject: [PATCH] feat: tentative Vec impl for objects --- src/lib.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index f8542d0..a6670df 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -140,14 +140,14 @@ impl<'j> IntoJava<'j> for String { } } -impl<'j> IntoJava<'j> for Vec { +impl<'j, E> IntoJava<'j> for Vec where E: JavaArrayElement<'j> + IntoJava<'j, T: std::convert::AsRef>> { type T = jni::sys::jobjectArray; fn into_java(self, env: &mut jni::JNIEnv<'j>) -> Result { - let mut array = env.new_object_array(self.len() as i32, "java/lang/String", JObject::null())?; + let mut array = env.new_object_array(self.len() as i32, E::class(), JObject::null())?; for (n, el) in self.into_iter().enumerate() { - let string = env.new_string(el)?; - env.set_object_array_element(&mut array, n as i32, string)?; + let el = el.into_java(env)?; + env.set_object_array_element(&mut array, n as i32, &el)?; } Ok(array.into_raw()) } @@ -175,3 +175,15 @@ impl<'j> IntoJava<'j> for uuid::Uuid { .map(|j| j.as_raw()) } } + +pub trait JavaArrayElement<'j> { + type T; + fn class() -> &'static str; +} + +impl<'j> JavaArrayElement<'j> for String { + type T = jni::objects::JString<'j>; + fn class() -> &'static str { + "java/lang/String" + } +}