jni_utils/
arrays.rs

1use jni::{
2    errors::Result,
3    sys::{jbyte, jbyteArray, jint},
4    JNIEnv,
5};
6use std::slice;
7
8/// Create a new Java byte array from the given slice.
9///
10/// # Arguments
11///
12/// * `env` - Java environment in which to create the new byte array.
13/// * `slice` - Slice to convert into a byte array.
14pub 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
21/// Get a [`Vec`] of bytes from the given Java byte array.
22///
23/// # Arguments
24///
25/// * `env` - Java environment to use.
26/// * `obj` - Byte array to convert into a [`Vec`].
27pub 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}