typed_jni/array/
object.rs

1use typed_jni_core::{JNIEnv, StrongRef};
2
3use crate::{Array, Class, LocalObject, Object, ObjectType, TypedArrayExt, TypedRef, builtin::JavaThrowable};
4
5/// Extension methods for typed object arrays.
6pub trait TypedObjectArrayExt: TypedArrayExt {
7    /// Create a new object array.
8    fn typed_new_array<T: ObjectType, R: StrongRef>(
9        &self,
10        cls: &Class<R, T>,
11        len: i32,
12    ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>>;
13
14    /// Create a new object array with initial value.
15    fn typed_new_array_with_initial<T: ObjectType, R: StrongRef, IR: StrongRef>(
16        &self,
17        cls: &Class<R, T>,
18        len: i32,
19        initial: &Object<IR, T>,
20    ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>>;
21
22    /// Get an element from object array.
23    fn typed_get_array_element<T: ObjectType, R: StrongRef>(
24        &self,
25        arr: &Object<R, Array<T>>,
26        index: i32,
27    ) -> Result<Option<LocalObject<'_, T>>, LocalObject<'_, JavaThrowable>>;
28
29    /// Set an element to object array.
30    fn typed_set_array_element<T: ObjectType, R: StrongRef>(
31        &self,
32        arr: &Object<R, Array<T>>,
33        index: i32,
34        value: Option<&Object<R, T>>,
35    ) -> Result<(), LocalObject<'_, JavaThrowable>>;
36}
37
38impl<'vm> TypedObjectArrayExt for JNIEnv<'vm> {
39    fn typed_new_array<T: ObjectType, R: StrongRef>(
40        &self,
41        cls: &Class<R, T>,
42        len: i32,
43    ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>> {
44        unsafe {
45            self.new_object_array(&**cls, len)
46                .map(|v| LocalObject::from_ref(v))
47                .map_err(|err| LocalObject::from_ref(err))
48        }
49    }
50
51    fn typed_new_array_with_initial<T: ObjectType, R: StrongRef, IR: StrongRef>(
52        &self,
53        cls: &Class<R, T>,
54        len: i32,
55        initial: &Object<IR, T>,
56    ) -> Result<LocalObject<'_, Array<T>>, LocalObject<'_, JavaThrowable>> {
57        unsafe {
58            self.new_object_array_with_initial(&**cls, len, &**initial)
59                .map(|v| LocalObject::from_ref(v))
60                .map_err(|err| LocalObject::from_ref(err))
61        }
62    }
63
64    fn typed_get_array_element<T: ObjectType, R: StrongRef>(
65        &self,
66        arr: &Object<R, Array<T>>,
67        index: i32,
68    ) -> Result<Option<LocalObject<'_, T>>, LocalObject<'_, JavaThrowable>> {
69        unsafe {
70            self.get_object_array_element(&**arr, index)
71                .map(|v| v.map(|v| LocalObject::from_ref(v)))
72                .map_err(|err| LocalObject::from_ref(err))
73        }
74    }
75
76    fn typed_set_array_element<T: ObjectType, R: StrongRef>(
77        &self,
78        arr: &Object<R, Array<T>>,
79        index: i32,
80        value: Option<&Object<R, T>>,
81    ) -> Result<(), LocalObject<'_, JavaThrowable>> {
82        unsafe {
83            self.set_object_array_element(&**arr, index, value.map(|v| &**v))
84                .map_err(|err| LocalObject::from_ref(err))
85        }
86    }
87}