1use crate::prelude::*;
2use jni::objects::JObject;
3
4pub trait IntoJavaType<'local, T> {
6 fn into_java(self, env: &mut jni::JNIEnv<'local>) -> crate::JResult<T>;
7}
8
9impl<'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
23impl<'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
31impl<'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
59impl<'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
179impl<'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
241impl<'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
291impl<'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
313impl<'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
333impl<'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
361impl<'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}