Skip to content

Commit 85707fe

Browse files
committed
feat: into_java_object for primitive arrays
1 parent d0dbd2d commit 85707fe

File tree

1 file changed

+67
-9
lines changed

1 file changed

+67
-9
lines changed

src/into_java.rs

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ macro_rules! auto_into_java_object {
7979
}
8080

8181
auto_into_java_object!(jni::objects::JString<'j>, "java/lang/String");
82-
//auto_into_java_object!(jni::objects::JObjectArray<'j>, "java/lang/Object[]");
83-
//auto_into_java_object!(jni::objects::JIntArray<'j>, "java/lang/Integer[]");
84-
//auto_into_java_object!(jni::objects::JLongArray<'j>, "java/lang/Long[]");
85-
//auto_into_java_object!(jni::objects::JShortArray<'j>, "java/lang/Short[]");
86-
//auto_into_java_object!(jni::objects::JByteArray<'j>, "java/lang/Byte[]");
87-
//auto_into_java_object!(jni::objects::JCharArray<'j>, "java/lang/Char[]");
88-
//auto_into_java_object!(jni::objects::JFloatArray<'j>, "java/lang/Float[]");
89-
//auto_into_java_object!(jni::objects::JDoubleArray<'j>, "java/lang/Double[]");
90-
//auto_into_java_object!(jni::objects::JBooleanArray<'j>, "java/lang/Boolean[]");
82+
auto_into_java_object!(jni::objects::JObjectArray<'j>, "java/lang/Object[]");
83+
auto_into_java_object!(jni::objects::JIntArray<'j>, "java/lang/Integer[]");
84+
auto_into_java_object!(jni::objects::JLongArray<'j>, "java/lang/Long[]");
85+
auto_into_java_object!(jni::objects::JShortArray<'j>, "java/lang/Short[]");
86+
auto_into_java_object!(jni::objects::JByteArray<'j>, "java/lang/Byte[]");
87+
auto_into_java_object!(jni::objects::JCharArray<'j>, "java/lang/Char[]");
88+
auto_into_java_object!(jni::objects::JFloatArray<'j>, "java/lang/Float[]");
89+
auto_into_java_object!(jni::objects::JDoubleArray<'j>, "java/lang/Double[]");
90+
auto_into_java_object!(jni::objects::JBooleanArray<'j>, "java/lang/Boolean[]");
9191

9292

9393
impl<'j> IntoJavaObject<'j> for &str {
@@ -126,6 +126,64 @@ impl<'j, T: IntoJavaObject<'j>> IntoJavaObject<'j> for Option<T> {
126126
}
127127
}
128128

129+
macro_rules! auto_into_java_object_primitive_array {
130+
($t:ty, $fn_new:ident, $fn_set:ident, $clazz:literal) => {
131+
impl<'j> IntoJavaObject<'j> for Vec<$t> {
132+
const CLASS: &'static str = $clazz;
133+
fn into_java_object(self, env: &mut jni::JNIEnv<'j>) -> Result<JObject<'j>, jni::errors::Error> {
134+
let len = self.len()
135+
.try_into()
136+
.map_err(|_| jni::errors::Error::JniCall(jni::errors::JniError::InvalidArguments))?;
137+
let mut array = env.$fn_new(len)?;
138+
env.$fn_set(&mut array, 0, self.as_slice())?;
139+
Ok(array.into())
140+
}
141+
}
142+
};
143+
}
144+
145+
auto_into_java_object_primitive_array!(i8, new_byte_array, set_byte_array_region, "java/lang/Byte[]");
146+
auto_into_java_object_primitive_array!(i16, new_short_array, set_short_array_region, "java/lang/Short[]");
147+
auto_into_java_object_primitive_array!(i32, new_int_array, set_int_array_region, "java/lang/Integer[]");
148+
auto_into_java_object_primitive_array!(i64, new_long_array, set_long_array_region, "java/lang/Long[]");
149+
auto_into_java_object_primitive_array!(f32, new_float_array, set_float_array_region, "java/lang/Float[]");
150+
auto_into_java_object_primitive_array!(f64, new_double_array, set_double_array_region, "java/lang/Double[]");
151+
152+
impl<'j> IntoJavaObject<'j> for Vec<bool> {
153+
const CLASS: &'static str = "java/lang/Boolean[]";
154+
155+
fn into_java_object(self, env: &mut jni::JNIEnv<'j>) -> Result<JObject<'j>, jni::errors::Error> {
156+
let len = self.len()
157+
.try_into()
158+
.map_err(|_| jni::errors::Error::JniCall(jni::errors::JniError::InvalidArguments))?;
159+
let mut array = env.new_boolean_array(len)?;
160+
let new_self : Vec<u8> = self.into_iter().map(|x| if x { 1 } else { 0 }).collect();
161+
env.set_boolean_array_region(&mut array, 0, new_self.as_slice())?;
162+
Ok(array.into())
163+
}
164+
}
165+
166+
impl<'j> IntoJavaObject<'j> for Vec<char> {
167+
const CLASS: &'static str = "java/lang/Char[]";
168+
169+
fn into_java_object(self, env: &mut jni::JNIEnv<'j>) -> Result<JObject<'j>, jni::errors::Error> {
170+
let len = self.len()
171+
.try_into()
172+
.map_err(|_| jni::errors::Error::JniCall(jni::errors::JniError::InvalidArguments))?;
173+
let mut array = env.new_char_array(len)?;
174+
let mut new_self : Vec<u16> = Vec::new();
175+
for c in self {
176+
new_self.push(
177+
c
178+
.try_into()
179+
.map_err(|_| jni::errors::Error::JniCall(jni::errors::JniError::InvalidArguments))?
180+
);
181+
}
182+
env.set_char_array_region(&mut array, 0, new_self.as_slice())?;
183+
Ok(array.into())
184+
}
185+
}
186+
129187
#[cfg(feature = "uuid")]
130188
impl<'j> IntoJavaObject<'j> for uuid::Uuid {
131189
const CLASS: &'static str = "java/util/UUID";

0 commit comments

Comments
 (0)