1use jni::{
2 errors::Result,
3 sys::{jbyte, jbyteArray, jint},
4 JNIEnv,
5};
6use std::slice;
7
8pub fn slice_to_byte_array<'a, 'b>(env: &'a JNIEnv<'a>, slice: &'b [u8]) -> Result<jbyteArray> {
15 let obj = env.new_byte_array(slice.len() as jint)?;
16 let slice = unsafe { &*(slice as *const [u8] as *const [jbyte]) };
17 env.set_byte_array_region(obj, 0, slice)?;
18 Ok(obj)
19}
20
21pub fn byte_array_to_vec<'a>(env: &'a JNIEnv<'a>, obj: jbyteArray) -> Result<Vec<u8>> {
28 let size = env.get_array_length(obj)? as usize;
29 let mut result = Vec::with_capacity(size);
30 unsafe {
31 let result_slice = slice::from_raw_parts_mut(result.as_mut_ptr() as *mut jbyte, size);
32 env.get_byte_array_region(obj, 0, result_slice)?;
33 result.set_len(size);
34 }
35 Ok(result)
36}
37
38#[cfg(test)]
39mod test {
40 use crate::test_utils;
41
42 #[test]
43 fn test_slice_to_byte_array() {
44 test_utils::JVM_ENV.with(|env| {
45 let obj = super::slice_to_byte_array(env, &[1, 2, 3, 4, 5]).unwrap();
46 assert_eq!(env.get_array_length(obj).unwrap(), 5);
47
48 let mut bytes = [0i8; 5];
49 env.get_byte_array_region(obj, 0, &mut bytes).unwrap();
50 assert_eq!(bytes, [1, 2, 3, 4, 5]);
51 });
52 }
53
54 #[test]
55 fn test_byte_array_to_vec() {
56 test_utils::JVM_ENV.with(|env| {
57 let obj = env.new_byte_array(5).unwrap();
58 env.set_byte_array_region(obj, 0, &[1, 2, 3, 4, 5]).unwrap();
59
60 let vec = super::byte_array_to_vec(env, obj).unwrap();
61 assert_eq!(vec, vec![1, 2, 3, 4, 5]);
62 });
63 }
64}