1 /*
   2  * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 /*
  27  * We used part of Netscape's Java Runtime Interface (JRI) as the starting
  28  * point of our design and implementation.
  29  */
  30 
  31 /******************************************************************************
  32  * Java Runtime Interface
  33  * Copyright (c) 1996 Netscape Communications Corporation. All rights reserved.
  34  *****************************************************************************/
  35 
  36 #ifndef _JAVASOFT_JNI_H_
  37 #define _JAVASOFT_JNI_H_
  38 
  39 #include <stdio.h>
  40 #include <stdarg.h>
  41 
  42 /* jni_md.h contains the machine-dependent typedefs for jbyte, jint
  43    and jlong */
  44 
  45 #include "jni_md.h"
  46 
  47 #ifdef __cplusplus
  48 extern "C" {
  49 #endif
  50 
  51 /*
  52  * JNI Types
  53  */
  54 
  55 #ifndef JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H
  56 
  57 typedef unsigned char   jboolean;
  58 typedef unsigned short  jchar;
  59 typedef short           jshort;
  60 typedef float           jfloat;
  61 typedef double          jdouble;
  62 
  63 typedef jint            jsize;
  64 
  65 #ifdef __cplusplus
  66 
  67 class _jvaluetype {};
  68 class _jobject {};
  69 class _jclass : public _jobject {};
  70 class _jthrowable : public _jobject {};
  71 class _jstring : public _jobject {};
  72 class _jarray : public _jobject {};
  73 class _jbooleanArray : public _jarray {};
  74 class _jbyteArray : public _jarray {};
  75 class _jcharArray : public _jarray {};
  76 class _jshortArray : public _jarray {};
  77 class _jintArray : public _jarray {};
  78 class _jlongArray : public _jarray {};
  79 class _jfloatArray : public _jarray {};
  80 class _jdoubleArray : public _jarray {};
  81 class _jobjectArray : public _jarray {};
  82 
  83 typedef _jvaluetype *jvaluetype;
  84 typedef _jobject *jobject;
  85 typedef _jclass *jclass;
  86 typedef _jthrowable *jthrowable;
  87 typedef _jstring *jstring;
  88 typedef _jarray *jarray;
  89 typedef _jbooleanArray *jbooleanArray;
  90 typedef _jbyteArray *jbyteArray;
  91 typedef _jcharArray *jcharArray;
  92 typedef _jshortArray *jshortArray;
  93 typedef _jintArray *jintArray;
  94 typedef _jlongArray *jlongArray;
  95 typedef _jfloatArray *jfloatArray;
  96 typedef _jdoubleArray *jdoubleArray;
  97 typedef _jobjectArray *jobjectArray;
  98 
  99 #else
 100 
 101 struct _jvaluetype;
 102 struct _jobject;
 103 
 104 typedef struct _jvaluetype *jvaluetype;
 105 typedef struct _jobject *jobject;
 106 typedef jobject jclass;
 107 typedef jobject jthrowable;
 108 typedef jobject jstring;
 109 typedef jobject jarray;
 110 typedef jarray jbooleanArray;
 111 typedef jarray jbyteArray;
 112 typedef jarray jcharArray;
 113 typedef jarray jshortArray;
 114 typedef jarray jintArray;
 115 typedef jarray jlongArray;
 116 typedef jarray jfloatArray;
 117 typedef jarray jdoubleArray;
 118 typedef jarray jobjectArray;
 119 
 120 #endif
 121 
 122 typedef jobject jweak;
 123 
 124 typedef union jvalue {
 125     jboolean z;
 126     jbyte    b;
 127     jchar    c;
 128     jshort   s;
 129     jint     i;
 130     jlong    j;
 131     jfloat   f;
 132     jdouble  d;
 133     jobject  l;
 134     jvaluetype q;
 135 } jvalue;
 136 
 137 struct _jfieldID;
 138 typedef struct _jfieldID *jfieldID;
 139 
 140 struct _jmethodID;
 141 typedef struct _jmethodID *jmethodID;
 142 
 143 /* Return values from jobjectRefType */
 144 typedef enum _jobjectType {
 145      JNIInvalidRefType    = 0,
 146      JNILocalRefType      = 1,
 147      JNIGlobalRefType     = 2,
 148      JNIWeakGlobalRefType = 3
 149 } jobjectRefType;
 150 
 151 
 152 #endif /* JNI_TYPES_ALREADY_DEFINED_IN_JNI_MD_H */
 153 
 154 /*
 155  * jboolean constants
 156  */
 157 
 158 #define JNI_FALSE 0
 159 #define JNI_TRUE 1
 160 
 161 /*
 162  * possible return values for JNI functions.
 163  */
 164 
 165 #define JNI_OK           0                 /* success */
 166 #define JNI_ERR          (-1)              /* unknown error */
 167 #define JNI_EDETACHED    (-2)              /* thread detached from the VM */
 168 #define JNI_EVERSION     (-3)              /* JNI version error */
 169 #define JNI_ENOMEM       (-4)              /* not enough memory */
 170 #define JNI_EEXIST       (-5)              /* VM already created */
 171 #define JNI_EINVAL       (-6)              /* invalid arguments */
 172 
 173 /*
 174  * used in ReleaseScalarArrayElements
 175  */
 176 
 177 #define JNI_COMMIT 1
 178 #define JNI_ABORT 2
 179 
 180 /*
 181  * used in RegisterNatives to describe native method name, signature,
 182  * and function pointer.
 183  */
 184 
 185 typedef struct {
 186     char *name;
 187     char *signature;
 188     void *fnPtr;
 189 } JNINativeMethod;
 190 
 191 /*
 192  * JNI Native Method Interface.
 193  */
 194 
 195 struct JNINativeInterface_;
 196 
 197 struct JNIEnv_;
 198 
 199 #ifdef __cplusplus
 200 typedef JNIEnv_ JNIEnv;
 201 #else
 202 typedef const struct JNINativeInterface_ *JNIEnv;
 203 #endif
 204 
 205 /*
 206  * JNI Invocation Interface.
 207  */
 208 
 209 struct JNIInvokeInterface_;
 210 
 211 struct JavaVM_;
 212 
 213 #ifdef __cplusplus
 214 typedef JavaVM_ JavaVM;
 215 #else
 216 typedef const struct JNIInvokeInterface_ *JavaVM;
 217 #endif
 218 
 219 struct JNINativeInterface_ {
 220     void *reserved0;
 221     void *reserved1;
 222     void *reserved2;
 223 
 224     void *reserved3;
 225     jint (JNICALL *GetVersion)(JNIEnv *env);
 226 
 227     jclass (JNICALL *DefineClass)
 228       (JNIEnv *env, const char *name, jobject loader, const jbyte *buf,
 229        jsize len);
 230     jclass (JNICALL *FindClass)
 231       (JNIEnv *env, const char *name);
 232 
 233     jmethodID (JNICALL *FromReflectedMethod)
 234       (JNIEnv *env, jobject method);
 235     jfieldID (JNICALL *FromReflectedField)
 236       (JNIEnv *env, jobject field);
 237 
 238     jobject (JNICALL *ToReflectedMethod)
 239       (JNIEnv *env, jclass cls, jmethodID methodID, jboolean isStatic);
 240 
 241     jclass (JNICALL *GetSuperclass)
 242       (JNIEnv *env, jclass sub);
 243     jboolean (JNICALL *IsAssignableFrom)
 244       (JNIEnv *env, jclass sub, jclass sup);
 245 
 246     jobject (JNICALL *ToReflectedField)
 247       (JNIEnv *env, jclass cls, jfieldID fieldID, jboolean isStatic);
 248 
 249     jint (JNICALL *Throw)
 250       (JNIEnv *env, jthrowable obj);
 251     jint (JNICALL *ThrowNew)
 252       (JNIEnv *env, jclass clazz, const char *msg);
 253     jthrowable (JNICALL *ExceptionOccurred)
 254       (JNIEnv *env);
 255     void (JNICALL *ExceptionDescribe)
 256       (JNIEnv *env);
 257     void (JNICALL *ExceptionClear)
 258       (JNIEnv *env);
 259     void (JNICALL *FatalError)
 260       (JNIEnv *env, const char *msg);
 261 
 262     jint (JNICALL *PushLocalFrame)
 263       (JNIEnv *env, jint capacity);
 264     jobject (JNICALL *PopLocalFrame)
 265       (JNIEnv *env, jobject result);
 266 
 267     jobject (JNICALL *NewGlobalRef)
 268       (JNIEnv *env, jobject lobj);
 269     void (JNICALL *DeleteGlobalRef)
 270       (JNIEnv *env, jobject gref);
 271     void (JNICALL *DeleteLocalRef)
 272       (JNIEnv *env, jobject obj);
 273     jboolean (JNICALL *IsSameObject)
 274       (JNIEnv *env, jobject obj1, jobject obj2);
 275     jobject (JNICALL *NewLocalRef)
 276       (JNIEnv *env, jobject ref);
 277     jint (JNICALL *EnsureLocalCapacity)
 278       (JNIEnv *env, jint capacity);
 279 
 280     jobject (JNICALL *AllocObject)
 281       (JNIEnv *env, jclass clazz);
 282     jobject (JNICALL *NewObject)
 283       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 284     jobject (JNICALL *NewObjectV)
 285       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 286     jobject (JNICALL *NewObjectA)
 287       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 288 
 289     jclass (JNICALL *GetObjectClass)
 290       (JNIEnv *env, jobject obj);
 291     jboolean (JNICALL *IsInstanceOf)
 292       (JNIEnv *env, jobject obj, jclass clazz);
 293 
 294     jmethodID (JNICALL *GetMethodID)
 295       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 296 
 297     jobject (JNICALL *CallObjectMethod)
 298       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 299     jobject (JNICALL *CallObjectMethodV)
 300       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 301     jobject (JNICALL *CallObjectMethodA)
 302       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
 303 
 304     jboolean (JNICALL *CallBooleanMethod)
 305       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 306     jboolean (JNICALL *CallBooleanMethodV)
 307       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 308     jboolean (JNICALL *CallBooleanMethodA)
 309       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
 310 
 311     jbyte (JNICALL *CallByteMethod)
 312       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 313     jbyte (JNICALL *CallByteMethodV)
 314       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 315     jbyte (JNICALL *CallByteMethodA)
 316       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 317 
 318     jchar (JNICALL *CallCharMethod)
 319       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 320     jchar (JNICALL *CallCharMethodV)
 321       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 322     jchar (JNICALL *CallCharMethodA)
 323       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 324 
 325     jshort (JNICALL *CallShortMethod)
 326       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 327     jshort (JNICALL *CallShortMethodV)
 328       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 329     jshort (JNICALL *CallShortMethodA)
 330       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 331 
 332     jint (JNICALL *CallIntMethod)
 333       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 334     jint (JNICALL *CallIntMethodV)
 335       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 336     jint (JNICALL *CallIntMethodA)
 337       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 338 
 339     jlong (JNICALL *CallLongMethod)
 340       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 341     jlong (JNICALL *CallLongMethodV)
 342       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 343     jlong (JNICALL *CallLongMethodA)
 344       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 345 
 346     jfloat (JNICALL *CallFloatMethod)
 347       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 348     jfloat (JNICALL *CallFloatMethodV)
 349       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 350     jfloat (JNICALL *CallFloatMethodA)
 351       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 352 
 353     jdouble (JNICALL *CallDoubleMethod)
 354       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 355     jdouble (JNICALL *CallDoubleMethodV)
 356       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 357     jdouble (JNICALL *CallDoubleMethodA)
 358       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue *args);
 359 
 360     void (JNICALL *CallVoidMethod)
 361       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
 362     void (JNICALL *CallVoidMethodV)
 363       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
 364     void (JNICALL *CallVoidMethodA)
 365       (JNIEnv *env, jobject obj, jmethodID methodID, const jvalue * args);
 366 
 367     jobject (JNICALL *CallNonvirtualObjectMethod)
 368       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 369     jobject (JNICALL *CallNonvirtualObjectMethodV)
 370       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 371        va_list args);
 372     jobject (JNICALL *CallNonvirtualObjectMethodA)
 373       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 374        const jvalue * args);
 375 
 376     jboolean (JNICALL *CallNonvirtualBooleanMethod)
 377       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 378     jboolean (JNICALL *CallNonvirtualBooleanMethodV)
 379       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 380        va_list args);
 381     jboolean (JNICALL *CallNonvirtualBooleanMethodA)
 382       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 383        const jvalue * args);
 384 
 385     jbyte (JNICALL *CallNonvirtualByteMethod)
 386       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 387     jbyte (JNICALL *CallNonvirtualByteMethodV)
 388       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 389        va_list args);
 390     jbyte (JNICALL *CallNonvirtualByteMethodA)
 391       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 392        const jvalue *args);
 393 
 394     jchar (JNICALL *CallNonvirtualCharMethod)
 395       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 396     jchar (JNICALL *CallNonvirtualCharMethodV)
 397       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 398        va_list args);
 399     jchar (JNICALL *CallNonvirtualCharMethodA)
 400       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 401        const jvalue *args);
 402 
 403     jshort (JNICALL *CallNonvirtualShortMethod)
 404       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 405     jshort (JNICALL *CallNonvirtualShortMethodV)
 406       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 407        va_list args);
 408     jshort (JNICALL *CallNonvirtualShortMethodA)
 409       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 410        const jvalue *args);
 411 
 412     jint (JNICALL *CallNonvirtualIntMethod)
 413       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 414     jint (JNICALL *CallNonvirtualIntMethodV)
 415       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 416        va_list args);
 417     jint (JNICALL *CallNonvirtualIntMethodA)
 418       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 419        const jvalue *args);
 420 
 421     jlong (JNICALL *CallNonvirtualLongMethod)
 422       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 423     jlong (JNICALL *CallNonvirtualLongMethodV)
 424       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 425        va_list args);
 426     jlong (JNICALL *CallNonvirtualLongMethodA)
 427       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 428        const jvalue *args);
 429 
 430     jfloat (JNICALL *CallNonvirtualFloatMethod)
 431       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 432     jfloat (JNICALL *CallNonvirtualFloatMethodV)
 433       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 434        va_list args);
 435     jfloat (JNICALL *CallNonvirtualFloatMethodA)
 436       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 437        const jvalue *args);
 438 
 439     jdouble (JNICALL *CallNonvirtualDoubleMethod)
 440       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 441     jdouble (JNICALL *CallNonvirtualDoubleMethodV)
 442       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 443        va_list args);
 444     jdouble (JNICALL *CallNonvirtualDoubleMethodA)
 445       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 446        const jvalue *args);
 447 
 448     void (JNICALL *CallNonvirtualVoidMethod)
 449       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
 450     void (JNICALL *CallNonvirtualVoidMethodV)
 451       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 452        va_list args);
 453     void (JNICALL *CallNonvirtualVoidMethodA)
 454       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
 455        const jvalue * args);
 456 
 457     jfieldID (JNICALL *GetFieldID)
 458       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 459 
 460     jobject (JNICALL *GetObjectField)
 461       (JNIEnv *env, jobject obj, jfieldID fieldID);
 462     jboolean (JNICALL *GetBooleanField)
 463       (JNIEnv *env, jobject obj, jfieldID fieldID);
 464     jbyte (JNICALL *GetByteField)
 465       (JNIEnv *env, jobject obj, jfieldID fieldID);
 466     jchar (JNICALL *GetCharField)
 467       (JNIEnv *env, jobject obj, jfieldID fieldID);
 468     jshort (JNICALL *GetShortField)
 469       (JNIEnv *env, jobject obj, jfieldID fieldID);
 470     jint (JNICALL *GetIntField)
 471       (JNIEnv *env, jobject obj, jfieldID fieldID);
 472     jlong (JNICALL *GetLongField)
 473       (JNIEnv *env, jobject obj, jfieldID fieldID);
 474     jfloat (JNICALL *GetFloatField)
 475       (JNIEnv *env, jobject obj, jfieldID fieldID);
 476     jdouble (JNICALL *GetDoubleField)
 477       (JNIEnv *env, jobject obj, jfieldID fieldID);
 478 
 479     void (JNICALL *SetObjectField)
 480       (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
 481     void (JNICALL *SetBooleanField)
 482       (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
 483     void (JNICALL *SetByteField)
 484       (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
 485     void (JNICALL *SetCharField)
 486       (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
 487     void (JNICALL *SetShortField)
 488       (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
 489     void (JNICALL *SetIntField)
 490       (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
 491     void (JNICALL *SetLongField)
 492       (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
 493     void (JNICALL *SetFloatField)
 494       (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
 495     void (JNICALL *SetDoubleField)
 496       (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
 497 
 498     jmethodID (JNICALL *GetStaticMethodID)
 499       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 500 
 501     jobject (JNICALL *CallStaticObjectMethod)
 502       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 503     jobject (JNICALL *CallStaticObjectMethodV)
 504       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 505     jobject (JNICALL *CallStaticObjectMethodA)
 506       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 507 
 508     jboolean (JNICALL *CallStaticBooleanMethod)
 509       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 510     jboolean (JNICALL *CallStaticBooleanMethodV)
 511       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 512     jboolean (JNICALL *CallStaticBooleanMethodA)
 513       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 514 
 515     jbyte (JNICALL *CallStaticByteMethod)
 516       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 517     jbyte (JNICALL *CallStaticByteMethodV)
 518       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 519     jbyte (JNICALL *CallStaticByteMethodA)
 520       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 521 
 522     jchar (JNICALL *CallStaticCharMethod)
 523       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 524     jchar (JNICALL *CallStaticCharMethodV)
 525       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 526     jchar (JNICALL *CallStaticCharMethodA)
 527       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 528 
 529     jshort (JNICALL *CallStaticShortMethod)
 530       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 531     jshort (JNICALL *CallStaticShortMethodV)
 532       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 533     jshort (JNICALL *CallStaticShortMethodA)
 534       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 535 
 536     jint (JNICALL *CallStaticIntMethod)
 537       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 538     jint (JNICALL *CallStaticIntMethodV)
 539       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 540     jint (JNICALL *CallStaticIntMethodA)
 541       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 542 
 543     jlong (JNICALL *CallStaticLongMethod)
 544       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 545     jlong (JNICALL *CallStaticLongMethodV)
 546       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 547     jlong (JNICALL *CallStaticLongMethodA)
 548       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 549 
 550     jfloat (JNICALL *CallStaticFloatMethod)
 551       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 552     jfloat (JNICALL *CallStaticFloatMethodV)
 553       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 554     jfloat (JNICALL *CallStaticFloatMethodA)
 555       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 556 
 557     jdouble (JNICALL *CallStaticDoubleMethod)
 558       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
 559     jdouble (JNICALL *CallStaticDoubleMethodV)
 560       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
 561     jdouble (JNICALL *CallStaticDoubleMethodA)
 562       (JNIEnv *env, jclass clazz, jmethodID methodID, const jvalue *args);
 563 
 564     void (JNICALL *CallStaticVoidMethod)
 565       (JNIEnv *env, jclass cls, jmethodID methodID, ...);
 566     void (JNICALL *CallStaticVoidMethodV)
 567       (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
 568     void (JNICALL *CallStaticVoidMethodA)
 569       (JNIEnv *env, jclass cls, jmethodID methodID, const jvalue * args);
 570 
 571     jfieldID (JNICALL *GetStaticFieldID)
 572       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
 573     jobject (JNICALL *GetStaticObjectField)
 574       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 575     jboolean (JNICALL *GetStaticBooleanField)
 576       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 577     jbyte (JNICALL *GetStaticByteField)
 578       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 579     jchar (JNICALL *GetStaticCharField)
 580       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 581     jshort (JNICALL *GetStaticShortField)
 582       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 583     jint (JNICALL *GetStaticIntField)
 584       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 585     jlong (JNICALL *GetStaticLongField)
 586       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 587     jfloat (JNICALL *GetStaticFloatField)
 588       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 589     jdouble (JNICALL *GetStaticDoubleField)
 590       (JNIEnv *env, jclass clazz, jfieldID fieldID);
 591 
 592     void (JNICALL *SetStaticObjectField)
 593       (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
 594     void (JNICALL *SetStaticBooleanField)
 595       (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
 596     void (JNICALL *SetStaticByteField)
 597       (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
 598     void (JNICALL *SetStaticCharField)
 599       (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
 600     void (JNICALL *SetStaticShortField)
 601       (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
 602     void (JNICALL *SetStaticIntField)
 603       (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
 604     void (JNICALL *SetStaticLongField)
 605       (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
 606     void (JNICALL *SetStaticFloatField)
 607       (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
 608     void (JNICALL *SetStaticDoubleField)
 609       (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
 610 
 611     jstring (JNICALL *NewString)
 612       (JNIEnv *env, const jchar *unicode, jsize len);
 613     jsize (JNICALL *GetStringLength)
 614       (JNIEnv *env, jstring str);
 615     const jchar *(JNICALL *GetStringChars)
 616       (JNIEnv *env, jstring str, jboolean *isCopy);
 617     void (JNICALL *ReleaseStringChars)
 618       (JNIEnv *env, jstring str, const jchar *chars);
 619 
 620     jstring (JNICALL *NewStringUTF)
 621       (JNIEnv *env, const char *utf);
 622     jsize (JNICALL *GetStringUTFLength)
 623       (JNIEnv *env, jstring str);
 624     const char* (JNICALL *GetStringUTFChars)
 625       (JNIEnv *env, jstring str, jboolean *isCopy);
 626     void (JNICALL *ReleaseStringUTFChars)
 627       (JNIEnv *env, jstring str, const char* chars);
 628 
 629 
 630     jsize (JNICALL *GetArrayLength)
 631       (JNIEnv *env, jarray array);
 632 
 633     jobjectArray (JNICALL *NewObjectArray)
 634       (JNIEnv *env, jsize len, jclass clazz, jobject init);
 635     jobject (JNICALL *GetObjectArrayElement)
 636       (JNIEnv *env, jobjectArray array, jsize index);
 637     void (JNICALL *SetObjectArrayElement)
 638       (JNIEnv *env, jobjectArray array, jsize index, jobject val);
 639 
 640     jbooleanArray (JNICALL *NewBooleanArray)
 641       (JNIEnv *env, jsize len);
 642     jbyteArray (JNICALL *NewByteArray)
 643       (JNIEnv *env, jsize len);
 644     jcharArray (JNICALL *NewCharArray)
 645       (JNIEnv *env, jsize len);
 646     jshortArray (JNICALL *NewShortArray)
 647       (JNIEnv *env, jsize len);
 648     jintArray (JNICALL *NewIntArray)
 649       (JNIEnv *env, jsize len);
 650     jlongArray (JNICALL *NewLongArray)
 651       (JNIEnv *env, jsize len);
 652     jfloatArray (JNICALL *NewFloatArray)
 653       (JNIEnv *env, jsize len);
 654     jdoubleArray (JNICALL *NewDoubleArray)
 655       (JNIEnv *env, jsize len);
 656 
 657     jboolean * (JNICALL *GetBooleanArrayElements)
 658       (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
 659     jbyte * (JNICALL *GetByteArrayElements)
 660       (JNIEnv *env, jbyteArray array, jboolean *isCopy);
 661     jchar * (JNICALL *GetCharArrayElements)
 662       (JNIEnv *env, jcharArray array, jboolean *isCopy);
 663     jshort * (JNICALL *GetShortArrayElements)
 664       (JNIEnv *env, jshortArray array, jboolean *isCopy);
 665     jint * (JNICALL *GetIntArrayElements)
 666       (JNIEnv *env, jintArray array, jboolean *isCopy);
 667     jlong * (JNICALL *GetLongArrayElements)
 668       (JNIEnv *env, jlongArray array, jboolean *isCopy);
 669     jfloat * (JNICALL *GetFloatArrayElements)
 670       (JNIEnv *env, jfloatArray array, jboolean *isCopy);
 671     jdouble * (JNICALL *GetDoubleArrayElements)
 672       (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
 673 
 674     void (JNICALL *ReleaseBooleanArrayElements)
 675       (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
 676     void (JNICALL *ReleaseByteArrayElements)
 677       (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
 678     void (JNICALL *ReleaseCharArrayElements)
 679       (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
 680     void (JNICALL *ReleaseShortArrayElements)
 681       (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
 682     void (JNICALL *ReleaseIntArrayElements)
 683       (JNIEnv *env, jintArray array, jint *elems, jint mode);
 684     void (JNICALL *ReleaseLongArrayElements)
 685       (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
 686     void (JNICALL *ReleaseFloatArrayElements)
 687       (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
 688     void (JNICALL *ReleaseDoubleArrayElements)
 689       (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
 690         
 691     void (JNICALL *GetBooleanArrayRegion)
 692       (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
 693     void (JNICALL *GetByteArrayRegion)
 694       (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
 695     void (JNICALL *GetCharArrayRegion)
 696       (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
 697     void (JNICALL *GetShortArrayRegion)
 698       (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
 699     void (JNICALL *GetIntArrayRegion)
 700       (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
 701     void (JNICALL *GetLongArrayRegion)
 702       (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
 703     void (JNICALL *GetFloatArrayRegion)
 704       (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
 705     void (JNICALL *GetDoubleArrayRegion)
 706       (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
 707 
 708     void (JNICALL *SetBooleanArrayRegion)
 709       (JNIEnv *env, jbooleanArray array, jsize start, jsize l, const jboolean *buf);
 710     void (JNICALL *SetByteArrayRegion)
 711       (JNIEnv *env, jbyteArray array, jsize start, jsize len, const jbyte *buf);
 712     void (JNICALL *SetCharArrayRegion)
 713       (JNIEnv *env, jcharArray array, jsize start, jsize len, const jchar *buf);
 714     void (JNICALL *SetShortArrayRegion)
 715       (JNIEnv *env, jshortArray array, jsize start, jsize len, const jshort *buf);
 716     void (JNICALL *SetIntArrayRegion)
 717       (JNIEnv *env, jintArray array, jsize start, jsize len, const jint *buf);
 718     void (JNICALL *SetLongArrayRegion)
 719       (JNIEnv *env, jlongArray array, jsize start, jsize len, const jlong *buf);
 720     void (JNICALL *SetFloatArrayRegion)
 721       (JNIEnv *env, jfloatArray array, jsize start, jsize len, const jfloat *buf);
 722     void (JNICALL *SetDoubleArrayRegion)
 723       (JNIEnv *env, jdoubleArray array, jsize start, jsize len, const jdouble *buf);
 724 
 725     jint (JNICALL *RegisterNatives)
 726       (JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
 727        jint nMethods);
 728     jint (JNICALL *UnregisterNatives)
 729       (JNIEnv *env, jclass clazz);
 730 
 731     jint (JNICALL *MonitorEnter)
 732       (JNIEnv *env, jobject obj);
 733     jint (JNICALL *MonitorExit)
 734       (JNIEnv *env, jobject obj);
 735 
 736     jint (JNICALL *GetJavaVM)
 737       (JNIEnv *env, JavaVM **vm);
 738 
 739     void (JNICALL *GetStringRegion)
 740       (JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf);
 741     void (JNICALL *GetStringUTFRegion)
 742       (JNIEnv *env, jstring str, jsize start, jsize len, char *buf);
 743 
 744     void * (JNICALL *GetPrimitiveArrayCritical)
 745       (JNIEnv *env, jarray array, jboolean *isCopy);
 746     void (JNICALL *ReleasePrimitiveArrayCritical)
 747       (JNIEnv *env, jarray array, void *carray, jint mode);
 748 
 749     const jchar * (JNICALL *GetStringCritical)
 750       (JNIEnv *env, jstring string, jboolean *isCopy);
 751     void (JNICALL *ReleaseStringCritical)
 752       (JNIEnv *env, jstring string, const jchar *cstring);
 753 
 754     jweak (JNICALL *NewWeakGlobalRef)
 755        (JNIEnv *env, jobject obj);
 756     void (JNICALL *DeleteWeakGlobalRef)
 757        (JNIEnv *env, jweak ref);
 758 
 759     jboolean (JNICALL *ExceptionCheck)
 760        (JNIEnv *env);
 761 
 762     jobject (JNICALL *NewDirectByteBuffer)
 763        (JNIEnv* env, void* address, jlong capacity);
 764     void* (JNICALL *GetDirectBufferAddress)
 765        (JNIEnv* env, jobject buf);
 766     jlong (JNICALL *GetDirectBufferCapacity)
 767        (JNIEnv* env, jobject buf);
 768 
 769     /* New JNI 1.6 Features */
 770 
 771     jobjectRefType (JNICALL *GetObjectRefType)
 772         (JNIEnv* env, jobject obj);
 773 
 774     /* Module Features */
 775 
 776     jobject (JNICALL *GetModule)
 777        (JNIEnv* env, jclass clazz);
 778 
 779     /* Flattened arrays Features */
 780     void* (JNICALL *GetFlattenedArrayElements)
 781       (JNIEnv* env, jarray array , jboolean *isCopy);
 782     void (JNICALL *ReleaseFlattenedArrayElements)
 783       (JNIEnv* env, jarray, void* elem, jint mode);
 784     jclass (JNICALL *GetFlattenedArrayElementClass)
 785       (JNIEnv* env, jarray array);
 786     jsize (JNICALL *GetFlattenedArrayElementSize)
 787       (JNIEnv* env, jarray array);
 788     jsize (JNICALL *GetFieldOffsetInFlattenedLayout)
 789       (JNIEnv* env, jclass clazz,  const char *name, const char *signature, jboolean* isFlattened);
 790 
 791     jobject (JNICALL *CreateSubElementSelector)
 792       (JNIEnv* env, jarray array);
 793     jobject (JNICALL *GetSubElementSelector)
 794       (JNIEnv* env, jobject selector, jfieldID fieldID);
 795 
 796     jobject (JNICALL *GetObjectSubElement)
 797       (JNIEnv* env, jarray array, jobject selector, int index);
 798     void (JNICALL *SetObjectSubElement)
 799     (JNIEnv* env, jarray array, jobject selector, int index, jobject value);
 800 
 801     jboolean (JNICALL *GetBooleanSubElement)
 802       (JNIEnv* env, jarray array, jobject selector, int index);
 803     jbyte (JNICALL *GetByteSubElement)
 804       (JNIEnv* env, jarray array, jobject selector, int index);
 805     jshort (JNICALL *GetShortSubElement)
 806       (JNIEnv* env, jarray array, jobject selector, int index);
 807     jchar (JNICALL *GetCharSubElement)
 808       (JNIEnv* env, jarray array, jobject selector, int index);
 809     jint (JNICALL *GetIntSubElement)
 810       (JNIEnv* env, jarray array, jobject selector, int index);
 811     jlong (JNICALL *GetLongSubElement)
 812       (JNIEnv* env, jarray array, jobject selector, int index);
 813     jfloat (JNICALL *GetFloatSubElement)
 814       (JNIEnv* env, jarray array, jobject selector, int index);
 815     jdouble (JNICALL *GetDoubleSubElement)
 816       (JNIEnv* env, jarray array, jobject selector, int index);
 817 
 818     void (JNICALL *SetBooleanSubElement)
 819       (JNIEnv* env, jarray array, jobject selector, int index, jboolean value);
 820     void (JNICALL *SetByteSubElement)
 821       (JNIEnv* env, jarray array, jobject selector, int index, jbyte value);
 822     void (JNICALL *SetShortSubElement)
 823       (JNIEnv* env, jarray array, jobject selector, int index, jshort value);
 824     void (JNICALL *SetCharSubElement)
 825       (JNIEnv* env, jarray array, jobject selector, int index, jchar value);
 826     void (JNICALL *SetIntSubElement)
 827       (JNIEnv* env, jarray array, jobject selector, int index, jint value);
 828     void (JNICALL *SetLongSubElement)
 829       (JNIEnv* env, jarray array, jobject selector, int index, jlong value);
 830     void (JNICALL *SetFloatSubElement)
 831       (JNIEnv* env, jarray array, jobject selector, int index, jfloat value);
 832     void (JNICALL *SetDoubleSubElement)
 833       (JNIEnv* env, jarray array, jobject selector, int index, jdouble value);
 834 };
 835 
 836 /*
 837  * We use inlined functions for C++ so that programmers can write:
 838  *
 839  *    env->FindClass("java/lang/String")
 840  *
 841  * in C++ rather than:
 842  *
 843  *    (*env)->FindClass(env, "java/lang/String")
 844  *
 845  * in C.
 846  */
 847 
 848 struct JNIEnv_ {
 849     const struct JNINativeInterface_ *functions;
 850 #ifdef __cplusplus
 851 
 852     jint GetVersion() {
 853         return functions->GetVersion(this);
 854     }
 855     jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
 856                        jsize len) {
 857         return functions->DefineClass(this, name, loader, buf, len);
 858     }
 859     jclass FindClass(const char *name) {
 860         return functions->FindClass(this, name);
 861     }
 862     jmethodID FromReflectedMethod(jobject method) {
 863         return functions->FromReflectedMethod(this,method);
 864     }
 865     jfieldID FromReflectedField(jobject field) {
 866         return functions->FromReflectedField(this,field);
 867     }
 868 
 869     jobject ToReflectedMethod(jclass cls, jmethodID methodID, jboolean isStatic) {
 870         return functions->ToReflectedMethod(this, cls, methodID, isStatic);
 871     }
 872 
 873     jclass GetSuperclass(jclass sub) {
 874         return functions->GetSuperclass(this, sub);
 875     }
 876     jboolean IsAssignableFrom(jclass sub, jclass sup) {
 877         return functions->IsAssignableFrom(this, sub, sup);
 878     }
 879 
 880     jobject ToReflectedField(jclass cls, jfieldID fieldID, jboolean isStatic) {
 881         return functions->ToReflectedField(this,cls,fieldID,isStatic);
 882     }
 883 
 884     jint Throw(jthrowable obj) {
 885         return functions->Throw(this, obj);
 886     }
 887     jint ThrowNew(jclass clazz, const char *msg) {
 888         return functions->ThrowNew(this, clazz, msg);
 889     }
 890     jthrowable ExceptionOccurred() {
 891         return functions->ExceptionOccurred(this);
 892     }
 893     void ExceptionDescribe() {
 894         functions->ExceptionDescribe(this);
 895     }
 896     void ExceptionClear() {
 897         functions->ExceptionClear(this);
 898     }
 899     void FatalError(const char *msg) {
 900         functions->FatalError(this, msg);
 901     }
 902 
 903     jint PushLocalFrame(jint capacity) {
 904         return functions->PushLocalFrame(this,capacity);
 905     }
 906     jobject PopLocalFrame(jobject result) {
 907         return functions->PopLocalFrame(this,result);
 908     }
 909 
 910     jobject NewGlobalRef(jobject lobj) {
 911         return functions->NewGlobalRef(this,lobj);
 912     }
 913     void DeleteGlobalRef(jobject gref) {
 914         functions->DeleteGlobalRef(this,gref);
 915     }
 916     void DeleteLocalRef(jobject obj) {
 917         functions->DeleteLocalRef(this, obj);
 918     }
 919 
 920     jboolean IsSameObject(jobject obj1, jobject obj2) {
 921         return functions->IsSameObject(this,obj1,obj2);
 922     }
 923 
 924     jobject NewLocalRef(jobject ref) {
 925         return functions->NewLocalRef(this,ref);
 926     }
 927     jint EnsureLocalCapacity(jint capacity) {
 928         return functions->EnsureLocalCapacity(this,capacity);
 929     }
 930 
 931     jobject AllocObject(jclass clazz) {
 932         return functions->AllocObject(this,clazz);
 933     }
 934     jobject NewObject(jclass clazz, jmethodID methodID, ...) {
 935         va_list args;
 936         jobject result;
 937         va_start(args, methodID);
 938         result = functions->NewObjectV(this,clazz,methodID,args);
 939         va_end(args);
 940         return result;
 941     }
 942     jobject NewObjectV(jclass clazz, jmethodID methodID,
 943                        va_list args) {
 944         return functions->NewObjectV(this,clazz,methodID,args);
 945     }
 946     jobject NewObjectA(jclass clazz, jmethodID methodID,
 947                        const jvalue *args) {
 948         return functions->NewObjectA(this,clazz,methodID,args);
 949     }
 950 
 951     jclass GetObjectClass(jobject obj) {
 952         return functions->GetObjectClass(this,obj);
 953     }
 954     jboolean IsInstanceOf(jobject obj, jclass clazz) {
 955         return functions->IsInstanceOf(this,obj,clazz);
 956     }
 957 
 958     jmethodID GetMethodID(jclass clazz, const char *name,
 959                           const char *sig) {
 960         return functions->GetMethodID(this,clazz,name,sig);
 961     }
 962 
 963     jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) {
 964         va_list args;
 965         jobject result;
 966         va_start(args,methodID);
 967         result = functions->CallObjectMethodV(this,obj,methodID,args);
 968         va_end(args);
 969         return result;
 970     }
 971     jobject CallObjectMethodV(jobject obj, jmethodID methodID,
 972                         va_list args) {
 973         return functions->CallObjectMethodV(this,obj,methodID,args);
 974     }
 975     jobject CallObjectMethodA(jobject obj, jmethodID methodID,
 976                         const jvalue * args) {
 977         return functions->CallObjectMethodA(this,obj,methodID,args);
 978     }
 979 
 980     jboolean CallBooleanMethod(jobject obj,
 981                                jmethodID methodID, ...) {
 982         va_list args;
 983         jboolean result;
 984         va_start(args,methodID);
 985         result = functions->CallBooleanMethodV(this,obj,methodID,args);
 986         va_end(args);
 987         return result;
 988     }
 989     jboolean CallBooleanMethodV(jobject obj, jmethodID methodID,
 990                                 va_list args) {
 991         return functions->CallBooleanMethodV(this,obj,methodID,args);
 992     }
 993     jboolean CallBooleanMethodA(jobject obj, jmethodID methodID,
 994                                 const jvalue * args) {
 995         return functions->CallBooleanMethodA(this,obj,methodID, args);
 996     }
 997 
 998     jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) {
 999         va_list args;
1000         jbyte result;
1001         va_start(args,methodID);
1002         result = functions->CallByteMethodV(this,obj,methodID,args);
1003         va_end(args);
1004         return result;
1005     }
1006     jbyte CallByteMethodV(jobject obj, jmethodID methodID,
1007                           va_list args) {
1008         return functions->CallByteMethodV(this,obj,methodID,args);
1009     }
1010     jbyte CallByteMethodA(jobject obj, jmethodID methodID,
1011                           const jvalue * args) {
1012         return functions->CallByteMethodA(this,obj,methodID,args);
1013     }
1014 
1015     jchar CallCharMethod(jobject obj, jmethodID methodID, ...) {
1016         va_list args;
1017         jchar result;
1018         va_start(args,methodID);
1019         result = functions->CallCharMethodV(this,obj,methodID,args);
1020         va_end(args);
1021         return result;
1022     }
1023     jchar CallCharMethodV(jobject obj, jmethodID methodID,
1024                           va_list args) {
1025         return functions->CallCharMethodV(this,obj,methodID,args);
1026     }
1027     jchar CallCharMethodA(jobject obj, jmethodID methodID,
1028                           const jvalue * args) {
1029         return functions->CallCharMethodA(this,obj,methodID,args);
1030     }
1031 
1032     jshort CallShortMethod(jobject obj, jmethodID methodID, ...) {
1033         va_list args;
1034         jshort result;
1035         va_start(args,methodID);
1036         result = functions->CallShortMethodV(this,obj,methodID,args);
1037         va_end(args);
1038         return result;
1039     }
1040     jshort CallShortMethodV(jobject obj, jmethodID methodID,
1041                             va_list args) {
1042         return functions->CallShortMethodV(this,obj,methodID,args);
1043     }
1044     jshort CallShortMethodA(jobject obj, jmethodID methodID,
1045                             const jvalue * args) {
1046         return functions->CallShortMethodA(this,obj,methodID,args);
1047     }
1048 
1049     jint CallIntMethod(jobject obj, jmethodID methodID, ...) {
1050         va_list args;
1051         jint result;
1052         va_start(args,methodID);
1053         result = functions->CallIntMethodV(this,obj,methodID,args);
1054         va_end(args);
1055         return result;
1056     }
1057     jint CallIntMethodV(jobject obj, jmethodID methodID,
1058                         va_list args) {
1059         return functions->CallIntMethodV(this,obj,methodID,args);
1060     }
1061     jint CallIntMethodA(jobject obj, jmethodID methodID,
1062                         const jvalue * args) {
1063         return functions->CallIntMethodA(this,obj,methodID,args);
1064     }
1065 
1066     jlong CallLongMethod(jobject obj, jmethodID methodID, ...) {
1067         va_list args;
1068         jlong result;
1069         va_start(args,methodID);
1070         result = functions->CallLongMethodV(this,obj,methodID,args);
1071         va_end(args);
1072         return result;
1073     }
1074     jlong CallLongMethodV(jobject obj, jmethodID methodID,
1075                           va_list args) {
1076         return functions->CallLongMethodV(this,obj,methodID,args);
1077     }
1078     jlong CallLongMethodA(jobject obj, jmethodID methodID,
1079                           const jvalue * args) {
1080         return functions->CallLongMethodA(this,obj,methodID,args);
1081     }
1082 
1083     jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) {
1084         va_list args;
1085         jfloat result;
1086         va_start(args,methodID);
1087         result = functions->CallFloatMethodV(this,obj,methodID,args);
1088         va_end(args);
1089         return result;
1090     }
1091     jfloat CallFloatMethodV(jobject obj, jmethodID methodID,
1092                             va_list args) {
1093         return functions->CallFloatMethodV(this,obj,methodID,args);
1094     }
1095     jfloat CallFloatMethodA(jobject obj, jmethodID methodID,
1096                             const jvalue * args) {
1097         return functions->CallFloatMethodA(this,obj,methodID,args);
1098     }
1099 
1100     jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) {
1101         va_list args;
1102         jdouble result;
1103         va_start(args,methodID);
1104         result = functions->CallDoubleMethodV(this,obj,methodID,args);
1105         va_end(args);
1106         return result;
1107     }
1108     jdouble CallDoubleMethodV(jobject obj, jmethodID methodID,
1109                         va_list args) {
1110         return functions->CallDoubleMethodV(this,obj,methodID,args);
1111     }
1112     jdouble CallDoubleMethodA(jobject obj, jmethodID methodID,
1113                         const jvalue * args) {
1114         return functions->CallDoubleMethodA(this,obj,methodID,args);
1115     }
1116 
1117     void CallVoidMethod(jobject obj, jmethodID methodID, ...) {
1118         va_list args;
1119         va_start(args,methodID);
1120         functions->CallVoidMethodV(this,obj,methodID,args);
1121         va_end(args);
1122     }
1123     void CallVoidMethodV(jobject obj, jmethodID methodID,
1124                          va_list args) {
1125         functions->CallVoidMethodV(this,obj,methodID,args);
1126     }
1127     void CallVoidMethodA(jobject obj, jmethodID methodID,
1128                          const jvalue * args) {
1129         functions->CallVoidMethodA(this,obj,methodID,args);
1130     }
1131 
1132     jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz,
1133                                        jmethodID methodID, ...) {
1134         va_list args;
1135         jobject result;
1136         va_start(args,methodID);
1137         result = functions->CallNonvirtualObjectMethodV(this,obj,clazz,
1138                                                         methodID,args);
1139         va_end(args);
1140         return result;
1141     }
1142     jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz,
1143                                         jmethodID methodID, va_list args) {
1144         return functions->CallNonvirtualObjectMethodV(this,obj,clazz,
1145                                                       methodID,args);
1146     }
1147     jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz,
1148                                         jmethodID methodID, const jvalue * args) {
1149         return functions->CallNonvirtualObjectMethodA(this,obj,clazz,
1150                                                       methodID,args);
1151     }
1152 
1153     jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz,
1154                                          jmethodID methodID, ...) {
1155         va_list args;
1156         jboolean result;
1157         va_start(args,methodID);
1158         result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
1159                                                          methodID,args);
1160         va_end(args);
1161         return result;
1162     }
1163     jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz,
1164                                           jmethodID methodID, va_list args) {
1165         return functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
1166                                                        methodID,args);
1167     }
1168     jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz,
1169                                           jmethodID methodID, const jvalue * args) {
1170         return functions->CallNonvirtualBooleanMethodA(this,obj,clazz,
1171                                                        methodID, args);
1172     }
1173 
1174     jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz,
1175                                    jmethodID methodID, ...) {
1176         va_list args;
1177         jbyte result;
1178         va_start(args,methodID);
1179         result = functions->CallNonvirtualByteMethodV(this,obj,clazz,
1180                                                       methodID,args);
1181         va_end(args);
1182         return result;
1183     }
1184     jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz,
1185                                     jmethodID methodID, va_list args) {
1186         return functions->CallNonvirtualByteMethodV(this,obj,clazz,
1187                                                     methodID,args);
1188     }
1189     jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz,
1190                                     jmethodID methodID, const jvalue * args) {
1191         return functions->CallNonvirtualByteMethodA(this,obj,clazz,
1192                                                     methodID,args);
1193     }
1194 
1195     jchar CallNonvirtualCharMethod(jobject obj, jclass clazz,
1196                                    jmethodID methodID, ...) {
1197         va_list args;
1198         jchar result;
1199         va_start(args,methodID);
1200         result = functions->CallNonvirtualCharMethodV(this,obj,clazz,
1201                                                       methodID,args);
1202         va_end(args);
1203         return result;
1204     }
1205     jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz,
1206                                     jmethodID methodID, va_list args) {
1207         return functions->CallNonvirtualCharMethodV(this,obj,clazz,
1208                                                     methodID,args);
1209     }
1210     jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz,
1211                                     jmethodID methodID, const jvalue * args) {
1212         return functions->CallNonvirtualCharMethodA(this,obj,clazz,
1213                                                     methodID,args);
1214     }
1215 
1216     jshort CallNonvirtualShortMethod(jobject obj, jclass clazz,
1217                                      jmethodID methodID, ...) {
1218         va_list args;
1219         jshort result;
1220         va_start(args,methodID);
1221         result = functions->CallNonvirtualShortMethodV(this,obj,clazz,
1222                                                        methodID,args);
1223         va_end(args);
1224         return result;
1225     }
1226     jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz,
1227                                       jmethodID methodID, va_list args) {
1228         return functions->CallNonvirtualShortMethodV(this,obj,clazz,
1229                                                      methodID,args);
1230     }
1231     jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz,
1232                                       jmethodID methodID, const jvalue * args) {
1233         return functions->CallNonvirtualShortMethodA(this,obj,clazz,
1234                                                      methodID,args);
1235     }
1236 
1237     jint CallNonvirtualIntMethod(jobject obj, jclass clazz,
1238                                  jmethodID methodID, ...) {
1239         va_list args;
1240         jint result;
1241         va_start(args,methodID);
1242         result = functions->CallNonvirtualIntMethodV(this,obj,clazz,
1243                                                      methodID,args);
1244         va_end(args);
1245         return result;
1246     }
1247     jint CallNonvirtualIntMethodV(jobject obj, jclass clazz,
1248                                   jmethodID methodID, va_list args) {
1249         return functions->CallNonvirtualIntMethodV(this,obj,clazz,
1250                                                    methodID,args);
1251     }
1252     jint CallNonvirtualIntMethodA(jobject obj, jclass clazz,
1253                                   jmethodID methodID, const jvalue * args) {
1254         return functions->CallNonvirtualIntMethodA(this,obj,clazz,
1255                                                    methodID,args);
1256     }
1257 
1258     jlong CallNonvirtualLongMethod(jobject obj, jclass clazz,
1259                                    jmethodID methodID, ...) {
1260         va_list args;
1261         jlong result;
1262         va_start(args,methodID);
1263         result = functions->CallNonvirtualLongMethodV(this,obj,clazz,
1264                                                       methodID,args);
1265         va_end(args);
1266         return result;
1267     }
1268     jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz,
1269                                     jmethodID methodID, va_list args) {
1270         return functions->CallNonvirtualLongMethodV(this,obj,clazz,
1271                                                     methodID,args);
1272     }
1273     jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz,
1274                                     jmethodID methodID, const jvalue * args) {
1275         return functions->CallNonvirtualLongMethodA(this,obj,clazz,
1276                                                     methodID,args);
1277     }
1278 
1279     jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz,
1280                                      jmethodID methodID, ...) {
1281         va_list args;
1282         jfloat result;
1283         va_start(args,methodID);
1284         result = functions->CallNonvirtualFloatMethodV(this,obj,clazz,
1285                                                        methodID,args);
1286         va_end(args);
1287         return result;
1288     }
1289     jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz,
1290                                       jmethodID methodID,
1291                                       va_list args) {
1292         return functions->CallNonvirtualFloatMethodV(this,obj,clazz,
1293                                                      methodID,args);
1294     }
1295     jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz,
1296                                       jmethodID methodID,
1297                                       const jvalue * args) {
1298         return functions->CallNonvirtualFloatMethodA(this,obj,clazz,
1299                                                      methodID,args);
1300     }
1301 
1302     jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz,
1303                                        jmethodID methodID, ...) {
1304         va_list args;
1305         jdouble result;
1306         va_start(args,methodID);
1307         result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
1308                                                         methodID,args);
1309         va_end(args);
1310         return result;
1311     }
1312     jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz,
1313                                         jmethodID methodID,
1314                                         va_list args) {
1315         return functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
1316                                                       methodID,args);
1317     }
1318     jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz,
1319                                         jmethodID methodID,
1320                                         const jvalue * args) {
1321         return functions->CallNonvirtualDoubleMethodA(this,obj,clazz,
1322                                                       methodID,args);
1323     }
1324 
1325     void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
1326                                   jmethodID methodID, ...) {
1327         va_list args;
1328         va_start(args,methodID);
1329         functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
1330         va_end(args);
1331     }
1332     void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
1333                                    jmethodID methodID,
1334                                    va_list args) {
1335         functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
1336     }
1337     void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
1338                                    jmethodID methodID,
1339                                    const jvalue * args) {
1340         functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args);
1341     }
1342 
1343     jfieldID GetFieldID(jclass clazz, const char *name,
1344                         const char *sig) {
1345         return functions->GetFieldID(this,clazz,name,sig);
1346     }
1347 
1348     jobject GetObjectField(jobject obj, jfieldID fieldID) {
1349         return functions->GetObjectField(this,obj,fieldID);
1350     }
1351     jboolean GetBooleanField(jobject obj, jfieldID fieldID) {
1352         return functions->GetBooleanField(this,obj,fieldID);
1353     }
1354     jbyte GetByteField(jobject obj, jfieldID fieldID) {
1355         return functions->GetByteField(this,obj,fieldID);
1356     }
1357     jchar GetCharField(jobject obj, jfieldID fieldID) {
1358         return functions->GetCharField(this,obj,fieldID);
1359     }
1360     jshort GetShortField(jobject obj, jfieldID fieldID) {
1361         return functions->GetShortField(this,obj,fieldID);
1362     }
1363     jint GetIntField(jobject obj, jfieldID fieldID) {
1364         return functions->GetIntField(this,obj,fieldID);
1365     }
1366     jlong GetLongField(jobject obj, jfieldID fieldID) {
1367         return functions->GetLongField(this,obj,fieldID);
1368     }
1369     jfloat GetFloatField(jobject obj, jfieldID fieldID) {
1370         return functions->GetFloatField(this,obj,fieldID);
1371     }
1372     jdouble GetDoubleField(jobject obj, jfieldID fieldID) {
1373         return functions->GetDoubleField(this,obj,fieldID);
1374     }
1375 
1376     void SetObjectField(jobject obj, jfieldID fieldID, jobject val) {
1377         functions->SetObjectField(this,obj,fieldID,val);
1378     }
1379     void SetBooleanField(jobject obj, jfieldID fieldID,
1380                          jboolean val) {
1381         functions->SetBooleanField(this,obj,fieldID,val);
1382     }
1383     void SetByteField(jobject obj, jfieldID fieldID,
1384                       jbyte val) {
1385         functions->SetByteField(this,obj,fieldID,val);
1386     }
1387     void SetCharField(jobject obj, jfieldID fieldID,
1388                       jchar val) {
1389         functions->SetCharField(this,obj,fieldID,val);
1390     }
1391     void SetShortField(jobject obj, jfieldID fieldID,
1392                        jshort val) {
1393         functions->SetShortField(this,obj,fieldID,val);
1394     }
1395     void SetIntField(jobject obj, jfieldID fieldID,
1396                      jint val) {
1397         functions->SetIntField(this,obj,fieldID,val);
1398     }
1399     void SetLongField(jobject obj, jfieldID fieldID,
1400                       jlong val) {
1401         functions->SetLongField(this,obj,fieldID,val);
1402     }
1403     void SetFloatField(jobject obj, jfieldID fieldID,
1404                        jfloat val) {
1405         functions->SetFloatField(this,obj,fieldID,val);
1406     }
1407     void SetDoubleField(jobject obj, jfieldID fieldID,
1408                         jdouble val) {
1409         functions->SetDoubleField(this,obj,fieldID,val);
1410     }
1411 
1412     jmethodID GetStaticMethodID(jclass clazz, const char *name,
1413                                 const char *sig) {
1414         return functions->GetStaticMethodID(this,clazz,name,sig);
1415     }
1416 
1417     jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID,
1418                              ...) {
1419         va_list args;
1420         jobject result;
1421         va_start(args,methodID);
1422         result = functions->CallStaticObjectMethodV(this,clazz,methodID,args);
1423         va_end(args);
1424         return result;
1425     }
1426     jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID,
1427                               va_list args) {
1428         return functions->CallStaticObjectMethodV(this,clazz,methodID,args);
1429     }
1430     jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID,
1431                               const jvalue *args) {
1432         return functions->CallStaticObjectMethodA(this,clazz,methodID,args);
1433     }
1434 
1435     jboolean CallStaticBooleanMethod(jclass clazz,
1436                                      jmethodID methodID, ...) {
1437         va_list args;
1438         jboolean result;
1439         va_start(args,methodID);
1440         result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
1441         va_end(args);
1442         return result;
1443     }
1444     jboolean CallStaticBooleanMethodV(jclass clazz,
1445                                       jmethodID methodID, va_list args) {
1446         return functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
1447     }
1448     jboolean CallStaticBooleanMethodA(jclass clazz,
1449                                       jmethodID methodID, const jvalue *args) {
1450         return functions->CallStaticBooleanMethodA(this,clazz,methodID,args);
1451     }
1452 
1453     jbyte CallStaticByteMethod(jclass clazz,
1454                                jmethodID methodID, ...) {
1455         va_list args;
1456         jbyte result;
1457         va_start(args,methodID);
1458         result = functions->CallStaticByteMethodV(this,clazz,methodID,args);
1459         va_end(args);
1460         return result;
1461     }
1462     jbyte CallStaticByteMethodV(jclass clazz,
1463                                 jmethodID methodID, va_list args) {
1464         return functions->CallStaticByteMethodV(this,clazz,methodID,args);
1465     }
1466     jbyte CallStaticByteMethodA(jclass clazz,
1467                                 jmethodID methodID, const jvalue *args) {
1468         return functions->CallStaticByteMethodA(this,clazz,methodID,args);
1469     }
1470 
1471     jchar CallStaticCharMethod(jclass clazz,
1472                                jmethodID methodID, ...) {
1473         va_list args;
1474         jchar result;
1475         va_start(args,methodID);
1476         result = functions->CallStaticCharMethodV(this,clazz,methodID,args);
1477         va_end(args);
1478         return result;
1479     }
1480     jchar CallStaticCharMethodV(jclass clazz,
1481                                 jmethodID methodID, va_list args) {
1482         return functions->CallStaticCharMethodV(this,clazz,methodID,args);
1483     }
1484     jchar CallStaticCharMethodA(jclass clazz,
1485                                 jmethodID methodID, const jvalue *args) {
1486         return functions->CallStaticCharMethodA(this,clazz,methodID,args);
1487     }
1488 
1489     jshort CallStaticShortMethod(jclass clazz,
1490                                  jmethodID methodID, ...) {
1491         va_list args;
1492         jshort result;
1493         va_start(args,methodID);
1494         result = functions->CallStaticShortMethodV(this,clazz,methodID,args);
1495         va_end(args);
1496         return result;
1497     }
1498     jshort CallStaticShortMethodV(jclass clazz,
1499                                   jmethodID methodID, va_list args) {
1500         return functions->CallStaticShortMethodV(this,clazz,methodID,args);
1501     }
1502     jshort CallStaticShortMethodA(jclass clazz,
1503                                   jmethodID methodID, const jvalue *args) {
1504         return functions->CallStaticShortMethodA(this,clazz,methodID,args);
1505     }
1506 
1507     jint CallStaticIntMethod(jclass clazz,
1508                              jmethodID methodID, ...) {
1509         va_list args;
1510         jint result;
1511         va_start(args,methodID);
1512         result = functions->CallStaticIntMethodV(this,clazz,methodID,args);
1513         va_end(args);
1514         return result;
1515     }
1516     jint CallStaticIntMethodV(jclass clazz,
1517                               jmethodID methodID, va_list args) {
1518         return functions->CallStaticIntMethodV(this,clazz,methodID,args);
1519     }
1520     jint CallStaticIntMethodA(jclass clazz,
1521                               jmethodID methodID, const jvalue *args) {
1522         return functions->CallStaticIntMethodA(this,clazz,methodID,args);
1523     }
1524 
1525     jlong CallStaticLongMethod(jclass clazz,
1526                                jmethodID methodID, ...) {
1527         va_list args;
1528         jlong result;
1529         va_start(args,methodID);
1530         result = functions->CallStaticLongMethodV(this,clazz,methodID,args);
1531         va_end(args);
1532         return result;
1533     }
1534     jlong CallStaticLongMethodV(jclass clazz,
1535                                 jmethodID methodID, va_list args) {
1536         return functions->CallStaticLongMethodV(this,clazz,methodID,args);
1537     }
1538     jlong CallStaticLongMethodA(jclass clazz,
1539                                 jmethodID methodID, const jvalue *args) {
1540         return functions->CallStaticLongMethodA(this,clazz,methodID,args);
1541     }
1542 
1543     jfloat CallStaticFloatMethod(jclass clazz,
1544                                  jmethodID methodID, ...) {
1545         va_list args;
1546         jfloat result;
1547         va_start(args,methodID);
1548         result = functions->CallStaticFloatMethodV(this,clazz,methodID,args);
1549         va_end(args);
1550         return result;
1551     }
1552     jfloat CallStaticFloatMethodV(jclass clazz,
1553                                   jmethodID methodID, va_list args) {
1554         return functions->CallStaticFloatMethodV(this,clazz,methodID,args);
1555     }
1556     jfloat CallStaticFloatMethodA(jclass clazz,
1557                                   jmethodID methodID, const jvalue *args) {
1558         return functions->CallStaticFloatMethodA(this,clazz,methodID,args);
1559     }
1560 
1561     jdouble CallStaticDoubleMethod(jclass clazz,
1562                                    jmethodID methodID, ...) {
1563         va_list args;
1564         jdouble result;
1565         va_start(args,methodID);
1566         result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
1567         va_end(args);
1568         return result;
1569     }
1570     jdouble CallStaticDoubleMethodV(jclass clazz,
1571                                     jmethodID methodID, va_list args) {
1572         return functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
1573     }
1574     jdouble CallStaticDoubleMethodA(jclass clazz,
1575                                     jmethodID methodID, const jvalue *args) {
1576         return functions->CallStaticDoubleMethodA(this,clazz,methodID,args);
1577     }
1578 
1579     void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
1580         va_list args;
1581         va_start(args,methodID);
1582         functions->CallStaticVoidMethodV(this,cls,methodID,args);
1583         va_end(args);
1584     }
1585     void CallStaticVoidMethodV(jclass cls, jmethodID methodID,
1586                                va_list args) {
1587         functions->CallStaticVoidMethodV(this,cls,methodID,args);
1588     }
1589     void CallStaticVoidMethodA(jclass cls, jmethodID methodID,
1590                                const jvalue * args) {
1591         functions->CallStaticVoidMethodA(this,cls,methodID,args);
1592     }
1593 
1594     jfieldID GetStaticFieldID(jclass clazz, const char *name,
1595                               const char *sig) {
1596         return functions->GetStaticFieldID(this,clazz,name,sig);
1597     }
1598     jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) {
1599         return functions->GetStaticObjectField(this,clazz,fieldID);
1600     }
1601     jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) {
1602         return functions->GetStaticBooleanField(this,clazz,fieldID);
1603     }
1604     jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) {
1605         return functions->GetStaticByteField(this,clazz,fieldID);
1606     }
1607     jchar GetStaticCharField(jclass clazz, jfieldID fieldID) {
1608         return functions->GetStaticCharField(this,clazz,fieldID);
1609     }
1610     jshort GetStaticShortField(jclass clazz, jfieldID fieldID) {
1611         return functions->GetStaticShortField(this,clazz,fieldID);
1612     }
1613     jint GetStaticIntField(jclass clazz, jfieldID fieldID) {
1614         return functions->GetStaticIntField(this,clazz,fieldID);
1615     }
1616     jlong GetStaticLongField(jclass clazz, jfieldID fieldID) {
1617         return functions->GetStaticLongField(this,clazz,fieldID);
1618     }
1619     jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) {
1620         return functions->GetStaticFloatField(this,clazz,fieldID);
1621     }
1622     jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) {
1623         return functions->GetStaticDoubleField(this,clazz,fieldID);
1624     }
1625 
1626     void SetStaticObjectField(jclass clazz, jfieldID fieldID,
1627                         jobject value) {
1628       functions->SetStaticObjectField(this,clazz,fieldID,value);
1629     }
1630     void SetStaticBooleanField(jclass clazz, jfieldID fieldID,
1631                         jboolean value) {
1632       functions->SetStaticBooleanField(this,clazz,fieldID,value);
1633     }
1634     void SetStaticByteField(jclass clazz, jfieldID fieldID,
1635                         jbyte value) {
1636       functions->SetStaticByteField(this,clazz,fieldID,value);
1637     }
1638     void SetStaticCharField(jclass clazz, jfieldID fieldID,
1639                         jchar value) {
1640       functions->SetStaticCharField(this,clazz,fieldID,value);
1641     }
1642     void SetStaticShortField(jclass clazz, jfieldID fieldID,
1643                         jshort value) {
1644       functions->SetStaticShortField(this,clazz,fieldID,value);
1645     }
1646     void SetStaticIntField(jclass clazz, jfieldID fieldID,
1647                         jint value) {
1648       functions->SetStaticIntField(this,clazz,fieldID,value);
1649     }
1650     void SetStaticLongField(jclass clazz, jfieldID fieldID,
1651                         jlong value) {
1652       functions->SetStaticLongField(this,clazz,fieldID,value);
1653     }
1654     void SetStaticFloatField(jclass clazz, jfieldID fieldID,
1655                         jfloat value) {
1656       functions->SetStaticFloatField(this,clazz,fieldID,value);
1657     }
1658     void SetStaticDoubleField(jclass clazz, jfieldID fieldID,
1659                         jdouble value) {
1660       functions->SetStaticDoubleField(this,clazz,fieldID,value);
1661     }
1662 
1663     jstring NewString(const jchar *unicode, jsize len) {
1664         return functions->NewString(this,unicode,len);
1665     }
1666     jsize GetStringLength(jstring str) {
1667         return functions->GetStringLength(this,str);
1668     }
1669     const jchar *GetStringChars(jstring str, jboolean *isCopy) {
1670         return functions->GetStringChars(this,str,isCopy);
1671     }
1672     void ReleaseStringChars(jstring str, const jchar *chars) {
1673         functions->ReleaseStringChars(this,str,chars);
1674     }
1675 
1676     jstring NewStringUTF(const char *utf) {
1677         return functions->NewStringUTF(this,utf);
1678     }
1679     jsize GetStringUTFLength(jstring str) {
1680         return functions->GetStringUTFLength(this,str);
1681     }
1682     const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
1683         return functions->GetStringUTFChars(this,str,isCopy);
1684     }
1685     void ReleaseStringUTFChars(jstring str, const char* chars) {
1686         functions->ReleaseStringUTFChars(this,str,chars);
1687     }
1688 
1689     jsize GetArrayLength(jarray array) {
1690         return functions->GetArrayLength(this,array);
1691     }
1692 
1693     jobjectArray NewObjectArray(jsize len, jclass clazz,
1694                                 jobject init) {
1695         return functions->NewObjectArray(this,len,clazz,init);
1696     }
1697     jobject GetObjectArrayElement(jobjectArray array, jsize index) {
1698         return functions->GetObjectArrayElement(this,array,index);
1699     }
1700     void SetObjectArrayElement(jobjectArray array, jsize index,
1701                                jobject val) {
1702         functions->SetObjectArrayElement(this,array,index,val);
1703     }
1704 
1705     jbooleanArray NewBooleanArray(jsize len) {
1706         return functions->NewBooleanArray(this,len);
1707     }
1708     jbyteArray NewByteArray(jsize len) {
1709         return functions->NewByteArray(this,len);
1710     }
1711     jcharArray NewCharArray(jsize len) {
1712         return functions->NewCharArray(this,len);
1713     }
1714     jshortArray NewShortArray(jsize len) {
1715         return functions->NewShortArray(this,len);
1716     }
1717     jintArray NewIntArray(jsize len) {
1718         return functions->NewIntArray(this,len);
1719     }
1720     jlongArray NewLongArray(jsize len) {
1721         return functions->NewLongArray(this,len);
1722     }
1723     jfloatArray NewFloatArray(jsize len) {
1724         return functions->NewFloatArray(this,len);
1725     }
1726     jdoubleArray NewDoubleArray(jsize len) {
1727         return functions->NewDoubleArray(this,len);
1728     }
1729 
1730     jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) {
1731         return functions->GetBooleanArrayElements(this,array,isCopy);
1732     }
1733     jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) {
1734         return functions->GetByteArrayElements(this,array,isCopy);
1735     }
1736     jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) {
1737         return functions->GetCharArrayElements(this,array,isCopy);
1738     }
1739     jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) {
1740         return functions->GetShortArrayElements(this,array,isCopy);
1741     }
1742     jint * GetIntArrayElements(jintArray array, jboolean *isCopy) {
1743         return functions->GetIntArrayElements(this,array,isCopy);
1744     }
1745     jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) {
1746         return functions->GetLongArrayElements(this,array,isCopy);
1747     }
1748     jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) {
1749         return functions->GetFloatArrayElements(this,array,isCopy);
1750     }
1751     jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) {
1752         return functions->GetDoubleArrayElements(this,array,isCopy);
1753     }
1754 
1755     void ReleaseBooleanArrayElements(jbooleanArray array,
1756                                      jboolean *elems,
1757                                      jint mode) {
1758         functions->ReleaseBooleanArrayElements(this,array,elems,mode);
1759     }
1760     void ReleaseByteArrayElements(jbyteArray array,
1761                                   jbyte *elems,
1762                                   jint mode) {
1763         functions->ReleaseByteArrayElements(this,array,elems,mode);
1764     }
1765     void ReleaseCharArrayElements(jcharArray array,
1766                                   jchar *elems,
1767                                   jint mode) {
1768         functions->ReleaseCharArrayElements(this,array,elems,mode);
1769     }
1770     void ReleaseShortArrayElements(jshortArray array,
1771                                    jshort *elems,
1772                                    jint mode) {
1773         functions->ReleaseShortArrayElements(this,array,elems,mode);
1774     }
1775     void ReleaseIntArrayElements(jintArray array,
1776                                  jint *elems,
1777                                  jint mode) {
1778         functions->ReleaseIntArrayElements(this,array,elems,mode);
1779     }
1780     void ReleaseLongArrayElements(jlongArray array,
1781                                   jlong *elems,
1782                                   jint mode) {
1783         functions->ReleaseLongArrayElements(this,array,elems,mode);
1784     }
1785     void ReleaseFloatArrayElements(jfloatArray array,
1786                                    jfloat *elems,
1787                                    jint mode) {
1788         functions->ReleaseFloatArrayElements(this,array,elems,mode);
1789     }
1790     void ReleaseDoubleArrayElements(jdoubleArray array,
1791                                     jdouble *elems,
1792                                     jint mode) {
1793         functions->ReleaseDoubleArrayElements(this,array,elems,mode);
1794     }
1795 
1796     void GetBooleanArrayRegion(jbooleanArray array,
1797                                jsize start, jsize len, jboolean *buf) {
1798         functions->GetBooleanArrayRegion(this,array,start,len,buf);
1799     }
1800     void GetByteArrayRegion(jbyteArray array,
1801                             jsize start, jsize len, jbyte *buf) {
1802         functions->GetByteArrayRegion(this,array,start,len,buf);
1803     }
1804     void GetCharArrayRegion(jcharArray array,
1805                             jsize start, jsize len, jchar *buf) {
1806         functions->GetCharArrayRegion(this,array,start,len,buf);
1807     }
1808     void GetShortArrayRegion(jshortArray array,
1809                              jsize start, jsize len, jshort *buf) {
1810         functions->GetShortArrayRegion(this,array,start,len,buf);
1811     }
1812     void GetIntArrayRegion(jintArray array,
1813                            jsize start, jsize len, jint *buf) {
1814         functions->GetIntArrayRegion(this,array,start,len,buf);
1815     }
1816     void GetLongArrayRegion(jlongArray array,
1817                             jsize start, jsize len, jlong *buf) {
1818         functions->GetLongArrayRegion(this,array,start,len,buf);
1819     }
1820     void GetFloatArrayRegion(jfloatArray array,
1821                              jsize start, jsize len, jfloat *buf) {
1822         functions->GetFloatArrayRegion(this,array,start,len,buf);
1823     }
1824     void GetDoubleArrayRegion(jdoubleArray array,
1825                               jsize start, jsize len, jdouble *buf) {
1826         functions->GetDoubleArrayRegion(this,array,start,len,buf);
1827     }
1828 
1829     void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len,
1830                                const jboolean *buf) {
1831         functions->SetBooleanArrayRegion(this,array,start,len,buf);
1832     }
1833     void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
1834                             const jbyte *buf) {
1835         functions->SetByteArrayRegion(this,array,start,len,buf);
1836     }
1837     void SetCharArrayRegion(jcharArray array, jsize start, jsize len,
1838                             const jchar *buf) {
1839         functions->SetCharArrayRegion(this,array,start,len,buf);
1840     }
1841     void SetShortArrayRegion(jshortArray array, jsize start, jsize len,
1842                              const jshort *buf) {
1843         functions->SetShortArrayRegion(this,array,start,len,buf);
1844     }
1845     void SetIntArrayRegion(jintArray array, jsize start, jsize len,
1846                            const jint *buf) {
1847         functions->SetIntArrayRegion(this,array,start,len,buf);
1848     }
1849     void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
1850                             const jlong *buf) {
1851         functions->SetLongArrayRegion(this,array,start,len,buf);
1852     }
1853     void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len,
1854                              const jfloat *buf) {
1855         functions->SetFloatArrayRegion(this,array,start,len,buf);
1856     }
1857     void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
1858                               const jdouble *buf) {
1859         functions->SetDoubleArrayRegion(this,array,start,len,buf);
1860     }
1861 
1862     jint RegisterNatives(jclass clazz, const JNINativeMethod *methods,
1863                          jint nMethods) {
1864         return functions->RegisterNatives(this,clazz,methods,nMethods);
1865     }
1866     jint UnregisterNatives(jclass clazz) {
1867         return functions->UnregisterNatives(this,clazz);
1868     }
1869 
1870     jint MonitorEnter(jobject obj) {
1871         return functions->MonitorEnter(this,obj);
1872     }
1873     jint MonitorExit(jobject obj) {
1874         return functions->MonitorExit(this,obj);
1875     }
1876 
1877     jint GetJavaVM(JavaVM **vm) {
1878         return functions->GetJavaVM(this,vm);
1879     }
1880 
1881     void GetStringRegion(jstring str, jsize start, jsize len, jchar *buf) {
1882         functions->GetStringRegion(this,str,start,len,buf);
1883     }
1884     void GetStringUTFRegion(jstring str, jsize start, jsize len, char *buf) {
1885         functions->GetStringUTFRegion(this,str,start,len,buf);
1886     }
1887 
1888     void * GetPrimitiveArrayCritical(jarray array, jboolean *isCopy) {
1889         return functions->GetPrimitiveArrayCritical(this,array,isCopy);
1890     }
1891     void ReleasePrimitiveArrayCritical(jarray array, void *carray, jint mode) {
1892         functions->ReleasePrimitiveArrayCritical(this,array,carray,mode);
1893     }
1894 
1895     const jchar * GetStringCritical(jstring string, jboolean *isCopy) {
1896         return functions->GetStringCritical(this,string,isCopy);
1897     }
1898     void ReleaseStringCritical(jstring string, const jchar *cstring) {
1899         functions->ReleaseStringCritical(this,string,cstring);
1900     }
1901 
1902     jweak NewWeakGlobalRef(jobject obj) {
1903         return functions->NewWeakGlobalRef(this,obj);
1904     }
1905     void DeleteWeakGlobalRef(jweak ref) {
1906         functions->DeleteWeakGlobalRef(this,ref);
1907     }
1908 
1909     jboolean ExceptionCheck() {
1910         return functions->ExceptionCheck(this);
1911     }
1912 
1913     jobject NewDirectByteBuffer(void* address, jlong capacity) {
1914         return functions->NewDirectByteBuffer(this, address, capacity);
1915     }
1916     void* GetDirectBufferAddress(jobject buf) {
1917         return functions->GetDirectBufferAddress(this, buf);
1918     }
1919     jlong GetDirectBufferCapacity(jobject buf) {
1920         return functions->GetDirectBufferCapacity(this, buf);
1921     }
1922     jobjectRefType GetObjectRefType(jobject obj) {
1923         return functions->GetObjectRefType(this, obj);
1924     }
1925 
1926     /* Module Features */
1927 
1928     jobject GetModule(jclass clazz) {
1929         return functions->GetModule(this, clazz);
1930     }
1931 
1932     /* Flattened arrays Features */
1933     void* GetFlattenedArrayElements(jarray array , jboolean *isCopy) {
1934         return functions->GetFlattenedArrayElements(this, array, isCopy);
1935     }
1936   
1937     void ReleaseFlattenedArrayElements(jarray array, void* elem, jint mode) {
1938         return functions->ReleaseFlattenedArrayElements(this, array, elem, mode);
1939     }
1940 
1941     jclass GetFlattenedArrayElementClass(jarray array) {
1942         return functions->GetFlattenedArrayElementClass(this, array);
1943     }
1944   
1945     jsize GetFlattenedArrayElementSize(jarray array) {
1946         return functions->GetFlattenedArrayElementSize(this, array);
1947     }
1948     
1949     jsize GetFieldOffsetInFlattenedLayout(jclass clazz,  const char *name, const char *signature, jboolean* isFlattened) {
1950         return functions->GetFieldOffsetInFlattenedLayout(this, clazz, name, signature, isFlattened);
1951     }
1952 
1953     jobject CreateSubElementSelector(jarray array) {
1954         return functions->CreateSubElementSelector(this, array);
1955     }
1956     jobject GetSubElementSelector(jobject selector, jfieldID fieldID) {
1957         return functions->GetSubElementSelector(this, selector, fieldID);
1958     }
1959 
1960     jobject GetObjectSubElement(jarray array, jobject selector, int index) {
1961         return functions->GetObjectSubElement(this, array, selector, index);
1962     }
1963     void SetObjectSubElement(jarray array, jobject selector, int index, jobject value) {
1964       functions->SetObjectSubElement(this, array, selector, index, value);
1965     }
1966 
1967     jboolean GetBooleanSubElement(jarray array, jobject selector, int index) {
1968         return functions->GetBooleanSubElement(this, array, selector, index);
1969     }
1970     jbyte GetByteSubElement(jarray array, jobject selector, int index) {
1971         return functions->GetByteSubElement(this, array, selector, index);
1972     }
1973     jshort GetShortSubElement(jarray array, jobject selector, int index) {
1974         return functions->GetShortSubElement(this, array, selector, index);
1975     }
1976     jchar GetCharSubElement(jarray array, jobject selector, int index) {
1977         return functions->GetCharSubElement(this, array, selector, index);
1978     }
1979     jint GetIntSubElement(jarray array, jobject selector, int index) {
1980         return functions->GetIntSubElement(this, array, selector, index);
1981     }
1982     jlong GetLongSubElement(jarray array, jobject selector, int index) {
1983         return functions->GetLongSubElement(this, array, selector, index);
1984     }
1985     jfloat GetFloatSubElement(jarray array, jobject selector, int index) {
1986         return functions->GetFloatSubElement(this, array, selector, index);
1987     }
1988     jdouble GetDoubleSubElement(jarray array, jobject selector, int index) {
1989         return functions->GetDoubleSubElement(this, array, selector, index);
1990     }
1991 
1992     void SetBooleanSubElement(jarray array, jobject selector, int index, jboolean value) {
1993         return functions->SetBooleanSubElement(this, array, selector, index, value);
1994     }
1995     void SetByteSubElement(jarray array, jobject selector, int index, jbyte value) {
1996         return functions->SetByteSubElement(this, array, selector, index, value);
1997     }
1998     void SetShortSubElement(jarray array, jobject selector, int index, jshort value) {
1999         return functions->SetShortSubElement(this, array, selector, index, value);
2000     }
2001     void SetCharSubElement(jarray array, jobject selector, int index, jchar value) {
2002         return functions->SetCharSubElement(this, array, selector, index, value);
2003     }
2004     void SetIntSubElement(jarray array, jobject selector, int index, jint value) {
2005         return functions->SetIntSubElement(this, array, selector, index, value);
2006     }
2007     void SetLongSubElement(jarray array, jobject selector, int index, jlong value) {
2008       return functions->SetLongSubElement(this, array, selector, index, value);
2009     }
2010     void SetFloatSubElement(jarray array, jobject selector, int index, jfloat value) {
2011         return functions->SetFloatSubElement(this, array, selector, index, value);
2012     }
2013     void SetDoubleSubElement(jarray array, jobject selector, int index, jdouble value) {
2014       return functions->SetDoubleSubElement(this, array, selector, index, value);
2015     }
2016   
2017 #endif /* __cplusplus */
2018 };
2019 
2020 /*
2021  * optionString may be any option accepted by the JVM, or one of the
2022  * following:
2023  *
2024  * -D<name>=<value>          Set a system property.
2025  * -verbose[:class|gc|jni]   Enable verbose output, comma-separated. E.g.
2026  *                           "-verbose:class" or "-verbose:gc,class"
2027  *                           Standard names include: gc, class, and jni.
2028  *                           All nonstandard (VM-specific) names must begin
2029  *                           with "X".
2030  * vfprintf                  extraInfo is a pointer to the vfprintf hook.
2031  * exit                      extraInfo is a pointer to the exit hook.
2032  * abort                     extraInfo is a pointer to the abort hook.
2033  */
2034 typedef struct JavaVMOption {
2035     char *optionString;
2036     void *extraInfo;
2037 } JavaVMOption;
2038 
2039 typedef struct JavaVMInitArgs {
2040     jint version;
2041 
2042     jint nOptions;
2043     JavaVMOption *options;
2044     jboolean ignoreUnrecognized;
2045 } JavaVMInitArgs;
2046 
2047 typedef struct JavaVMAttachArgs {
2048     jint version;
2049 
2050     char *name;
2051     jobject group;
2052 } JavaVMAttachArgs;
2053 
2054 /* These will be VM-specific. */
2055 
2056 #define JDK1_2
2057 #define JDK1_4
2058 
2059 /* End VM-specific. */
2060 
2061 struct JNIInvokeInterface_ {
2062     void *reserved0;
2063     void *reserved1;
2064     void *reserved2;
2065 
2066     jint (JNICALL *DestroyJavaVM)(JavaVM *vm);
2067 
2068     jint (JNICALL *AttachCurrentThread)(JavaVM *vm, void **penv, void *args);
2069 
2070     jint (JNICALL *DetachCurrentThread)(JavaVM *vm);
2071 
2072     jint (JNICALL *GetEnv)(JavaVM *vm, void **penv, jint version);
2073 
2074     jint (JNICALL *AttachCurrentThreadAsDaemon)(JavaVM *vm, void **penv, void *args);
2075 };
2076 
2077 struct JavaVM_ {
2078     const struct JNIInvokeInterface_ *functions;
2079 #ifdef __cplusplus
2080 
2081     jint DestroyJavaVM() {
2082         return functions->DestroyJavaVM(this);
2083     }
2084     jint AttachCurrentThread(void **penv, void *args) {
2085         return functions->AttachCurrentThread(this, penv, args);
2086     }
2087     jint DetachCurrentThread() {
2088         return functions->DetachCurrentThread(this);
2089     }
2090 
2091     jint GetEnv(void **penv, jint version) {
2092         return functions->GetEnv(this, penv, version);
2093     }
2094     jint AttachCurrentThreadAsDaemon(void **penv, void *args) {
2095         return functions->AttachCurrentThreadAsDaemon(this, penv, args);
2096     }
2097 #endif
2098 };
2099 
2100 #ifdef _JNI_IMPLEMENTATION_
2101 #define _JNI_IMPORT_OR_EXPORT_ JNIEXPORT
2102 #else
2103 #define _JNI_IMPORT_OR_EXPORT_ JNIIMPORT
2104 #endif
2105 _JNI_IMPORT_OR_EXPORT_ jint JNICALL
2106 JNI_GetDefaultJavaVMInitArgs(void *args);
2107 
2108 _JNI_IMPORT_OR_EXPORT_ jint JNICALL
2109 JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *args);
2110 
2111 _JNI_IMPORT_OR_EXPORT_ jint JNICALL
2112 JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
2113 
2114 /* Defined by native libraries. */
2115 JNIEXPORT jint JNICALL
2116 JNI_OnLoad(JavaVM *vm, void *reserved);
2117 
2118 JNIEXPORT void JNICALL
2119 JNI_OnUnload(JavaVM *vm, void *reserved);
2120 
2121 #define JNI_VERSION_1_1 0x00010001
2122 #define JNI_VERSION_1_2 0x00010002
2123 #define JNI_VERSION_1_4 0x00010004
2124 #define JNI_VERSION_1_6 0x00010006
2125 #define JNI_VERSION_1_8 0x00010008
2126 #define JNI_VERSION_9   0x00090000
2127 #define JNI_VERSION_10  0x000a0000
2128 
2129 #ifdef __cplusplus
2130 } /* extern "C" */
2131 #endif /* __cplusplus */
2132 
2133 #endif /* !_JAVASOFT_JNI_H_ */