java_bindgen/
r2j.rs

1use crate::prelude::*;
2use jni::objects::JObject;
3
4// Rust to Java
5pub trait IntoJavaType<'local, T> {
6    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<T>;
7}
8
9// Option<T>
10impl<'local, T, R> IntoJavaType<'local, R> for Option<T>
11where
12    R: Default,
13    T: IntoJavaType<'local, R>
14{
15    fn into_java(self, env: &mut JNIEnv<'local>) -> JResult<R> {
16        match self {
17            None => Ok(R::default()),
18            Some(v) => v.into_java(env)
19        }
20    }
21}
22
23// Java Void
24
25impl<'local> IntoJavaType<'local, JObject<'local>> for () {
26    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
27        Ok(JObject::null())
28    }
29}
30
31// Raw types (JNI) (Allows return raw type)
32
33impl<'local> IntoJavaType<'local, JObject<'local>> for JObject<'local> {
34    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
35        Ok(self)
36    }
37}
38
39impl<'local> IntoJavaType<'local, jni::objects::JString<'local>> for jni::objects::JString<'local> {
40    fn into_java(
41        self,
42        _: &mut jni::JNIEnv<'local>,
43    ) -> crate::JResult<jni::objects::JString<'local>> {
44        Ok(self)
45    }
46}
47
48impl<'local> IntoJavaType<'local, jni::objects::JByteArray<'local>>
49for jni::objects::JByteArray<'local>
50{
51    fn into_java(
52        self,
53        _: &mut jni::JNIEnv<'local>,
54    ) -> crate::JResult<jni::objects::JByteArray<'local>> {
55        Ok(self)
56    }
57}
58
59// Class primitives (Auto cast from primitives )
60
61impl<'local> IntoJavaType<'local, JObject<'local>> for u8 {
62    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
63        JByte(self as i8).into_java(env)
64    }
65}
66
67impl<'local> IntoJavaType<'local, JObject<'local>> for i8 {
68    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
69        let class = env
70            .find_class("java/lang/Byte")
71            .j_catch_ini(env, "i8 -> JByte")?;
72        let args = &[jni::objects::JValue::Byte(self)];
73        let new_obj = env
74            .call_static_method(class, "valueOf", "(B)Ljava/lang/Byte;", args)
75            .j_catch_ini(env, "i8 -> JByte")?;
76
77        new_obj.l().j_catch_ini(env, "i8 -> JByte")
78    }
79}
80
81impl<'local> IntoJavaType<'local, JObject<'local>> for i16 {
82    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
83        let class = env
84            .find_class("java/lang/Short")
85            .j_catch_ini(env, "i64 -> JShort")?;
86        let args = &[jni::objects::JValue::Short(self)];
87        let new_obj = env
88            .call_static_method(class, "valueOf", "(S)Ljava/lang/Short;", args)
89            .j_catch_ini(env, "i64 -> JShort")?;
90
91        new_obj.l().j_catch_ini(env, "i64 -> JShort")
92    }
93}
94
95impl<'local> IntoJavaType<'local, JObject<'local>> for i32 {
96    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
97        let args = &[jni::objects::JValue::Int(self)];
98        let class = env
99            .find_class("java/lang/Integer")
100            .j_catch_ini(env, "i32 -> JInt")?;
101        let obj = env
102            .call_static_method(class, "valueOf", "(I)Ljava/lang/Integer;", args)
103            .j_catch_ini(env, "i32 -> JInt")?;
104
105        obj.l().j_catch_ini(env, "i32 -> JInt")
106    }
107}
108
109impl<'local> IntoJavaType<'local, JObject<'local>> for i64 {
110    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
111        let class = env
112            .find_class("java/lang/Long")
113            .j_catch_ini(env, "i64 -> JLong")?;
114        let args = &[jni::objects::JValue::Long(self)];
115        let new_obj = env
116            .call_static_method(class, "valueOf", "(J)Ljava/lang/Long;", args)
117            .j_catch_ini(env, "i64 -> JLong")?;
118
119        new_obj.l().j_catch_ini(env, "i64 -> JLong")
120    }
121}
122
123impl<'local> IntoJavaType<'local, JObject<'local>> for f32 {
124    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
125        let args = &[jni::objects::JValue::Float(self)];
126        let class = env
127            .find_class("java/lang/Float")
128            .j_catch_ini(env, "f32 -> JFloat")?;
129        let obj = env
130            .call_static_method(class, "valueOf", "(F)Ljava/lang/Float;", args)
131            .j_catch_ini(env, "f32 -> JFloat")?;
132
133        obj.l().j_catch_ini(env, "f32 -> JFloat")
134    }
135}
136
137impl<'local> IntoJavaType<'local, JObject<'local>> for f64 {
138    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
139        let args = &[jni::objects::JValue::Double(self)];
140        let class = env
141            .find_class("java/lang/Double")
142            .j_catch_ini(env, "f64 -> JDouble")?;
143        let obj = env
144            .call_static_method(class, "valueOf", "(D)Ljava/lang/Double;", args)
145            .j_catch_ini(env, "f64 -> JDouble")?;
146
147        obj.l().j_catch_ini(env, "f64 -> JDouble")
148    }
149}
150
151impl<'local> IntoJavaType<'local, JObject<'local>> for bool {
152    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
153        let args = &[jni::objects::JValue::Bool(self as u8)];
154        let class = env
155            .find_class("java/lang/Boolean")
156            .j_catch_ini(env, "bool -> JBoolean")?;
157        let obj = env
158            .call_static_method(class, "valueOf", "(Z)Ljava/lang/Boolean;", args)
159            .j_catch_ini(env, "bool -> JBoolean")?;
160
161        obj.l().j_catch_ini(env, "bool -> JBoolean")
162    }
163}
164
165impl<'local> IntoJavaType<'local, JObject<'local>> for char {
166    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
167        let args = &[jni::objects::JValue::Char(self as u16)];
168        let class = env
169            .find_class("java/lang/Character")
170            .j_catch_ini(env, "char -> JChar")?;
171        let obj = env
172            .call_static_method(class, "valueOf", "(C)Ljava/lang/Character;", args)
173            .j_catch_ini(env, "char -> JChar")?;
174
175        obj.l().j_catch_ini(env, "char -> JChar")
176    }
177}
178
179// primitves
180
181impl<'local> IntoJavaType<'local, jni::sys::jbyte> for i8 {
182    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jbyte> {
183        Ok(self)
184    }
185}
186
187impl<'local> IntoJavaType<'local, jni::sys::jbyte> for u8 {
188    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jbyte> {
189        Ok(self as i8)
190    }
191}
192
193impl<'local> IntoJavaType<'local, jni::sys::jint> for i32 {
194    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jint> {
195        Ok(self)
196    }
197}
198
199impl<'local> IntoJavaType<'local, jni::sys::jlong> for i64 {
200    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jlong> {
201        Ok(self)
202    }
203}
204
205impl<'local> IntoJavaType<'local, jni::sys::jboolean> for bool {
206    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jboolean> {
207        Ok(self as u8)
208    }
209}
210
211impl<'local> IntoJavaType<'local, jni::sys::jchar> for char {
212    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jchar> {
213        Ok(self as u16)
214    }
215}
216
217impl<'local> IntoJavaType<'local, jni::sys::jshort> for i16 {
218    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jshort> {
219        Ok(self)
220    }
221}
222
223impl<'local> IntoJavaType<'local, jni::sys::jchar> for u16 {
224    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jchar> {
225        Ok(self)
226    }
227}
228
229impl<'local> IntoJavaType<'local, jni::sys::jfloat> for f32 {
230    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jfloat> {
231        Ok(self)
232    }
233}
234
235impl<'local> IntoJavaType<'local, jni::sys::jdouble> for f64 {
236    fn into_java(self, _: &mut jni::JNIEnv<'local>) -> crate::JResult<jni::sys::jdouble> {
237        Ok(self)
238    }
239}
240
241// primitves class wrappers
242
243impl<'local> IntoJavaType<'local, JObject<'local>> for JByte {
244    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
245        self.0.into_java(env)
246    }
247}
248
249impl<'local> IntoJavaType<'local, JObject<'local>> for JShort {
250    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
251        self.0.into_java(env)
252    }
253}
254
255impl<'local> IntoJavaType<'local, JObject<'local>> for JInt {
256    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
257        self.0.into_java(env)
258    }
259}
260
261impl<'local> IntoJavaType<'local, JObject<'local>> for JLong {
262    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
263        self.0.into_java(env)
264    }
265}
266
267impl<'local> IntoJavaType<'local, JObject<'local>> for JFloat {
268    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
269        self.0.into_java(env)
270    }
271}
272
273impl<'local> IntoJavaType<'local, JObject<'local>> for JDouble {
274    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
275        self.0.into_java(env)
276    }
277}
278
279impl<'local> IntoJavaType<'local, JObject<'local>> for JBoolean {
280    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
281        self.0.into_java(env)
282    }
283}
284
285impl<'local> IntoJavaType<'local, JObject<'local>> for JChar {
286    fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<JObject<'local>> {
287        self.0.into_java(env)
288    }
289}
290
291// byte array
292
293impl<'local> IntoJavaType<'local, jni::objects::JByteArray<'local>> for Vec<u8> {
294    fn into_java(
295        self,
296        env: &mut jni::JNIEnv<'local>,
297    ) -> crate::JResult<jni::objects::JByteArray<'local>> {
298        env.byte_array_from_slice(&self)
299            .j_catch_ini(env, "Vec<u8> -> JByteArray")
300    }
301}
302
303impl<'local> IntoJavaType<'local, jni::objects::JByteArray<'local>> for &[u8] {
304    fn into_java(
305        self,
306        env: &mut jni::JNIEnv<'local>,
307    ) -> crate::JResult<jni::objects::JByteArray<'local>> {
308        env.byte_array_from_slice(self)
309            .j_catch_ini(env, "&[u8] -> JByteArray")
310    }
311}
312
313// String
314
315impl<'local> IntoJavaType<'local, jni::objects::JString<'local>> for String {
316    fn into_java(
317        self,
318        env: &mut jni::JNIEnv<'local>,
319    ) -> crate::JResult<jni::objects::JString<'local>> {
320        env.new_string(self).j_catch_ini(env, "String -> JString")
321    }
322}
323
324impl<'local> IntoJavaType<'local, jni::objects::JString<'local>> for &str {
325    fn into_java(
326        self,
327        env: &mut jni::JNIEnv<'local>,
328    ) -> crate::JResult<jni::objects::JString<'local>> {
329        env.new_string(self).j_catch_ini(env, "&str -> JString")
330    }
331}
332
333// byte array (JObject)
334
335impl<'local> IntoJavaType<'local, jni::objects::JObject<'local>> for Vec<u8> {
336    fn into_java(
337        self,
338        env: &mut jni::JNIEnv<'local>,
339    ) -> crate::JResult<jni::objects::JObject<'local>> {
340        let array = env
341            .byte_array_from_slice(&self)
342            .j_catch_ini(env, "Vec<u8> -> JByteArray")?;
343
344        Ok(JObject::from(array))
345    }
346}
347
348impl<'local> IntoJavaType<'local, jni::objects::JObject<'local>> for &[u8] {
349    fn into_java(
350        self,
351        env: &mut jni::JNIEnv<'local>,
352    ) -> crate::JResult<jni::objects::JObject<'local>> {
353        let array = env
354            .byte_array_from_slice(&self)
355            .j_catch_ini(env, "Vec<u8> -> JByteArray")?;
356
357        Ok(JObject::from(array))
358    }
359}
360
361// String (JObject)
362
363impl<'local> IntoJavaType<'local, jni::objects::JObject<'local>> for String {
364    fn into_java(
365        self,
366        env: &mut jni::JNIEnv<'local>,
367    ) -> crate::JResult<jni::objects::JObject<'local>> {
368        let string = env.new_string(self).j_catch_ini(env, "String -> JString")?;
369        Ok(JObject::from(string))
370    }
371}
372
373impl<'local> IntoJavaType<'local, jni::objects::JObject<'local>> for &str {
374    fn into_java(
375        self,
376        env: &mut jni::JNIEnv<'local>,
377    ) -> crate::JResult<jni::objects::JObject<'local>> {
378        let string = env.new_string(self).j_catch_ini(env, "String -> JString")?;
379        Ok(JObject::from(string))
380    }
381}