jni_bind/
primitives.rs

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}