1
2use jni::sys::*;
3use jni::objects::JValue;
4use jni::JNIEnv;
5
6use crate::{
7 IsA,
8 JReturnType,
9 JBindingType
10};
11
12
13unsafe impl JBindingType for jboolean {
14 const SIGNATURE: &'static str = "Z";
15 const NAME: &'static str = "boolean";
16
17 unsafe fn to_jvalue(&self) -> jvalue {
18 jvalue { z: *self }
19 }
20 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
21 JValue::Bool(*self)
22 }
23}
24
25unsafe impl IsA<jboolean> for jboolean{
26 unsafe fn as_ref(&self) -> &jboolean {
27 self
28 }
29}
30
31unsafe impl JReturnType for jboolean {
32 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
33 const NAME: &'static str = <Self as JBindingType>::NAME;
34 const JNI_RETURN_TY: jni::signature::ReturnType =
35 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Boolean);
36
37 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
38 value.z
39 }
40}
41
42unsafe impl JBindingType for jbyte {
43 const SIGNATURE: &'static str = "B";
44 const NAME: &'static str = "byte";
45
46 unsafe fn to_jvalue(&self) -> jvalue {
47 jvalue { b: *self }
48 }
49
50 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
51 JValue::Byte(*self)
52 }
53}
54
55unsafe impl IsA<Self> for jbyte{
56 unsafe fn as_ref(&self) -> &Self {
57 self
58 }
59}
60
61unsafe impl JReturnType for jbyte {
62 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
63 const NAME: &'static str = <Self as JBindingType>::NAME;
64 const JNI_RETURN_TY: jni::signature::ReturnType =
65 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Byte);
66
67 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
68 value.b
69 }
70}
71
72unsafe impl JBindingType for jchar {
73 const SIGNATURE: &'static str = "C";
74 const NAME: &'static str = "char";
75
76 unsafe fn to_jvalue(&self) -> jvalue {
77 jvalue { c: *self }
78 }
79
80 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
81 JValue::Char(*self)
82 }
83}
84
85unsafe impl IsA<Self> for jchar{
86 unsafe fn as_ref(&self) -> &Self {
87 self
88 }
89}
90
91unsafe impl JReturnType for jchar {
92 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
93 const NAME: &'static str = <Self as JBindingType>::NAME;
94 const JNI_RETURN_TY: jni::signature::ReturnType =
95 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Char);
96
97 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
98 value.c
99 }
100}
101
102unsafe impl JBindingType for jshort {
103 const SIGNATURE: &'static str = "S";
104 const NAME: &'static str = "short";
105
106 unsafe fn to_jvalue(&self) -> jvalue {
107 jvalue { s: *self }
108 }
109
110 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
111 JValue::Short(*self)
112 }
113}
114
115unsafe impl IsA<Self> for jshort{
116 unsafe fn as_ref(&self) -> &Self {
117 self
118 }
119}
120
121unsafe impl JReturnType for jshort {
122 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
123 const NAME: &'static str = <Self as JBindingType>::NAME;
124 const JNI_RETURN_TY: jni::signature::ReturnType =
125 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Short);
126
127 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
128 value.s
129 }
130}
131
132unsafe impl JBindingType for jint {
133 const SIGNATURE: &'static str = "I";
134 const NAME: &'static str = "int";
135
136 unsafe fn to_jvalue(&self) -> jvalue {
137 jvalue { i: *self }
138 }
139
140 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
141 JValue::Int(*self)
142 }
143}
144
145unsafe impl IsA<Self> for jint{
146 unsafe fn as_ref(&self) -> &Self {
147 self
148 }
149}
150
151unsafe impl JReturnType for jint {
152 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
153 const NAME: &'static str = <Self as JBindingType>::NAME;
154 const JNI_RETURN_TY: jni::signature::ReturnType =
155 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Int);
156
157 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
158 value.i
159 }
160}
161
162unsafe impl JBindingType for jlong {
163 const SIGNATURE: &'static str = "J";
164 const NAME: &'static str = "long";
165
166 unsafe fn to_jvalue(&self) -> jvalue {
167 jvalue { j: *self }
168 }
169
170 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
171 JValue::Long(*self)
172 }
173}
174
175unsafe impl IsA<Self> for jlong{
176 unsafe fn as_ref(&self) -> &Self {
177 self
178 }
179}
180
181unsafe impl JReturnType for jlong {
182 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
183 const NAME: &'static str = <Self as JBindingType>::NAME;
184 const JNI_RETURN_TY: jni::signature::ReturnType =
185 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Long);
186
187 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
188 value.j
189 }
190}
191
192unsafe impl JBindingType for jfloat {
193 const SIGNATURE: &'static str = "F";
194 const NAME: &'static str = "float";
195
196 unsafe fn to_jvalue(&self) -> jvalue {
197 jvalue { f: *self }
198 }
199
200 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
201 JValue::Float(*self)
202 }
203}
204
205unsafe impl IsA<Self> for jfloat{
206 unsafe fn as_ref(&self) -> &Self {
207 self
208 }
209}
210
211unsafe impl JReturnType for jfloat {
212 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
213 const NAME: &'static str = <Self as JBindingType>::NAME;
214 const JNI_RETURN_TY: jni::signature::ReturnType =
215 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Float);
216
217 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
218 value.f
219 }
220}
221
222unsafe impl JBindingType for jdouble {
223 const SIGNATURE: &'static str = "D";
224 const NAME: &'static str = "double";
225
226 unsafe fn to_jvalue(&self) -> jvalue {
227 jvalue { d: *self }
228 }
229
230 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
231 JValue::Double(*self)
232 }
233}
234
235unsafe impl IsA<Self> for jdouble{
236 unsafe fn as_ref(&self) -> &Self {
237 self
238 }
239}
240
241unsafe impl JReturnType for jdouble {
242 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
243 const NAME: &'static str = <Self as JBindingType>::NAME;
244 const JNI_RETURN_TY: jni::signature::ReturnType =
245 jni::signature::ReturnType::Primitive(jni::signature::Primitive::Double);
246
247 unsafe fn from_jvalue(_env: &mut JNIEnv, value: jvalue) -> Self {
248 value.d
249 }
250}
251
252pub struct JByteArray {
253 _obj: jni::objects::GlobalRef,
254}
255
256unsafe impl JBindingType for JByteArray {
257 const SIGNATURE: &'static str = "[B";
258 const NAME: &'static str = "byte[]";
259
260 unsafe fn to_jvalue(&self) -> jvalue {
261 jvalue {
262 l: self._obj.as_raw(),
263 }
264 }
265
266 unsafe fn to_jvalue_ref<'obj_ref>(&'obj_ref self) -> JValue<'_, 'obj_ref> {
267 JValue::Object(&self._obj)
268 }
269}
270
271unsafe impl JReturnType for JByteArray {
272 const SIGNATURE: &'static str = <Self as JBindingType>::SIGNATURE;
273 const NAME: &'static str = <Self as JBindingType>::NAME;
274 const JNI_RETURN_TY: jni::signature::ReturnType = jni::signature::ReturnType::Array;
275
276 unsafe fn from_jvalue(env: &mut JNIEnv, value: jvalue) -> Self {
277 let o = jni::objects::JByteArray::from_raw(value.l);
278 let r = env.new_global_ref(o).expect("failed to create global ref");
279
280 JByteArray {
281 _obj: r,
282 }
283 }
284}