1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]

use swim_c_sys::{void, va_list, cchar};

pub type jboolean = u8;
pub type jbyte = i8;
pub type jchar = u16;
pub type jshort = i16;
pub type jint = i32;
pub type jlong = i64;
pub type jfloat = f32;
pub type jdouble = f64;
pub type jsize = jint;

pub enum _jobject {}
pub type jobject = *mut _jobject;
pub type jclass = jobject;
pub type jthrowable = jobject;
pub type jstring = jobject;
pub type jarray = jobject;
pub type jbooleanArray = jarray;
pub type jbyteArray = jarray;
pub type jcharArray = jarray;
pub type jshortArray = jarray;
pub type jintArray = jarray;
pub type jlongArray = jarray;
pub type jfloatArray = jarray;
pub type jdoubleArray = jarray;
pub type jobjectArray = jarray;

pub type jweak = jobject;

#[repr(C)]
#[derive(Clone, Copy)]
pub union jvalue {
    pub z: jboolean,
    pub b: jbyte,
    pub c: jchar,
    pub s: jshort,
    pub i: jint,
    pub j: jlong,
    pub f: jfloat,
    pub d: jdouble,
    pub l: jobject,
}

impl From<bool> for jvalue {
    #[inline]
    fn from(z: bool) -> jvalue {
        jvalue { z: z as jboolean }
    }
}

impl From<jbyte> for jvalue {
    #[inline]
    fn from(b: jbyte) -> jvalue {
        jvalue { b: b }
    }
}

impl From<jchar> for jvalue {
    #[inline]
    fn from(c: jchar) -> jvalue {
        jvalue { c: c }
    }
}

impl From<jshort> for jvalue {
    #[inline]
    fn from(s: jshort) -> jvalue {
        jvalue { s: s }
    }
}

impl From<jint> for jvalue {
    #[inline]
    fn from(i: jint) -> jvalue {
        jvalue { i: i }
    }
}

impl From<jlong> for jvalue {
    #[inline]
    fn from(j: jlong) -> jvalue {
        jvalue { j: j }
    }
}

impl From<jfloat> for jvalue {
    #[inline]
    fn from(f: jfloat) -> jvalue {
        jvalue { f: f }
    }
}

impl From<jdouble> for jvalue {
    #[inline]
    fn from(d: jdouble) -> jvalue {
        jvalue { d: d }
    }
}

impl From<jobject> for jvalue {
    #[inline]
    fn from(l: jobject) -> jvalue {
        jvalue { l: l }
    }
}

impl Default for jvalue {
    #[inline]
    fn default() -> jvalue {
        jvalue { z: 0 }
    }
}

pub enum _jfieldID {}
pub type jfieldID = *mut _jfieldID;

pub enum _jmethodID {}
pub type jmethodID = *mut _jmethodID;

#[repr(C)]
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum jobjectRefType {
    JNIInvalidRefType    = 0,
    JNILocalRefType      = 1,
    JNIGlobalRefType     = 2,
    JNIWeakGlobalRefType = 3,
}
pub use self::jobjectRefType::*;

// jboolean constants
pub const JNI_FALSE: jboolean = 0;
pub const JNI_TRUE: jboolean = 1;

// possible return values for JNI functions
pub const JNI_OK: jint = 0; // success
pub const JNI_ERR: jint = -1; // unknown error
pub const JNI_EDETACHED: jint = -2; // thread detached from the VM
pub const JNI_EVERSION: jint = -3; // JNI version error
pub const JNI_ENOMEM: jint = -4; // not enough memory
pub const JNI_EEXIST: jint = -5; // VM already created
pub const JNI_EINVAL: jint = -6; // invalid arguments

// used in ReleaseScalarArrayElements
pub const JNI_COMMIT: jint = 1;
pub const JNI_ABORT: jint = 2;

// used in RegisterNatives to describe native method name, signature,
// and function pointer.
#[repr(C)]
#[derive(Clone, Copy)]
pub struct JNINativeMethod {
    pub name: *mut cchar,
    pub signature: *mut cchar,
    pub fnPtr: *mut void,
}

// JNI Native Method Interface.

pub type JNIEnv = *const JNINativeInterface_;

// JNI Invocation Interface.

pub type JavaVM = *const JNIInvokeInterface_;

#[repr(C)]
#[derive(Clone, Copy)]
pub struct JNINativeInterface_ {
    pub reserved0: *mut void,
    pub reserved1: *mut void,
    pub reserved2: *mut void,

    pub reserved3: *mut void,
    pub GetVersion: unsafe extern "C" fn(env: *mut JNIEnv) -> jint,

    pub DefineClass: unsafe extern "C" fn(env: *mut JNIEnv, name: *const cchar, loader: jobject, buf: *const jbyte, len: jsize) -> jclass,
    pub FindClass: unsafe extern "C" fn(env: *mut JNIEnv, name: *const cchar) -> jclass,

    pub FromReflectedMethod: unsafe extern "C" fn(env: *mut JNIEnv, method: jobject) -> jmethodID,
    pub FromReflectedField: unsafe extern "C" fn(env: *mut JNIEnv, field: jobject) -> jfieldID,

    pub ToReflectedMethod: unsafe extern "C" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, isStatic: jboolean) -> jobject,

    pub GetSuperclass: unsafe extern "C" fn(env: *mut JNIEnv, sub: jclass) -> jclass,
    pub IsAssignableFrom: unsafe extern "C" fn(env: *mut JNIEnv, sub: jclass, sup: jclass) -> jboolean,

    pub ToReflectedField: unsafe extern "C" fn(env: *mut JNIEnv, cls: jclass, fieldID: jfieldID, isStatic: jboolean) -> jobject,

    pub Throw: unsafe extern "C" fn(env: *mut JNIEnv, obj: jthrowable) -> jint,
    pub ThrowNew: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, msg: *const cchar) -> jint,
    pub ExceptionOccurred: unsafe extern "C" fn(env: *mut JNIEnv) -> jthrowable,
    pub ExceptionDescribe: unsafe extern "C" fn(env: *mut JNIEnv),
    pub ExceptionClear: unsafe extern "C" fn(env: *mut JNIEnv),
    pub FatalError: unsafe extern "C" fn(env: *mut JNIEnv, msg: *const cchar) -> !,

    pub PushLocalFrame: unsafe extern "C" fn(env: *mut JNIEnv, capacity: jint) -> jint,
    pub PopLocalFrame: unsafe extern "C" fn(env: *mut JNIEnv, result: jobject) -> jobject,

    pub NewGlobalRef: unsafe extern "C" fn(env: *mut JNIEnv, lobj: jobject) -> jobject,
    pub DeleteGlobalRef: unsafe extern "C" fn(env: *mut JNIEnv, gref: jobject),
    pub DeleteLocalRef: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject),
    pub IsSameObject: unsafe extern "C" fn(env: *mut JNIEnv, obj1: jobject, obj2: jobject) -> jboolean,
    pub NewLocalRef: unsafe extern "C" fn(env: *mut JNIEnv, ref_: jobject) -> jobject,
    pub EnsureLocalCapacity: unsafe extern "C" fn(env: *mut JNIEnv, capacity: jint) -> jint,

    pub AllocObject: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass) -> jobject,
    pub NewObject: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jobject,
    pub NewObjectV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jobject,
    pub NewObjectA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jobject,

    pub GetObjectClass: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject) -> jclass,
    pub IsInstanceOf: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass) -> jboolean,

    pub GetMethodID: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, name: *const cchar, sig: *const cchar) -> jmethodID,

    pub CallObjectMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jobject,
    pub CallObjectMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jobject,
    pub CallObjectMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jobject,

    pub CallBooleanMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jboolean,
    pub CallBooleanMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jboolean,
    pub CallBooleanMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jboolean,

    pub CallByteMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jbyte,
    pub CallByteMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jbyte,
    pub CallByteMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jbyte,

    pub CallCharMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jchar,
    pub CallCharMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jchar,
    pub CallCharMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jchar,

    pub CallShortMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jshort,
    pub CallShortMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jshort,
    pub CallShortMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jshort,

    pub CallIntMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jint,
    pub CallIntMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jint,
    pub CallIntMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jint,

    pub CallLongMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jlong,
    pub CallLongMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jlong,
    pub CallLongMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jlong,

    pub CallFloatMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jfloat,
    pub CallFloatMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jfloat,
    pub CallFloatMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jfloat,

    pub CallDoubleMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...) -> jdouble,
    pub CallDoubleMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list) -> jdouble,
    pub CallDoubleMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue) -> jdouble,

    pub CallVoidMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, ...),
    pub CallVoidMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: va_list),
    pub CallVoidMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, methodID: jmethodID, args: *const jvalue),

    pub CallNonvirtualObjectMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jobject,
    pub CallNonvirtualObjectMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jobject,
    pub CallNonvirtualObjectMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jobject,

    pub CallNonvirtualBooleanMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jboolean,
    pub CallNonvirtualBooleanMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jboolean,
    pub CallNonvirtualBooleanMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jboolean,

    pub CallNonvirtualByteMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jbyte,
    pub CallNonvirtualByteMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jbyte,
    pub CallNonvirtualByteMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jbyte,

    pub CallNonvirtualCharMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jchar,
    pub CallNonvirtualCharMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jchar,
    pub CallNonvirtualCharMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jchar,

    pub CallNonvirtualShortMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jshort,
    pub CallNonvirtualShortMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jshort,
    pub CallNonvirtualShortMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jshort,

    pub CallNonvirtualIntMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jint,
    pub CallNonvirtualIntMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jint,
    pub CallNonvirtualIntMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jint,

    pub CallNonvirtualLongMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jlong,
    pub CallNonvirtualLongMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jlong,
    pub CallNonvirtualLongMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jlong,

    pub CallNonvirtualFloatMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jfloat,
    pub CallNonvirtualFloatMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jfloat,
    pub CallNonvirtualFloatMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jfloat,

    pub CallNonvirtualDoubleMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...) -> jdouble,
    pub CallNonvirtualDoubleMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list) -> jdouble,
    pub CallNonvirtualDoubleMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jdouble,

    pub CallNonvirtualVoidMethod: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, ...),
    pub CallNonvirtualVoidMethodV: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: va_list),
    pub CallNonvirtualVoidMethodA: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, clazz: jclass, methodID: jmethodID, args: *const jvalue),

    pub GetFieldID: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, name: *const cchar, sig: *const cchar) -> jfieldID,

    pub GetObjectField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jobject,
    pub GetBooleanField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jboolean,
    pub GetByteField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jbyte,
    pub GetCharField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jchar,
    pub GetShortField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jshort,
    pub GetIntField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jint,
    pub GetLongField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jlong,
    pub GetFloatField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jfloat,
    pub GetDoubleField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID) -> jdouble,

    pub SetObjectField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jobject),
    pub SetBooleanField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jboolean),
    pub SetByteField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jbyte),
    pub SetCharField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jchar),
    pub SetShortField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jshort),
    pub SetIntField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jint),
    pub SetLongField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jlong),
    pub SetFloatField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jfloat),
    pub SetDoubleField: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject, fieldID: jfieldID, val: jdouble),

    pub GetStaticMethodID: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, name: *const cchar, sig: *const cchar) -> jmethodID,

    pub CallStaticObjectMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jobject,
    pub CallStaticObjectMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jobject,
    pub CallStaticObjectMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jobject,

    pub CallStaticBooleanMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jboolean,
    pub CallStaticBooleanMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jboolean,
    pub CallStaticBooleanMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jboolean,

    pub CallStaticByteMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jbyte,
    pub CallStaticByteMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jbyte,
    pub CallStaticByteMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jbyte,

    pub CallStaticCharMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jchar,
    pub CallStaticCharMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jchar,
    pub CallStaticCharMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jchar,

    pub CallStaticShortMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jshort,
    pub CallStaticShortMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jshort,
    pub CallStaticShortMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jshort,

    pub CallStaticIntMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jint,
    pub CallStaticIntMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jint,
    pub CallStaticIntMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jint,

    pub CallStaticLongMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jlong,
    pub CallStaticLongMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jlong,
    pub CallStaticLongMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jlong,

    pub CallStaticFloatMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jfloat,
    pub CallStaticFloatMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jfloat,
    pub CallStaticFloatMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jfloat,

    pub CallStaticDoubleMethod: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, ...) -> jdouble,
    pub CallStaticDoubleMethodV: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: va_list) -> jdouble,
    pub CallStaticDoubleMethodA: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methodID: jmethodID, args: *const jvalue) -> jdouble,

    pub CallStaticVoidMethod: unsafe extern "C" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, ...),
    pub CallStaticVoidMethodV: unsafe extern "C" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, args: va_list),
    pub CallStaticVoidMethodA: unsafe extern "C" fn(env: *mut JNIEnv, cls: jclass, methodID: jmethodID, args: *const jvalue),

    pub GetStaticFieldID: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, name: *const cchar, sig: *const cchar) -> jfieldID,

    pub GetStaticObjectField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jobject,
    pub GetStaticBooleanField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jboolean,
    pub GetStaticByteField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jbyte,
    pub GetStaticCharField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jchar,
    pub GetStaticShortField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jshort,
    pub GetStaticIntField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jint,
    pub GetStaticLongField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jlong,
    pub GetStaticFloatField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jfloat,
    pub GetStaticDoubleField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID) -> jdouble,

    pub SetStaticObjectField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jobject),
    pub SetStaticBooleanField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jboolean),
    pub SetStaticByteField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jbyte),
    pub SetStaticCharField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jchar),
    pub SetStaticShortField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jshort),
    pub SetStaticIntField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jint),
    pub SetStaticLongField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jlong),
    pub SetStaticFloatField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jfloat),
    pub SetStaticDoubleField: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, fieldID: jfieldID, value: jdouble),

    pub NewString: unsafe extern "C" fn(env: *mut JNIEnv, unicode: *const jchar, len: jsize) -> jstring,
    pub GetStringLength: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring) -> jsize,
    pub GetStringChars: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring, isCopy: *mut jboolean) -> *const jchar,
    pub ReleaseStringChars: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring, chars: *const jchar),

    pub NewStringUTF: unsafe extern "C" fn(env: *mut JNIEnv, utf: *const cchar) -> jstring,
    pub GetStringUTFLength: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring) -> jsize,
    pub GetStringUTFChars: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring, isCopy: *mut jboolean) -> *const cchar,
    pub ReleaseStringUTFChars: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring, chars: *const cchar),

    pub GetArrayLength: unsafe extern "C" fn(env: *mut JNIEnv, array: jarray) -> jsize,

    pub NewObjectArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize, clazz: jclass, init: jobject) -> jobjectArray,
    pub GetObjectArrayElement: unsafe extern "C" fn(env: *mut JNIEnv, array: jobjectArray, index: jsize) -> jobject,
    pub SetObjectArrayElement: unsafe extern "C" fn(env: *mut JNIEnv, array: jobjectArray, index: jsize, val: jobject),

    pub NewBooleanArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jbooleanArray,
    pub NewByteArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jbyteArray,
    pub NewCharArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jcharArray,
    pub NewShortArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jshortArray,
    pub NewIntArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jintArray,
    pub NewLongArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jlongArray,
    pub NewFloatArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jfloatArray,
    pub NewDoubleArray: unsafe extern "C" fn(env: *mut JNIEnv, len: jsize) -> jdoubleArray,

    pub GetBooleanArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jbooleanArray, isCopy: *mut jboolean) -> *mut jboolean,
    pub GetByteArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jbyteArray, isCopy: *mut jboolean) -> *mut jbyte,
    pub GetCharArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jcharArray, isCopy: *mut jboolean) -> *mut jchar,
    pub GetShortArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jshortArray, isCopy: *mut jboolean) -> *mut jshort,
    pub GetIntArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jintArray, isCopy: *mut jboolean) -> *mut jint,
    pub GetLongArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jlongArray, isCopy: *mut jboolean) -> *mut jlong,
    pub GetFloatArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jfloatArray, isCopy: *mut jboolean) -> *mut jfloat,
    pub GetDoubleArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jdoubleArray, isCopy: *mut jboolean) -> *mut jdouble,

    pub ReleaseBooleanArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jbooleanArray, elems: *mut jboolean, mode: jint),
    pub ReleaseByteArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jbyteArray, elems: *mut jbyte, mode: jint),
    pub ReleaseCharArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jcharArray, elems: *mut jchar, mode: jint),
    pub ReleaseShortArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jshortArray, elems: *mut jshort, mode: jint),
    pub ReleaseIntArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jintArray, elems: *mut jint, mode: jint),
    pub ReleaseLongArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jlongArray, elems: *mut jlong, mode: jint),
    pub ReleaseFloatArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jfloatArray, elems: *mut jfloat, mode: jint),
    pub ReleaseDoubleArrayElements: unsafe extern "C" fn(env: *mut JNIEnv, array: jdoubleArray, elems: *mut jdouble, mode: jint),

    pub GetBooleanArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jbooleanArray, start: jsize, l: jsize, buf: *mut jboolean),
    pub GetByteArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jbyteArray, start: jsize, len: jsize, buf: *mut jbyte),
    pub GetCharArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jcharArray, start: jsize, len: jsize, buf: *mut jchar),
    pub GetShortArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jshortArray, start: jsize, len: jsize, buf: *mut jshort),
    pub GetIntArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jintArray, start: jsize, len: jsize, buf: *mut jint),
    pub GetLongArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jlongArray, start: jsize, len: jsize, buf: *mut jlong),
    pub GetFloatArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jfloatArray, start: jsize, len: jsize, buf: *mut jfloat),
    pub GetDoubleArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jdoubleArray, start: jsize, len: jsize, buf: *mut jdouble),

    pub SetBooleanArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jbooleanArray, start: jsize, l: jsize, buf: *const jboolean),
    pub SetByteArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jbyteArray, start: jsize, len: jsize, buf: *const jbyte),
    pub SetCharArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jcharArray, start: jsize, len: jsize, buf: *const jchar),
    pub SetShortArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jshortArray, start: jsize, len: jsize, buf: *const jshort),
    pub SetIntArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jintArray, start: jsize, len: jsize, buf: *const jint),
    pub SetLongArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jlongArray, start: jsize, len: jsize, buf: *const jlong),
    pub SetFloatArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jfloatArray, start: jsize, len: jsize, buf: *const jfloat),
    pub SetDoubleArrayRegion: unsafe extern "C" fn(env: *mut JNIEnv, array: jdoubleArray, start: jsize, len: jsize, buf: *const jdouble),

    pub RegisterNatives: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass, methods: *const JNINativeMethod, nMethods: jint) -> jint,
    pub UnregisterNatives: unsafe extern "C" fn(env: *mut JNIEnv, clazz: jclass) -> jint,

    pub MonitorEnter: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject) -> jint,
    pub MonitorExit: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject) -> jint,

    pub GetJavaVM: unsafe extern "C" fn(env: *mut JNIEnv, vm: *mut *mut JavaVM) -> jint,

    pub GetStringRegion: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring, start: jsize, len: jsize, buf: *mut jchar),
    pub GetStringUTFRegion: unsafe extern "C" fn(env: *mut JNIEnv, str: jstring, start: jsize, len: jsize, buf: *mut cchar),

    pub GetPrimitiveArrayCritical: unsafe extern "C" fn(env: *mut JNIEnv, array: jarray, isCopy: *mut jboolean) -> *mut void,
    pub ReleasePrimitiveArrayCritical: unsafe extern "C" fn(env: *mut JNIEnv, array: jarray, carray: *mut void, mode: jint),

    pub GetStringCritical: unsafe extern "C" fn(env: *mut JNIEnv, string: jstring, isCopy: *mut jboolean) -> *const jchar,
    pub ReleaseStringCritical: unsafe extern "C" fn(env: *mut JNIEnv, string: jstring, cstring: *const jchar),

    pub NewWeakGlobalRef: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject) -> jweak,
    pub DeleteWeakGlobalRef: unsafe extern "C" fn(env: *mut JNIEnv, ref_: jweak),

    pub ExceptionCheck: unsafe extern "C" fn(env: *mut JNIEnv) -> jboolean,

    pub NewDirectByteBuffer: unsafe extern "C" fn(env: *mut JNIEnv, address: *mut void, capacity: jlong) -> jobject,
    pub GetDirectBufferAddress: unsafe extern "C" fn(env: *mut JNIEnv, buf: jobject) -> *mut void,
    pub GetDirectBufferCapacity: unsafe extern "C" fn(env: *mut JNIEnv, buf: jobject) -> jlong,

    // New JNI 1.6 Features

    pub GetObjectRefType: unsafe extern "C" fn(env: *mut JNIEnv, obj: jobject) -> jobjectRefType,
}

#[repr(C)]
#[derive(Clone, Copy)]
pub struct JavaVMOption {
    pub optionString: *const cchar,
    pub extraInfo: *const void,
}

#[repr(C)]
#[derive(Clone, Copy)]
pub struct JavaVMInitArgs {
    pub version: jint,
    pub nOptions: jint,
    pub options: *const JavaVMOption,
    pub ignoreUnrecognized: jboolean,
}

#[repr(C)]
#[derive(Clone, Copy)]
pub struct JavaVMAttachArgs {
    pub version: jint,
    pub name: *const cchar,
    pub group: jobject,
}

#[repr(C)]
#[derive(Clone, Copy)]
pub struct JNIInvokeInterface_ {
    pub reserved0: *mut void,
    pub reserved1: *mut void,
    pub reserved2: *mut void,

    pub DestroyJavaVM: unsafe extern "C" fn(vm: *mut JavaVM) -> jint,

    pub AttachCurrentThread: unsafe extern "C" fn(vm: *mut JavaVM, penv: *mut *mut JNIEnv, args: *const JavaVMAttachArgs) -> jint,

    pub DetachCurrentThread: unsafe extern "C" fn(vm: *mut JavaVM) -> jint,

    pub GetEnv: unsafe extern "C" fn(vm: *mut JavaVM, penv: *mut *mut JNIEnv, version: jint) -> jint,

    pub AttachCurrentThreadAsDaemon: unsafe extern "C" fn(vm: *mut JavaVM, penv: *mut *mut JNIEnv, args: *const JavaVMAttachArgs) -> jint,
}

#[cfg(feature = "jvm")]
//#[link(name = "jvm")]
extern "C" {
    pub fn JNI_GetDefaultJavaVMInitArgs(args: *mut JavaVMInitArgs) -> jint;

    pub fn JNI_CreateJavaVM(pvm: *mut *mut JavaVM, penv: *mut *mut JNIEnv, args: *mut JavaVMInitArgs) -> jint;

    pub fn JNI_GetCreatedJavaVMs(vmBuf: *mut *mut JavaVM, bufLen: jsize, nVMs: *mut jsize) -> jint;

    pub fn JNI_OnLoad(vm: *mut JavaVM, reserved: *mut void) -> jint;

    pub fn JNI_OnUnload(vm: *mut JavaVM, reserved: *mut void) -> jint;
}

pub const JNI_VERSION_1_1: jint = 0x00010001;
pub const JNI_VERSION_1_2: jint = 0x00010002;
pub const JNI_VERSION_1_4: jint = 0x00010004;
pub const JNI_VERSION_1_6: jint = 0x00010006;
pub const JNI_VERSION_1_8: jint = 0x00010008;
pub const JNI_VERSION_9: jint   = 0x00090000;