- add sources.
[platform/framework/web/crosswalk.git] / src / third_party / npapi / npspy / extern / java / jni.h
1 /* ***** BEGIN LICENSE BLOCK *****
2  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
3  *
4  * The contents of this file are subject to the Mozilla Public License Version
5  * 1.1 (the "License"); you may not use this file except in compliance with
6  * the License. You may obtain a copy of the License at
7  * http://www.mozilla.org/MPL/
8  *
9  * Software distributed under the License is distributed on an "AS IS" basis,
10  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11  * for the specific language governing rights and limitations under the
12  * License.
13  *
14  * The Original Code is the Java Runtime Interface.
15  *
16  * The Initial Developer of the Original Code is
17  * Netscape Communications Corporation and Sun Microsystems, Inc.
18  * Portions created by the Initial Developer are Copyright (C) 1993-1996
19  * the Initial Developer. All Rights Reserved.
20  *
21  * Contributor(s):
22  *
23  * Alternatively, the contents of this file may be used under the terms of
24  * either the GNU General Public License Version 2 or later (the "GPL"), or
25  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26  * in which case the provisions of the GPL or the LGPL are applicable instead
27  * of those above. If you wish to allow use of your version of this file only
28  * under the terms of either the GPL or the LGPL, and not to allow others to
29  * use your version of this file under the terms of the MPL, indicate your
30  * decision by deleting the provisions above and replace them with the notice
31  * and other provisions required by the GPL or the LGPL. If you do not delete
32  * the provisions above, a recipient may use your version of this file under
33  * the terms of any one of the MPL, the GPL or the LGPL.
34  *
35  * ***** END LICENSE BLOCK ***** */
36
37 #ifndef JNI_H
38 #define JNI_H
39
40 #include <stdio.h>
41 #include <stdarg.h>
42
43 /* jni_md.h contains the machine-dependent typedefs for jbyte, jint 
44    and jlong */ 
45
46 #include "jni_md.h"
47
48 #ifdef __cplusplus
49 extern "C" {
50 #endif
51
52 /*
53  * JNI Types
54  */
55
56 typedef unsigned char   jboolean;
57 typedef unsigned short  jchar;
58 typedef short           jshort;
59 typedef float           jfloat;
60 typedef double          jdouble;
61
62 typedef jint            jsize;
63
64 #ifdef __cplusplus
65
66 class _jobject {};
67 class _jclass : public _jobject {};
68 class _jthrowable : public _jobject {};
69 class _jstring : public _jobject {};
70 class _jarray : public _jobject {};
71 class _jbooleanArray : public _jarray {};
72 class _jbyteArray : public _jarray {};
73 class _jcharArray : public _jarray {};
74 class _jshortArray : public _jarray {};
75 class _jintArray : public _jarray {};
76 class _jlongArray : public _jarray {};
77 class _jfloatArray : public _jarray {};
78 class _jdoubleArray : public _jarray {};
79 class _jobjectArray : public _jarray {};
80
81 typedef _jobject *jobject;
82 typedef _jclass *jclass;
83 typedef _jthrowable *jthrowable;
84 typedef _jstring *jstring;
85 typedef _jarray *jarray;
86 typedef _jbooleanArray *jbooleanArray;
87 typedef _jbyteArray *jbyteArray;
88 typedef _jcharArray *jcharArray;
89 typedef _jshortArray *jshortArray;
90 typedef _jintArray *jintArray;
91 typedef _jlongArray *jlongArray;
92 typedef _jfloatArray *jfloatArray;
93 typedef _jdoubleArray *jdoubleArray;
94 typedef _jobjectArray *jobjectArray;
95
96 #else
97
98 struct _jobject;
99
100 typedef struct _jobject *jobject;
101 typedef jobject jclass;
102 typedef jobject jthrowable;
103 typedef jobject jstring;
104 typedef jobject jarray;
105 typedef jarray jbooleanArray;
106 typedef jarray jbyteArray;
107 typedef jarray jcharArray;
108 typedef jarray jshortArray;
109 typedef jarray jintArray;
110 typedef jarray jlongArray;
111 typedef jarray jfloatArray;
112 typedef jarray jdoubleArray;
113 typedef jarray jobjectArray;
114
115 #endif
116
117 #if 0   /* moved to jri_md.h */
118 typedef jobject jref; /* For transition---not meant to be part of public 
119                          API anymore.*/
120 #endif
121
122 typedef union jvalue {
123     jboolean z;
124     jbyte    b;
125     jchar    c;
126     jshort   s;
127     jint     i;
128     jlong    j;
129     jfloat   f;
130     jdouble  d;
131     jobject  l;
132 } jvalue;
133
134 struct _jfieldID;
135 typedef struct _jfieldID *jfieldID;
136
137 struct _jmethodID;
138 typedef struct _jmethodID *jmethodID;
139
140 /*
141  * jboolean constants
142  */
143
144 #define JNI_FALSE 0
145 #define JNI_TRUE 1
146
147 /*
148  * possible return values for JNI functions.
149  */
150
151 #define JNI_OK 0
152 #define JNI_ERR (-1)
153
154 /*
155  * used in ReleaseScalarArrayElements
156  */
157   
158 #define JNI_COMMIT 1
159 #define JNI_ABORT 2
160
161 /*
162  * used in RegisterNatives to describe native method name, signature,
163  * and function pointer.
164  */
165
166 typedef struct {
167     char *name;
168     char *signature;
169     void *fnPtr;
170 } JNINativeMethod;
171
172 /*
173  * JNI Native Method Interface.
174  */
175
176 struct JNINativeInterface_;
177
178 struct JNIEnv_;
179
180 #ifdef __cplusplus
181 typedef JNIEnv_ JNIEnv;
182 #else
183 typedef const struct JNINativeInterface_ *JNIEnv;
184 #endif
185
186 /*
187  * JNI Invocation Interface.
188  */
189
190 struct JNIInvokeInterface_;
191
192 struct JavaVM_;
193
194 #ifdef __cplusplus
195 typedef JavaVM_ JavaVM;
196 #else
197 typedef const struct JNIInvokeInterface_ *JavaVM;
198 #endif
199
200 struct JNINativeInterface_ {
201     void *reserved0;
202     void *reserved1;
203     void *reserved2;
204
205     void *reserved3;
206     jint (JNICALL *GetVersion)(JNIEnv *env);
207
208     jclass (JNICALL *DefineClass)
209       (JNIEnv *env, const char *name, jobject loader, const jbyte *buf, 
210        jsize len);
211     jclass (JNICALL *FindClass)
212       (JNIEnv *env, const char *name);
213
214     void *reserved4;
215     void *reserved5;
216     void *reserved6;
217
218     jclass (JNICALL *GetSuperclass)
219       (JNIEnv *env, jclass sub);
220     jboolean (JNICALL *IsAssignableFrom)
221       (JNIEnv *env, jclass sub, jclass sup);
222     void *reserved7;
223
224
225     jint (JNICALL *Throw)
226       (JNIEnv *env, jthrowable obj);
227     jint (JNICALL *ThrowNew)
228       (JNIEnv *env, jclass clazz, const char *msg);
229     jthrowable (JNICALL *ExceptionOccurred)
230       (JNIEnv *env);
231     void (JNICALL *ExceptionDescribe)
232       (JNIEnv *env);
233     void (JNICALL *ExceptionClear)
234       (JNIEnv *env);
235     void (JNICALL *FatalError)
236       (JNIEnv *env, const char *msg);
237     void *reserved8;
238     void *reserved9;
239
240     jobject (JNICALL *NewGlobalRef)
241       (JNIEnv *env, jobject lobj);
242     void (JNICALL *DeleteGlobalRef)
243       (JNIEnv *env, jobject gref);
244     void (JNICALL *DeleteLocalRef)
245       (JNIEnv *env, jobject obj);
246     jboolean (JNICALL *IsSameObject)
247       (JNIEnv *env, jobject obj1, jobject obj2);
248     void *reserved10;
249     void *reserved11;
250
251     jobject (JNICALL *AllocObject)
252       (JNIEnv *env, jclass clazz);
253     jobject (JNICALL *NewObject)
254       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
255     jobject (JNICALL *NewObjectV)
256       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
257     jobject (JNICALL *NewObjectA)
258       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
259
260     jclass (JNICALL *GetObjectClass)
261       (JNIEnv *env, jobject obj);
262     jboolean (JNICALL *IsInstanceOf)
263       (JNIEnv *env, jobject obj, jclass clazz);
264
265     jmethodID (JNICALL *GetMethodID)
266       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
267
268     jobject (JNICALL *CallObjectMethod)
269       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
270     jobject (JNICALL *CallObjectMethodV)
271       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
272     jobject (JNICALL *CallObjectMethodA)
273       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args);
274
275     jboolean (JNICALL *CallBooleanMethod)
276       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
277     jboolean (JNICALL *CallBooleanMethodV)
278       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
279     jboolean (JNICALL *CallBooleanMethodA)
280       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args);
281
282     jbyte (JNICALL *CallByteMethod)
283       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
284     jbyte (JNICALL *CallByteMethodV)
285       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
286     jbyte (JNICALL *CallByteMethodA)
287       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
288
289     jchar (JNICALL *CallCharMethod)
290       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
291     jchar (JNICALL *CallCharMethodV)
292       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
293     jchar (JNICALL *CallCharMethodA)
294       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
295
296     jshort (JNICALL *CallShortMethod)
297       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
298     jshort (JNICALL *CallShortMethodV)
299       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
300     jshort (JNICALL *CallShortMethodA)
301       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
302
303     jint (JNICALL *CallIntMethod)
304       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
305     jint (JNICALL *CallIntMethodV)
306       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
307     jint (JNICALL *CallIntMethodA)
308       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
309
310     jlong (JNICALL *CallLongMethod)
311       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
312     jlong (JNICALL *CallLongMethodV)
313       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
314     jlong (JNICALL *CallLongMethodA)
315       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
316
317     jfloat (JNICALL *CallFloatMethod)
318       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
319     jfloat (JNICALL *CallFloatMethodV)
320       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
321     jfloat (JNICALL *CallFloatMethodA)
322       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
323
324     jdouble (JNICALL *CallDoubleMethod)
325       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
326     jdouble (JNICALL *CallDoubleMethodV)
327       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
328     jdouble (JNICALL *CallDoubleMethodA)
329       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args);
330
331     void (JNICALL *CallVoidMethod)
332       (JNIEnv *env, jobject obj, jmethodID methodID, ...);
333     void (JNICALL *CallVoidMethodV)
334       (JNIEnv *env, jobject obj, jmethodID methodID, va_list args);
335     void (JNICALL *CallVoidMethodA)
336       (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args);
337
338     jobject (JNICALL *CallNonvirtualObjectMethod)
339       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
340     jobject (JNICALL *CallNonvirtualObjectMethodV)
341       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, 
342        va_list args);
343     jobject (JNICALL *CallNonvirtualObjectMethodA)
344       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, 
345        jvalue * args);
346
347     jboolean (JNICALL *CallNonvirtualBooleanMethod)
348       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
349     jboolean (JNICALL *CallNonvirtualBooleanMethodV)
350       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
351        va_list args);
352     jboolean (JNICALL *CallNonvirtualBooleanMethodA)
353       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
354        jvalue * args);
355
356     jbyte (JNICALL *CallNonvirtualByteMethod)
357       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
358     jbyte (JNICALL *CallNonvirtualByteMethodV)
359       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
360        va_list args);
361     jbyte (JNICALL *CallNonvirtualByteMethodA)
362       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, 
363        jvalue *args);
364
365     jchar (JNICALL *CallNonvirtualCharMethod)
366       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
367     jchar (JNICALL *CallNonvirtualCharMethodV)
368       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
369        va_list args);
370     jchar (JNICALL *CallNonvirtualCharMethodA)
371       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
372        jvalue *args);
373
374     jshort (JNICALL *CallNonvirtualShortMethod)
375       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
376     jshort (JNICALL *CallNonvirtualShortMethodV)
377       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
378        va_list args);
379     jshort (JNICALL *CallNonvirtualShortMethodA)
380       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
381        jvalue *args);
382
383     jint (JNICALL *CallNonvirtualIntMethod)
384       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
385     jint (JNICALL *CallNonvirtualIntMethodV)
386       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
387        va_list args);
388     jint (JNICALL *CallNonvirtualIntMethodA)
389       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
390        jvalue *args);
391
392     jlong (JNICALL *CallNonvirtualLongMethod)
393       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
394     jlong (JNICALL *CallNonvirtualLongMethodV)
395       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
396        va_list args);
397     jlong (JNICALL *CallNonvirtualLongMethodA)
398       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, 
399        jvalue *args);
400
401     jfloat (JNICALL *CallNonvirtualFloatMethod)
402       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
403     jfloat (JNICALL *CallNonvirtualFloatMethodV)
404       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
405        va_list args);
406     jfloat (JNICALL *CallNonvirtualFloatMethodA)
407       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
408        jvalue *args);
409
410     jdouble (JNICALL *CallNonvirtualDoubleMethod)
411       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
412     jdouble (JNICALL *CallNonvirtualDoubleMethodV)
413       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
414        va_list args);
415     jdouble (JNICALL *CallNonvirtualDoubleMethodA)
416       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
417        jvalue *args);
418
419     void (JNICALL *CallNonvirtualVoidMethod)
420       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...);
421     void (JNICALL *CallNonvirtualVoidMethodV)
422       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
423        va_list args);
424     void (JNICALL *CallNonvirtualVoidMethodA)
425       (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID,
426        jvalue * args);
427
428     jfieldID (JNICALL *GetFieldID)
429       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
430
431     jobject (JNICALL *GetObjectField)
432       (JNIEnv *env, jobject obj, jfieldID fieldID);
433     jboolean (JNICALL *GetBooleanField)
434       (JNIEnv *env, jobject obj, jfieldID fieldID);
435     jbyte (JNICALL *GetByteField)
436       (JNIEnv *env, jobject obj, jfieldID fieldID);
437     jchar (JNICALL *GetCharField)
438       (JNIEnv *env, jobject obj, jfieldID fieldID);
439     jshort (JNICALL *GetShortField)
440       (JNIEnv *env, jobject obj, jfieldID fieldID);
441     jint (JNICALL *GetIntField)
442       (JNIEnv *env, jobject obj, jfieldID fieldID);
443     jlong (JNICALL *GetLongField)
444       (JNIEnv *env, jobject obj, jfieldID fieldID);
445     jfloat (JNICALL *GetFloatField)
446       (JNIEnv *env, jobject obj, jfieldID fieldID);
447     jdouble (JNICALL *GetDoubleField)
448       (JNIEnv *env, jobject obj, jfieldID fieldID);
449
450     void (JNICALL *SetObjectField)
451       (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
452     void (JNICALL *SetBooleanField)
453       (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
454     void (JNICALL *SetByteField)
455       (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
456     void (JNICALL *SetCharField)
457       (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
458     void (JNICALL *SetShortField)
459       (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
460     void (JNICALL *SetIntField)
461       (JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
462     void (JNICALL *SetLongField)
463       (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
464     void (JNICALL *SetFloatField)
465       (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
466     void (JNICALL *SetDoubleField)
467       (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
468
469     jmethodID (JNICALL *GetStaticMethodID)
470       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
471
472     jobject (JNICALL *CallStaticObjectMethod)
473       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
474     jobject (JNICALL *CallStaticObjectMethodV)
475       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
476     jobject (JNICALL *CallStaticObjectMethodA)
477       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
478
479     jboolean (JNICALL *CallStaticBooleanMethod)
480       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
481     jboolean (JNICALL *CallStaticBooleanMethodV)
482       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
483     jboolean (JNICALL *CallStaticBooleanMethodA)
484       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
485
486     jbyte (JNICALL *CallStaticByteMethod)
487       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
488     jbyte (JNICALL *CallStaticByteMethodV)
489       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
490     jbyte (JNICALL *CallStaticByteMethodA)
491       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
492
493     jchar (JNICALL *CallStaticCharMethod)
494       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
495     jchar (JNICALL *CallStaticCharMethodV)
496       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
497     jchar (JNICALL *CallStaticCharMethodA)
498       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
499
500     jshort (JNICALL *CallStaticShortMethod)
501       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
502     jshort (JNICALL *CallStaticShortMethodV)
503       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
504     jshort (JNICALL *CallStaticShortMethodA)
505       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
506
507     jint (JNICALL *CallStaticIntMethod)
508       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
509     jint (JNICALL *CallStaticIntMethodV)
510       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
511     jint (JNICALL *CallStaticIntMethodA)
512       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
513
514     jlong (JNICALL *CallStaticLongMethod)
515       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
516     jlong (JNICALL *CallStaticLongMethodV)
517       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
518     jlong (JNICALL *CallStaticLongMethodA)
519       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
520
521     jfloat (JNICALL *CallStaticFloatMethod)
522       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
523     jfloat (JNICALL *CallStaticFloatMethodV)
524       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
525     jfloat (JNICALL *CallStaticFloatMethodA)
526       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
527
528     jdouble (JNICALL *CallStaticDoubleMethod)
529       (JNIEnv *env, jclass clazz, jmethodID methodID, ...);
530     jdouble (JNICALL *CallStaticDoubleMethodV)
531       (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args);
532     jdouble (JNICALL *CallStaticDoubleMethodA)       
533       (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args);
534
535     void (JNICALL *CallStaticVoidMethod)
536       (JNIEnv *env, jclass cls, jmethodID methodID, ...);
537     void (JNICALL *CallStaticVoidMethodV)
538       (JNIEnv *env, jclass cls, jmethodID methodID, va_list args);
539     void (JNICALL *CallStaticVoidMethodA)
540       (JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args);
541
542     jfieldID (JNICALL *GetStaticFieldID)
543       (JNIEnv *env, jclass clazz, const char *name, const char *sig);
544     jobject (JNICALL *GetStaticObjectField)
545       (JNIEnv *env, jclass clazz, jfieldID fieldID);
546     jboolean (JNICALL *GetStaticBooleanField)
547       (JNIEnv *env, jclass clazz, jfieldID fieldID);
548     jbyte (JNICALL *GetStaticByteField)
549       (JNIEnv *env, jclass clazz, jfieldID fieldID);
550     jchar (JNICALL *GetStaticCharField)
551       (JNIEnv *env, jclass clazz, jfieldID fieldID);
552     jshort (JNICALL *GetStaticShortField)
553       (JNIEnv *env, jclass clazz, jfieldID fieldID);
554     jint (JNICALL *GetStaticIntField)
555       (JNIEnv *env, jclass clazz, jfieldID fieldID);
556     jlong (JNICALL *GetStaticLongField)
557       (JNIEnv *env, jclass clazz, jfieldID fieldID);
558     jfloat (JNICALL *GetStaticFloatField)
559       (JNIEnv *env, jclass clazz, jfieldID fieldID);
560     jdouble (JNICALL *GetStaticDoubleField)
561       (JNIEnv *env, jclass clazz, jfieldID fieldID);
562
563     void (JNICALL *SetStaticObjectField)
564       (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value);
565     void (JNICALL *SetStaticBooleanField)
566       (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value);
567     void (JNICALL *SetStaticByteField)
568       (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value);
569     void (JNICALL *SetStaticCharField)
570       (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value);
571     void (JNICALL *SetStaticShortField)
572       (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value);
573     void (JNICALL *SetStaticIntField)
574       (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value);
575     void (JNICALL *SetStaticLongField)
576       (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value);
577     void (JNICALL *SetStaticFloatField)
578       (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value);
579     void (JNICALL *SetStaticDoubleField)
580       (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value);
581
582     jstring (JNICALL *NewString)
583       (JNIEnv *env, const jchar *unicode, jsize len);
584     jsize (JNICALL *GetStringLength)
585       (JNIEnv *env, jstring str);
586     const jchar *(JNICALL *GetStringChars)
587       (JNIEnv *env, jstring str, jboolean *isCopy);
588     void (JNICALL *ReleaseStringChars)
589       (JNIEnv *env, jstring str, const jchar *chars);
590   
591     jstring (JNICALL *NewStringUTF)
592       (JNIEnv *env, const char *utf);
593     jsize (JNICALL *GetStringUTFLength)
594       (JNIEnv *env, jstring str);
595     const char* (JNICALL *GetStringUTFChars)
596       (JNIEnv *env, jstring str, jboolean *isCopy);
597     void (JNICALL *ReleaseStringUTFChars)
598       (JNIEnv *env, jstring str, const char* chars);
599   
600
601     jsize (JNICALL *GetArrayLength)
602       (JNIEnv *env, jarray array);
603
604     jobjectArray (JNICALL *NewObjectArray)
605       (JNIEnv *env, jsize len, jclass clazz, jobject init);
606     jobject (JNICALL *GetObjectArrayElement)
607       (JNIEnv *env, jobjectArray array, jsize index);
608     void (JNICALL *SetObjectArrayElement)
609       (JNIEnv *env, jobjectArray array, jsize index, jobject val);
610
611     jbooleanArray (JNICALL *NewBooleanArray)
612       (JNIEnv *env, jsize len);
613     jbyteArray (JNICALL *NewByteArray)
614       (JNIEnv *env, jsize len);
615     jcharArray (JNICALL *NewCharArray)
616       (JNIEnv *env, jsize len);
617     jshortArray (JNICALL *NewShortArray)
618       (JNIEnv *env, jsize len);
619     jintArray (JNICALL *NewIntArray)
620       (JNIEnv *env, jsize len);
621     jlongArray (JNICALL *NewLongArray)
622       (JNIEnv *env, jsize len);
623     jfloatArray (JNICALL *NewFloatArray)
624       (JNIEnv *env, jsize len);
625     jdoubleArray (JNICALL *NewDoubleArray)
626       (JNIEnv *env, jsize len);
627
628     jboolean * (JNICALL *GetBooleanArrayElements)
629       (JNIEnv *env, jbooleanArray array, jboolean *isCopy);
630     jbyte * (JNICALL *GetByteArrayElements)
631       (JNIEnv *env, jbyteArray array, jboolean *isCopy);
632     jchar * (JNICALL *GetCharArrayElements)
633       (JNIEnv *env, jcharArray array, jboolean *isCopy);
634     jshort * (JNICALL *GetShortArrayElements)
635       (JNIEnv *env, jshortArray array, jboolean *isCopy);
636     jint * (JNICALL *GetIntArrayElements)
637       (JNIEnv *env, jintArray array, jboolean *isCopy);
638     jlong * (JNICALL *GetLongArrayElements)
639       (JNIEnv *env, jlongArray array, jboolean *isCopy);
640     jfloat * (JNICALL *GetFloatArrayElements)
641       (JNIEnv *env, jfloatArray array, jboolean *isCopy);
642     jdouble * (JNICALL *GetDoubleArrayElements)
643       (JNIEnv *env, jdoubleArray array, jboolean *isCopy);
644
645     void (JNICALL *ReleaseBooleanArrayElements)
646       (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode);
647     void (JNICALL *ReleaseByteArrayElements)
648       (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode);
649     void (JNICALL *ReleaseCharArrayElements)
650       (JNIEnv *env, jcharArray array, jchar *elems, jint mode);
651     void (JNICALL *ReleaseShortArrayElements)
652       (JNIEnv *env, jshortArray array, jshort *elems, jint mode);
653     void (JNICALL *ReleaseIntArrayElements)
654       (JNIEnv *env, jintArray array, jint *elems, jint mode);
655     void (JNICALL *ReleaseLongArrayElements)
656       (JNIEnv *env, jlongArray array, jlong *elems, jint mode);
657     void (JNICALL *ReleaseFloatArrayElements)
658       (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode);
659     void (JNICALL *ReleaseDoubleArrayElements)
660       (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode);
661
662     void (JNICALL *GetBooleanArrayRegion)
663       (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
664     void (JNICALL *GetByteArrayRegion)
665       (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
666     void (JNICALL *GetCharArrayRegion)
667       (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
668     void (JNICALL *GetShortArrayRegion)
669       (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
670     void (JNICALL *GetIntArrayRegion)
671       (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
672     void (JNICALL *GetLongArrayRegion)
673       (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
674     void (JNICALL *GetFloatArrayRegion)
675       (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
676     void (JNICALL *GetDoubleArrayRegion)
677       (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
678
679     void (JNICALL *SetBooleanArrayRegion)
680       (JNIEnv *env, jbooleanArray array, jsize start, jsize l, jboolean *buf);
681     void (JNICALL *SetByteArrayRegion)
682       (JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf);
683     void (JNICALL *SetCharArrayRegion)
684       (JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf);
685     void (JNICALL *SetShortArrayRegion)
686       (JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf);
687     void (JNICALL *SetIntArrayRegion)
688       (JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf);
689     void (JNICALL *SetLongArrayRegion)
690       (JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf);
691     void (JNICALL *SetFloatArrayRegion)
692       (JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf);
693     void (JNICALL *SetDoubleArrayRegion)
694       (JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf);
695
696     jint (JNICALL *RegisterNatives)
697       (JNIEnv *env, jclass clazz, const JNINativeMethod *methods, 
698        jint nMethods);
699     jint (JNICALL *UnregisterNatives)
700       (JNIEnv *env, jclass clazz);
701
702     jint (JNICALL *MonitorEnter)
703       (JNIEnv *env, jobject obj);
704     jint (JNICALL *MonitorExit)
705       (JNIEnv *env, jobject obj);
706  
707     jint (JNICALL *GetJavaVM)
708       (JNIEnv *env, JavaVM **vm);
709 };
710
711 /*
712  * We use inlined functions for C++ so that programmers can write:
713  * 
714  *    env->FindClass("java/lang/String")
715  *
716  * in C++ rather than:
717  *
718  *    (*env)->FindClass(env, "java/lang/String")
719  *
720  * in C.
721  */
722
723 struct JNIEnv_ {
724     const struct JNINativeInterface_ *functions;
725     void *reserved0;
726     void *reserved1[6];
727 #ifdef __cplusplus
728
729     jint GetVersion() {
730         return functions->GetVersion(this);
731     }
732     jclass DefineClass(const char *name, jobject loader, const jbyte *buf,
733                        jsize len) {
734         return functions->DefineClass(this, name, loader, buf, len);
735     }
736     jclass FindClass(const char *name) {
737         return functions->FindClass(this, name);
738     }
739     jclass GetSuperclass(jclass sub) {
740         return functions->GetSuperclass(this, sub);
741     }
742     jboolean IsAssignableFrom(jclass sub, jclass sup) {
743         return functions->IsAssignableFrom(this, sub, sup);
744     }
745
746     jint Throw(jthrowable obj) {
747         return functions->Throw(this, obj);
748     }    
749     jint ThrowNew(jclass clazz, const char *msg) {
750         return functions->ThrowNew(this, clazz, msg);
751     }
752     jthrowable ExceptionOccurred() {
753         return functions->ExceptionOccurred(this);
754     }
755     void ExceptionDescribe() {
756         functions->ExceptionDescribe(this);
757     }
758     void ExceptionClear() {
759         functions->ExceptionClear(this);
760     }
761     void FatalError(const char *msg) {
762         functions->FatalError(this, msg);
763     }
764
765     jobject NewGlobalRef(jobject lobj) {
766         return functions->NewGlobalRef(this,lobj);
767     }
768     void DeleteGlobalRef(jobject gref) {
769         functions->DeleteGlobalRef(this,gref);
770     }
771     void DeleteLocalRef(jobject obj) {
772         functions->DeleteLocalRef(this, obj);
773     }
774
775     jboolean IsSameObject(jobject obj1, jobject obj2) {
776         return functions->IsSameObject(this,obj1,obj2);
777     }
778
779     jobject AllocObject(jclass clazz) {
780         return functions->AllocObject(this,clazz);
781     }
782     jobject NewObject(jclass clazz, jmethodID methodID, ...) {
783         va_list args;
784         jobject result;
785         va_start(args, methodID);
786         result = functions->NewObjectV(this,clazz,methodID,args);
787         va_end(args);
788         return result;
789     }
790     jobject NewObjectV(jclass clazz, jmethodID methodID, 
791                        va_list args) {
792         return functions->NewObjectV(this,clazz,methodID,args);
793     }
794     jobject NewObjectA(jclass clazz, jmethodID methodID, 
795                        jvalue *args) {
796         return functions->NewObjectA(this,clazz,methodID,args);
797     }
798
799     jclass GetObjectClass(jobject obj) {
800         return functions->GetObjectClass(this,obj);
801     }
802     jboolean IsInstanceOf(jobject obj, jclass clazz) {
803         return functions->IsInstanceOf(this,obj,clazz);
804     }
805
806     jmethodID GetMethodID(jclass clazz, const char *name, 
807                           const char *sig) {
808         return functions->GetMethodID(this,clazz,name,sig);
809     }
810
811     jobject CallObjectMethod(jobject obj, jmethodID methodID, ...) {
812         va_list args;
813         jobject result;
814         va_start(args,methodID);
815         result = functions->CallObjectMethodV(this,obj,methodID,args);
816         va_end(args);
817         return result;
818     }
819     jobject CallObjectMethodV(jobject obj, jmethodID methodID, 
820                         va_list args) {
821         return functions->CallObjectMethodV(this,obj,methodID,args);
822     }
823     jobject CallObjectMethodA(jobject obj, jmethodID methodID, 
824                         jvalue * args) {
825         return functions->CallObjectMethodA(this,obj,methodID,args);
826     }
827
828     jboolean CallBooleanMethod(jobject obj, 
829                                jmethodID methodID, ...) {
830         va_list args;
831         jboolean result;
832         va_start(args,methodID);
833         result = functions->CallBooleanMethodV(this,obj,methodID,args);
834         va_end(args);
835         return result;
836     }
837     jboolean CallBooleanMethodV(jobject obj, jmethodID methodID, 
838                                 va_list args) {
839         return functions->CallBooleanMethodV(this,obj,methodID,args);
840     }
841     jboolean CallBooleanMethodA(jobject obj, jmethodID methodID, 
842                                 jvalue * args) {
843         return functions->CallBooleanMethodA(this,obj,methodID, args);
844     }
845
846     jbyte CallByteMethod(jobject obj, jmethodID methodID, ...) {
847         va_list args;
848         jbyte result;
849         va_start(args,methodID);
850         result = functions->CallByteMethodV(this,obj,methodID,args);
851         va_end(args);
852         return result;
853     }
854     jbyte CallByteMethodV(jobject obj, jmethodID methodID, 
855                           va_list args) {
856         return functions->CallByteMethodV(this,obj,methodID,args);
857     }
858     jbyte CallByteMethodA(jobject obj, jmethodID methodID, 
859                           jvalue * args) {
860         return functions->CallByteMethodA(this,obj,methodID,args);
861     }
862
863     jchar CallCharMethod(jobject obj, jmethodID methodID, ...) {
864         va_list args;
865         jchar result;
866         va_start(args,methodID);
867         result = functions->CallCharMethodV(this,obj,methodID,args);
868         va_end(args);
869         return result;
870     }
871     jchar CallCharMethodV(jobject obj, jmethodID methodID, 
872                           va_list args) {
873         return functions->CallCharMethodV(this,obj,methodID,args);
874     }
875     jchar CallCharMethodA(jobject obj, jmethodID methodID, 
876                           jvalue * args) {
877         return functions->CallCharMethodA(this,obj,methodID,args);
878     }
879
880     jshort CallShortMethod(jobject obj, jmethodID methodID, ...) {
881         va_list args;
882         jshort result;
883         va_start(args,methodID);
884         result = functions->CallShortMethodV(this,obj,methodID,args);
885         va_end(args);
886         return result;
887     }
888     jshort CallShortMethodV(jobject obj, jmethodID methodID, 
889                             va_list args) {
890         return functions->CallShortMethodV(this,obj,methodID,args);
891     }
892     jshort CallShortMethodA(jobject obj, jmethodID methodID, 
893                             jvalue * args) {
894         return functions->CallShortMethodA(this,obj,methodID,args);
895     }
896
897     jint CallIntMethod(jobject obj, jmethodID methodID, ...) {
898         va_list args;
899         jint result;
900         va_start(args,methodID);
901         result = functions->CallIntMethodV(this,obj,methodID,args);
902         va_end(args);
903         return result;
904     }
905     jint CallIntMethodV(jobject obj, jmethodID methodID, 
906                         va_list args) {
907         return functions->CallIntMethodV(this,obj,methodID,args);
908     }
909     jint CallIntMethodA(jobject obj, jmethodID methodID, 
910                         jvalue * args) {
911         return functions->CallIntMethodA(this,obj,methodID,args);
912     }
913
914     jlong CallLongMethod(jobject obj, jmethodID methodID, ...) {
915         va_list args;
916         jlong result;
917         va_start(args,methodID);
918         result = functions->CallLongMethodV(this,obj,methodID,args);
919         va_end(args);
920         return result;
921     }
922     jlong CallLongMethodV(jobject obj, jmethodID methodID, 
923                           va_list args) {
924         return functions->CallLongMethodV(this,obj,methodID,args);
925     }
926     jlong CallLongMethodA(jobject obj, jmethodID methodID, 
927                           jvalue * args) {
928         return functions->CallLongMethodA(this,obj,methodID,args);
929     }
930
931     jfloat CallFloatMethod(jobject obj, jmethodID methodID, ...) {
932         va_list args;
933         jfloat result;
934         va_start(args,methodID);
935         result = functions->CallFloatMethodV(this,obj,methodID,args);
936         va_end(args);
937         return result;
938     }
939     jfloat CallFloatMethodV(jobject obj, jmethodID methodID, 
940                             va_list args) {
941         return functions->CallFloatMethodV(this,obj,methodID,args);
942     }
943     jfloat CallFloatMethodA(jobject obj, jmethodID methodID, 
944                             jvalue * args) {
945         return functions->CallFloatMethodA(this,obj,methodID,args);
946     }
947
948     jdouble CallDoubleMethod(jobject obj, jmethodID methodID, ...) {
949         va_list args;
950         jdouble result;
951         va_start(args,methodID);
952         result = functions->CallDoubleMethodV(this,obj,methodID,args);
953         va_end(args);
954         return result;
955     }
956     jdouble CallDoubleMethodV(jobject obj, jmethodID methodID, 
957                         va_list args) {
958         return functions->CallDoubleMethodV(this,obj,methodID,args);
959     }
960     jdouble CallDoubleMethodA(jobject obj, jmethodID methodID, 
961                         jvalue * args) {
962         return functions->CallDoubleMethodA(this,obj,methodID,args);
963     }
964
965     void CallVoidMethod(jobject obj, jmethodID methodID, ...) {
966         va_list args;
967         va_start(args,methodID);
968         functions->CallVoidMethodV(this,obj,methodID,args);
969         va_end(args);
970     }
971     void CallVoidMethodV(jobject obj, jmethodID methodID, 
972                          va_list args) {
973         functions->CallVoidMethodV(this,obj,methodID,args);
974     }
975     void CallVoidMethodA(jobject obj, jmethodID methodID, 
976                          jvalue * args) {
977         functions->CallVoidMethodA(this,obj,methodID,args);
978     }
979
980     jobject CallNonvirtualObjectMethod(jobject obj, jclass clazz, 
981                                        jmethodID methodID, ...) {
982         va_list args;
983         jobject result;
984         va_start(args,methodID);
985         result = functions->CallNonvirtualObjectMethodV(this,obj,clazz,
986                                                         methodID,args);
987         va_end(args);
988         return result;
989     }
990     jobject CallNonvirtualObjectMethodV(jobject obj, jclass clazz, 
991                                         jmethodID methodID, va_list args) {
992         return functions->CallNonvirtualObjectMethodV(this,obj,clazz,
993                                                       methodID,args);
994     }
995     jobject CallNonvirtualObjectMethodA(jobject obj, jclass clazz, 
996                                         jmethodID methodID, jvalue * args) {
997         return functions->CallNonvirtualObjectMethodA(this,obj,clazz,
998                                                       methodID,args);
999     }
1000
1001     jboolean CallNonvirtualBooleanMethod(jobject obj, jclass clazz, 
1002                                          jmethodID methodID, ...) {
1003         va_list args;
1004         jboolean result;
1005         va_start(args,methodID);
1006         result = functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
1007                                                          methodID,args);
1008         va_end(args);
1009         return result;
1010     }
1011     jboolean CallNonvirtualBooleanMethodV(jobject obj, jclass clazz, 
1012                                           jmethodID methodID, va_list args) {
1013         return functions->CallNonvirtualBooleanMethodV(this,obj,clazz,
1014                                                        methodID,args);
1015     }
1016     jboolean CallNonvirtualBooleanMethodA(jobject obj, jclass clazz, 
1017                                           jmethodID methodID, jvalue * args) {
1018         return functions->CallNonvirtualBooleanMethodA(this,obj,clazz,
1019                                                        methodID, args);
1020     }
1021
1022     jbyte CallNonvirtualByteMethod(jobject obj, jclass clazz, 
1023                                    jmethodID methodID, ...) {
1024         va_list args;
1025         jbyte result;
1026         va_start(args,methodID);
1027         result = functions->CallNonvirtualByteMethodV(this,obj,clazz,
1028                                                       methodID,args);
1029         va_end(args);
1030         return result;
1031     }
1032     jbyte CallNonvirtualByteMethodV(jobject obj, jclass clazz, 
1033                                     jmethodID methodID, va_list args) {
1034         return functions->CallNonvirtualByteMethodV(this,obj,clazz,
1035                                                     methodID,args);
1036     }
1037     jbyte CallNonvirtualByteMethodA(jobject obj, jclass clazz, 
1038                                     jmethodID methodID, jvalue * args) {
1039         return functions->CallNonvirtualByteMethodA(this,obj,clazz,
1040                                                     methodID,args);
1041     }
1042
1043     jchar CallNonvirtualCharMethod(jobject obj, jclass clazz, 
1044                                    jmethodID methodID, ...) {
1045         va_list args;
1046         jchar result;
1047         va_start(args,methodID);
1048         result = functions->CallNonvirtualCharMethodV(this,obj,clazz,
1049                                                       methodID,args);
1050         va_end(args);
1051         return result;
1052     }
1053     jchar CallNonvirtualCharMethodV(jobject obj, jclass clazz, 
1054                                     jmethodID methodID, va_list args) {
1055         return functions->CallNonvirtualCharMethodV(this,obj,clazz,
1056                                                     methodID,args);
1057     }
1058     jchar CallNonvirtualCharMethodA(jobject obj, jclass clazz, 
1059                                     jmethodID methodID, jvalue * args) {
1060         return functions->CallNonvirtualCharMethodA(this,obj,clazz,
1061                                                     methodID,args);
1062     }
1063
1064     jshort CallNonvirtualShortMethod(jobject obj, jclass clazz, 
1065                                      jmethodID methodID, ...) {
1066         va_list args;
1067         jshort result;
1068         va_start(args,methodID);
1069         result = functions->CallNonvirtualShortMethodV(this,obj,clazz,
1070                                                        methodID,args);
1071         va_end(args);
1072         return result;
1073     }
1074     jshort CallNonvirtualShortMethodV(jobject obj, jclass clazz, 
1075                                       jmethodID methodID, va_list args) {
1076         return functions->CallNonvirtualShortMethodV(this,obj,clazz,
1077                                                      methodID,args);
1078     }
1079     jshort CallNonvirtualShortMethodA(jobject obj, jclass clazz,
1080                                       jmethodID methodID, jvalue * args) {
1081         return functions->CallNonvirtualShortMethodA(this,obj,clazz,
1082                                                      methodID,args);
1083     }
1084
1085     jint CallNonvirtualIntMethod(jobject obj, jclass clazz, 
1086                                  jmethodID methodID, ...) {
1087         va_list args;
1088         jint result;
1089         va_start(args,methodID);
1090         result = functions->CallNonvirtualIntMethodV(this,obj,clazz,
1091                                                      methodID,args);
1092         va_end(args);
1093         return result;
1094     }
1095     jint CallNonvirtualIntMethodV(jobject obj, jclass clazz, 
1096                                   jmethodID methodID, va_list args) {
1097         return functions->CallNonvirtualIntMethodV(this,obj,clazz,
1098                                                    methodID,args);
1099     }
1100     jint CallNonvirtualIntMethodA(jobject obj, jclass clazz, 
1101                                   jmethodID methodID, jvalue * args) {
1102         return functions->CallNonvirtualIntMethodA(this,obj,clazz,
1103                                                    methodID,args);
1104     }
1105
1106     jlong CallNonvirtualLongMethod(jobject obj, jclass clazz,
1107                                    jmethodID methodID, ...) {
1108         va_list args;
1109         jlong result;
1110         va_start(args,methodID);
1111         result = functions->CallNonvirtualLongMethodV(this,obj,clazz,
1112                                                       methodID,args);
1113         va_end(args);
1114         return result;
1115     }
1116     jlong CallNonvirtualLongMethodV(jobject obj, jclass clazz,
1117                                     jmethodID methodID, va_list args) {
1118         return functions->CallNonvirtualLongMethodV(this,obj,clazz,
1119                                                     methodID,args);
1120     }
1121     jlong CallNonvirtualLongMethodA(jobject obj, jclass clazz, 
1122                                     jmethodID methodID, jvalue * args) {
1123         return functions->CallNonvirtualLongMethodA(this,obj,clazz,
1124                                                     methodID,args);
1125     }
1126
1127     jfloat CallNonvirtualFloatMethod(jobject obj, jclass clazz, 
1128                                      jmethodID methodID, ...) {
1129         va_list args;
1130         jfloat result;
1131         va_start(args,methodID);
1132         result = functions->CallNonvirtualFloatMethodV(this,obj,clazz,
1133                                                        methodID,args);
1134         va_end(args);
1135         return result;
1136     }
1137     jfloat CallNonvirtualFloatMethodV(jobject obj, jclass clazz,
1138                                       jmethodID methodID, 
1139                                       va_list args) {
1140         return functions->CallNonvirtualFloatMethodV(this,obj,clazz,
1141                                                      methodID,args);
1142     }
1143     jfloat CallNonvirtualFloatMethodA(jobject obj, jclass clazz, 
1144                                       jmethodID methodID, 
1145                                       jvalue * args) {
1146         return functions->CallNonvirtualFloatMethodA(this,obj,clazz,
1147                                                      methodID,args);
1148     }
1149
1150     jdouble CallNonvirtualDoubleMethod(jobject obj, jclass clazz,
1151                                        jmethodID methodID, ...) {
1152         va_list args;
1153         jdouble result;
1154         va_start(args,methodID);
1155         result = functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
1156                                                         methodID,args);
1157         va_end(args);
1158         return result;
1159     }
1160     jdouble CallNonvirtualDoubleMethodV(jobject obj, jclass clazz,
1161                                         jmethodID methodID, 
1162                                         va_list args) {
1163         return functions->CallNonvirtualDoubleMethodV(this,obj,clazz,
1164                                                       methodID,args);
1165     }
1166     jdouble CallNonvirtualDoubleMethodA(jobject obj, jclass clazz, 
1167                                         jmethodID methodID, 
1168                                         jvalue * args) {
1169         return functions->CallNonvirtualDoubleMethodA(this,obj,clazz,
1170                                                       methodID,args);
1171     }
1172
1173     void CallNonvirtualVoidMethod(jobject obj, jclass clazz,
1174                                   jmethodID methodID, ...) {
1175         va_list args;
1176         va_start(args,methodID);
1177         functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
1178         va_end(args);
1179     }
1180     void CallNonvirtualVoidMethodV(jobject obj, jclass clazz,
1181                                    jmethodID methodID, 
1182                                    va_list args) {
1183         functions->CallNonvirtualVoidMethodV(this,obj,clazz,methodID,args);
1184     }
1185     void CallNonvirtualVoidMethodA(jobject obj, jclass clazz,
1186                                    jmethodID methodID, 
1187                                    jvalue * args) {
1188         functions->CallNonvirtualVoidMethodA(this,obj,clazz,methodID,args);
1189     }
1190
1191     jfieldID GetFieldID(jclass clazz, const char *name, 
1192                         const char *sig) {
1193         return functions->GetFieldID(this,clazz,name,sig);
1194     }
1195
1196     jobject GetObjectField(jobject obj, jfieldID fieldID) {
1197         return functions->GetObjectField(this,obj,fieldID);
1198     }
1199     jboolean GetBooleanField(jobject obj, jfieldID fieldID) {
1200         return functions->GetBooleanField(this,obj,fieldID);
1201     }
1202     jbyte GetByteField(jobject obj, jfieldID fieldID) {
1203         return functions->GetByteField(this,obj,fieldID);
1204     }
1205     jchar GetCharField(jobject obj, jfieldID fieldID) {
1206         return functions->GetCharField(this,obj,fieldID);
1207     }
1208     jshort GetShortField(jobject obj, jfieldID fieldID) {
1209         return functions->GetShortField(this,obj,fieldID);
1210     }
1211     jint GetIntField(jobject obj, jfieldID fieldID) {
1212         return functions->GetIntField(this,obj,fieldID);
1213     }
1214     jlong GetLongField(jobject obj, jfieldID fieldID) {
1215         return functions->GetLongField(this,obj,fieldID);
1216     }
1217     jfloat GetFloatField(jobject obj, jfieldID fieldID) {
1218         return functions->GetFloatField(this,obj,fieldID);
1219     }
1220     jdouble GetDoubleField(jobject obj, jfieldID fieldID) {
1221         return functions->GetDoubleField(this,obj,fieldID);
1222     }
1223
1224     void SetObjectField(jobject obj, jfieldID fieldID, jobject val) {
1225         functions->SetObjectField(this,obj,fieldID,val);
1226     }
1227     void SetBooleanField(jobject obj, jfieldID fieldID, 
1228                          jboolean val) {
1229         functions->SetBooleanField(this,obj,fieldID,val);
1230     }
1231     void SetByteField(jobject obj, jfieldID fieldID, 
1232                       jbyte val) {
1233         functions->SetByteField(this,obj,fieldID,val);
1234     }
1235     void SetCharField(jobject obj, jfieldID fieldID, 
1236                       jchar val) {
1237         functions->SetCharField(this,obj,fieldID,val);
1238     }
1239     void SetShortField(jobject obj, jfieldID fieldID,
1240                        jshort val) {
1241         functions->SetShortField(this,obj,fieldID,val);
1242     }
1243     void SetIntField(jobject obj, jfieldID fieldID, 
1244                      jint val) {
1245         functions->SetIntField(this,obj,fieldID,val);
1246     }
1247     void SetLongField(jobject obj, jfieldID fieldID, 
1248                       jlong val) {
1249         functions->SetLongField(this,obj,fieldID,val);
1250     }
1251     void SetFloatField(jobject obj, jfieldID fieldID, 
1252                        jfloat val) {
1253         functions->SetFloatField(this,obj,fieldID,val);
1254     }
1255     void SetDoubleField(jobject obj, jfieldID fieldID, 
1256                         jdouble val) {
1257         functions->SetDoubleField(this,obj,fieldID,val);
1258     }
1259
1260     jmethodID GetStaticMethodID(jclass clazz, const char *name, 
1261                                 const char *sig) {
1262         return functions->GetStaticMethodID(this,clazz,name,sig);
1263     }
1264
1265     jobject CallStaticObjectMethod(jclass clazz, jmethodID methodID, 
1266                              ...) {
1267         va_list args;
1268         jobject result;
1269         va_start(args,methodID);
1270         result = functions->CallStaticObjectMethodV(this,clazz,methodID,args);
1271         va_end(args);
1272         return result;
1273     }
1274     jobject CallStaticObjectMethodV(jclass clazz, jmethodID methodID, 
1275                               va_list args) {
1276         return functions->CallStaticObjectMethodV(this,clazz,methodID,args);
1277     }
1278     jobject CallStaticObjectMethodA(jclass clazz, jmethodID methodID, 
1279                               jvalue *args) {
1280         return functions->CallStaticObjectMethodA(this,clazz,methodID,args);
1281     }
1282
1283     jboolean CallStaticBooleanMethod(jclass clazz, 
1284                                      jmethodID methodID, ...) {
1285         va_list args;
1286         jboolean result;
1287         va_start(args,methodID);
1288         result = functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
1289         va_end(args);
1290         return result;
1291     }
1292     jboolean CallStaticBooleanMethodV(jclass clazz,
1293                                       jmethodID methodID, va_list args) {
1294         return functions->CallStaticBooleanMethodV(this,clazz,methodID,args);
1295     }
1296     jboolean CallStaticBooleanMethodA(jclass clazz,
1297                                       jmethodID methodID, jvalue *args) {
1298         return functions->CallStaticBooleanMethodA(this,clazz,methodID,args);
1299     }
1300
1301     jbyte CallStaticByteMethod(jclass clazz,
1302                                jmethodID methodID, ...) {
1303         va_list args;
1304         jbyte result;
1305         va_start(args,methodID);
1306         result = functions->CallStaticByteMethodV(this,clazz,methodID,args);
1307         va_end(args);
1308         return result;
1309     }
1310     jbyte CallStaticByteMethodV(jclass clazz,
1311                                 jmethodID methodID, va_list args) {
1312         return functions->CallStaticByteMethodV(this,clazz,methodID,args);
1313     }
1314     jbyte CallStaticByteMethodA(jclass clazz, 
1315                                 jmethodID methodID, jvalue *args) {
1316         return functions->CallStaticByteMethodA(this,clazz,methodID,args);
1317     }
1318
1319     jchar CallStaticCharMethod(jclass clazz,
1320                                jmethodID methodID, ...) {
1321         va_list args;
1322         jchar result;
1323         va_start(args,methodID);
1324         result = functions->CallStaticCharMethodV(this,clazz,methodID,args);
1325         va_end(args);
1326         return result;
1327     }
1328     jchar CallStaticCharMethodV(jclass clazz,
1329                                 jmethodID methodID, va_list args) {
1330         return functions->CallStaticCharMethodV(this,clazz,methodID,args);
1331     }
1332     jchar CallStaticCharMethodA(jclass clazz,
1333                                 jmethodID methodID, jvalue *args) {
1334         return functions->CallStaticCharMethodA(this,clazz,methodID,args);
1335     }
1336
1337     jshort CallStaticShortMethod(jclass clazz,
1338                                  jmethodID methodID, ...) {
1339         va_list args;
1340         jshort result;
1341         va_start(args,methodID);
1342         result = functions->CallStaticShortMethodV(this,clazz,methodID,args);
1343         va_end(args);
1344         return result;
1345     }
1346     jshort CallStaticShortMethodV(jclass clazz,
1347                                   jmethodID methodID, va_list args) {
1348         return functions->CallStaticShortMethodV(this,clazz,methodID,args);
1349     }
1350     jshort CallStaticShortMethodA(jclass clazz,
1351                                   jmethodID methodID, jvalue *args) {
1352         return functions->CallStaticShortMethodA(this,clazz,methodID,args);
1353     }
1354
1355     jint CallStaticIntMethod(jclass clazz,
1356                              jmethodID methodID, ...) {
1357         va_list args;
1358         jint result;
1359         va_start(args,methodID);
1360         result = functions->CallStaticIntMethodV(this,clazz,methodID,args);
1361         va_end(args);
1362         return result;
1363     }
1364     jint CallStaticIntMethodV(jclass clazz,
1365                               jmethodID methodID, va_list args) {
1366         return functions->CallStaticIntMethodV(this,clazz,methodID,args);
1367     }
1368     jint CallStaticIntMethodA(jclass clazz, 
1369                               jmethodID methodID, jvalue *args) {
1370         return functions->CallStaticIntMethodA(this,clazz,methodID,args);
1371     }
1372
1373     jlong CallStaticLongMethod(jclass clazz,
1374                                jmethodID methodID, ...) {
1375         va_list args;
1376         jlong result;
1377         va_start(args,methodID);
1378         result = functions->CallStaticLongMethodV(this,clazz,methodID,args);
1379         va_end(args);
1380         return result;
1381     }
1382     jlong CallStaticLongMethodV(jclass clazz, 
1383                                 jmethodID methodID, va_list args) {
1384         return functions->CallStaticLongMethodV(this,clazz,methodID,args);
1385     }
1386     jlong CallStaticLongMethodA(jclass clazz, 
1387                                 jmethodID methodID, jvalue *args) {
1388         return functions->CallStaticLongMethodA(this,clazz,methodID,args);
1389     }
1390
1391     jfloat CallStaticFloatMethod(jclass clazz, 
1392                                  jmethodID methodID, ...) {
1393         va_list args;
1394         jfloat result;
1395         va_start(args,methodID);
1396         result = functions->CallStaticFloatMethodV(this,clazz,methodID,args);
1397         va_end(args);
1398         return result;
1399     }
1400     jfloat CallStaticFloatMethodV(jclass clazz, 
1401                                   jmethodID methodID, va_list args) {
1402         return functions->CallStaticFloatMethodV(this,clazz,methodID,args);
1403     }
1404     jfloat CallStaticFloatMethodA(jclass clazz, 
1405                                   jmethodID methodID, jvalue *args) {
1406         return functions->CallStaticFloatMethodA(this,clazz,methodID,args);
1407     }
1408
1409     jdouble CallStaticDoubleMethod(jclass clazz, 
1410                                    jmethodID methodID, ...) {
1411         va_list args;
1412         jdouble result;
1413         va_start(args,methodID);
1414         result = functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
1415         va_end(args);
1416         return result;
1417     }
1418     jdouble CallStaticDoubleMethodV(jclass clazz, 
1419                                     jmethodID methodID, va_list args) {
1420         return functions->CallStaticDoubleMethodV(this,clazz,methodID,args);
1421     }
1422     jdouble CallStaticDoubleMethodA(jclass clazz, 
1423                                     jmethodID methodID, jvalue *args) {
1424         return functions->CallStaticDoubleMethodA(this,clazz,methodID,args);
1425     }
1426
1427     void CallStaticVoidMethod(jclass cls, jmethodID methodID, ...) {
1428         va_list args;
1429         va_start(args,methodID);
1430         functions->CallStaticVoidMethodV(this,cls,methodID,args);
1431         va_end(args);
1432     }
1433     void CallStaticVoidMethodV(jclass cls, jmethodID methodID, 
1434                                va_list args) {
1435         functions->CallStaticVoidMethodV(this,cls,methodID,args);
1436     }
1437     void CallStaticVoidMethodA(jclass cls, jmethodID methodID, 
1438                                jvalue * args) {
1439         functions->CallStaticVoidMethodA(this,cls,methodID,args);
1440     }
1441
1442     jfieldID GetStaticFieldID(jclass clazz, const char *name, 
1443                               const char *sig) {
1444         return functions->GetStaticFieldID(this,clazz,name,sig);
1445     }
1446     jobject GetStaticObjectField(jclass clazz, jfieldID fieldID) {
1447         return functions->GetStaticObjectField(this,clazz,fieldID);
1448     }
1449     jboolean GetStaticBooleanField(jclass clazz, jfieldID fieldID) {
1450         return functions->GetStaticBooleanField(this,clazz,fieldID);
1451     }
1452     jbyte GetStaticByteField(jclass clazz, jfieldID fieldID) {
1453         return functions->GetStaticByteField(this,clazz,fieldID);
1454     }
1455     jchar GetStaticCharField(jclass clazz, jfieldID fieldID) {
1456         return functions->GetStaticCharField(this,clazz,fieldID);
1457     }
1458     jshort GetStaticShortField(jclass clazz, jfieldID fieldID) {
1459         return functions->GetStaticShortField(this,clazz,fieldID);
1460     }
1461     jint GetStaticIntField(jclass clazz, jfieldID fieldID) {
1462         return functions->GetStaticIntField(this,clazz,fieldID);
1463     }
1464     jlong GetStaticLongField(jclass clazz, jfieldID fieldID) {
1465         return functions->GetStaticLongField(this,clazz,fieldID);
1466     }
1467     jfloat GetStaticFloatField(jclass clazz, jfieldID fieldID) {
1468         return functions->GetStaticFloatField(this,clazz,fieldID);
1469     }
1470     jdouble GetStaticDoubleField(jclass clazz, jfieldID fieldID) {
1471         return functions->GetStaticDoubleField(this,clazz,fieldID);
1472     }
1473
1474     void SetStaticObjectField(jclass clazz, jfieldID fieldID,
1475                         jobject value) {
1476       functions->SetStaticObjectField(this,clazz,fieldID,value);
1477     }
1478     void SetStaticBooleanField(jclass clazz, jfieldID fieldID,
1479                         jboolean value) {
1480       functions->SetStaticBooleanField(this,clazz,fieldID,value);
1481     }
1482     void SetStaticByteField(jclass clazz, jfieldID fieldID,
1483                         jbyte value) {
1484       functions->SetStaticByteField(this,clazz,fieldID,value);
1485     }
1486     void SetStaticCharField(jclass clazz, jfieldID fieldID,
1487                         jchar value) {
1488       functions->SetStaticCharField(this,clazz,fieldID,value);
1489     }
1490     void SetStaticShortField(jclass clazz, jfieldID fieldID,
1491                         jshort value) {
1492       functions->SetStaticShortField(this,clazz,fieldID,value);
1493     }
1494     void SetStaticIntField(jclass clazz, jfieldID fieldID,
1495                         jint value) {
1496       functions->SetStaticIntField(this,clazz,fieldID,value);
1497     }
1498     void SetStaticLongField(jclass clazz, jfieldID fieldID,
1499                         jlong value) {
1500       functions->SetStaticLongField(this,clazz,fieldID,value);
1501     }
1502     void SetStaticFloatField(jclass clazz, jfieldID fieldID,
1503                         jfloat value) {
1504       functions->SetStaticFloatField(this,clazz,fieldID,value);
1505     }
1506     void SetStaticDoubleField(jclass clazz, jfieldID fieldID,
1507                         jdouble value) {
1508       functions->SetStaticDoubleField(this,clazz,fieldID,value);
1509     }
1510
1511     jstring NewString(const jchar *unicode, jsize len) {
1512         return functions->NewString(this,unicode,len);
1513     }
1514     jsize GetStringLength(jstring str) {
1515         return functions->GetStringLength(this,str);
1516     }
1517     const jchar *GetStringChars(jstring str, jboolean *isCopy) {
1518         return functions->GetStringChars(this,str,isCopy);
1519     }
1520     void ReleaseStringChars(jstring str, const jchar *chars) {
1521         functions->ReleaseStringChars(this,str,chars);
1522     }
1523   
1524     jstring NewStringUTF(const char *utf) {
1525         return functions->NewStringUTF(this,utf);
1526     }
1527     jsize GetStringUTFLength(jstring str) {
1528         return functions->GetStringUTFLength(this,str);
1529     }
1530     const char* GetStringUTFChars(jstring str, jboolean *isCopy) {
1531         return functions->GetStringUTFChars(this,str,isCopy);
1532     }
1533     void ReleaseStringUTFChars(jstring str, const char* chars) {
1534         functions->ReleaseStringUTFChars(this,str,chars);
1535     }
1536
1537     jsize GetArrayLength(jarray array) {
1538         return functions->GetArrayLength(this,array);
1539     }
1540
1541     jobjectArray NewObjectArray(jsize len, jclass clazz, 
1542                                 jobject init) {
1543         return functions->NewObjectArray(this,len,clazz,init);
1544     }
1545     jobject GetObjectArrayElement(jobjectArray array, jsize index) {
1546         return functions->GetObjectArrayElement(this,array,index);
1547     }
1548     void SetObjectArrayElement(jobjectArray array, jsize index, 
1549                                jobject val) {
1550         functions->SetObjectArrayElement(this,array,index,val);
1551     }
1552
1553     jbooleanArray NewBooleanArray(jsize len) {
1554         return functions->NewBooleanArray(this,len);
1555     }
1556     jbyteArray NewByteArray(jsize len) {
1557         return functions->NewByteArray(this,len);
1558     }
1559     jcharArray NewCharArray(jsize len) {
1560         return functions->NewCharArray(this,len);
1561     }
1562     jshortArray NewShortArray(jsize len) {
1563         return functions->NewShortArray(this,len);
1564     }
1565     jintArray NewIntArray(jsize len) {
1566         return functions->NewIntArray(this,len);
1567     }
1568     jlongArray NewLongArray(jsize len) {
1569         return functions->NewLongArray(this,len);
1570     }
1571     jfloatArray NewFloatArray(jsize len) {
1572         return functions->NewFloatArray(this,len);
1573     }
1574     jdoubleArray NewDoubleArray(jsize len) {
1575         return functions->NewDoubleArray(this,len);
1576     }
1577
1578     jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) {
1579         return functions->GetBooleanArrayElements(this,array,isCopy);
1580     }
1581     jbyte * GetByteArrayElements(jbyteArray array, jboolean *isCopy) {
1582         return functions->GetByteArrayElements(this,array,isCopy);
1583     }
1584     jchar * GetCharArrayElements(jcharArray array, jboolean *isCopy) {
1585         return functions->GetCharArrayElements(this,array,isCopy);
1586     }
1587     jshort * GetShortArrayElements(jshortArray array, jboolean *isCopy) {
1588         return functions->GetShortArrayElements(this,array,isCopy);
1589     }
1590     jint * GetIntArrayElements(jintArray array, jboolean *isCopy) {
1591         return functions->GetIntArrayElements(this,array,isCopy);
1592     }
1593     jlong * GetLongArrayElements(jlongArray array, jboolean *isCopy) {
1594         return functions->GetLongArrayElements(this,array,isCopy);
1595     }
1596     jfloat * GetFloatArrayElements(jfloatArray array, jboolean *isCopy) {
1597         return functions->GetFloatArrayElements(this,array,isCopy);
1598     }
1599     jdouble * GetDoubleArrayElements(jdoubleArray array, jboolean *isCopy) {
1600         return functions->GetDoubleArrayElements(this,array,isCopy);
1601     }
1602
1603     void ReleaseBooleanArrayElements(jbooleanArray array, 
1604                                      jboolean *elems,
1605                                      jint mode) {
1606         functions->ReleaseBooleanArrayElements(this,array,elems,mode);
1607     }
1608     void ReleaseByteArrayElements(jbyteArray array, 
1609                                   jbyte *elems,
1610                                   jint mode) {
1611         functions->ReleaseByteArrayElements(this,array,elems,mode);
1612     }
1613     void ReleaseCharArrayElements(jcharArray array, 
1614                                   jchar *elems,
1615                                   jint mode) {
1616         functions->ReleaseCharArrayElements(this,array,elems,mode);
1617     }
1618     void ReleaseShortArrayElements(jshortArray array, 
1619                                    jshort *elems,
1620                                    jint mode) {
1621         functions->ReleaseShortArrayElements(this,array,elems,mode);
1622     }
1623     void ReleaseIntArrayElements(jintArray array, 
1624                                  jint *elems,
1625                                  jint mode) {
1626         functions->ReleaseIntArrayElements(this,array,elems,mode);
1627     }
1628     void ReleaseLongArrayElements(jlongArray array, 
1629                                   jlong *elems,
1630                                   jint mode) {
1631         functions->ReleaseLongArrayElements(this,array,elems,mode);
1632     }
1633     void ReleaseFloatArrayElements(jfloatArray array, 
1634                                    jfloat *elems,
1635                                    jint mode) {
1636         functions->ReleaseFloatArrayElements(this,array,elems,mode);
1637     }
1638     void ReleaseDoubleArrayElements(jdoubleArray array, 
1639                                     jdouble *elems,
1640                                     jint mode) {
1641         functions->ReleaseDoubleArrayElements(this,array,elems,mode);
1642     }
1643
1644     void GetBooleanArrayRegion(jbooleanArray array, 
1645                                jsize start, jsize len, jboolean *buf) {
1646         functions->GetBooleanArrayRegion(this,array,start,len,buf);
1647     }
1648     void GetByteArrayRegion(jbyteArray array, 
1649                             jsize start, jsize len, jbyte *buf) {
1650         functions->GetByteArrayRegion(this,array,start,len,buf);
1651     }
1652     void GetCharArrayRegion(jcharArray array, 
1653                             jsize start, jsize len, jchar *buf) {
1654         functions->GetCharArrayRegion(this,array,start,len,buf);
1655     }
1656     void GetShortArrayRegion(jshortArray array, 
1657                              jsize start, jsize len, jshort *buf) {
1658         functions->GetShortArrayRegion(this,array,start,len,buf);
1659     }
1660     void GetIntArrayRegion(jintArray array, 
1661                            jsize start, jsize len, jint *buf) {
1662         functions->GetIntArrayRegion(this,array,start,len,buf);
1663     }
1664     void GetLongArrayRegion(jlongArray array, 
1665                             jsize start, jsize len, jlong *buf) {
1666         functions->GetLongArrayRegion(this,array,start,len,buf);
1667     }
1668     void GetFloatArrayRegion(jfloatArray array, 
1669                              jsize start, jsize len, jfloat *buf) {
1670         functions->GetFloatArrayRegion(this,array,start,len,buf);
1671     }
1672     void GetDoubleArrayRegion(jdoubleArray array, 
1673                               jsize start, jsize len, jdouble *buf) {
1674         functions->GetDoubleArrayRegion(this,array,start,len,buf);
1675     }
1676
1677     void SetBooleanArrayRegion(jbooleanArray array, jsize start, jsize len, 
1678                                jboolean *buf) {
1679         functions->SetBooleanArrayRegion(this,array,start,len,buf);
1680     }
1681     void SetByteArrayRegion(jbyteArray array, jsize start, jsize len,
1682                             jbyte *buf) {
1683         functions->SetByteArrayRegion(this,array,start,len,buf);
1684     }
1685     void SetCharArrayRegion(jcharArray array, jsize start, jsize len, 
1686                             jchar *buf) {
1687         functions->SetCharArrayRegion(this,array,start,len,buf);
1688     }
1689     void SetShortArrayRegion(jshortArray array, jsize start, jsize len, 
1690                              jshort *buf) {
1691         functions->SetShortArrayRegion(this,array,start,len,buf);
1692     }
1693     void SetIntArrayRegion(jintArray array, jsize start, jsize len,
1694                            jint *buf) {
1695         functions->SetIntArrayRegion(this,array,start,len,buf);
1696     }
1697     void SetLongArrayRegion(jlongArray array, jsize start, jsize len,
1698                             jlong *buf) {
1699         functions->SetLongArrayRegion(this,array,start,len,buf);
1700     }
1701     void SetFloatArrayRegion(jfloatArray array, jsize start, jsize len, 
1702                              jfloat *buf) {
1703         functions->SetFloatArrayRegion(this,array,start,len,buf);
1704     }
1705     void SetDoubleArrayRegion(jdoubleArray array, jsize start, jsize len,
1706                               jdouble *buf) {
1707         functions->SetDoubleArrayRegion(this,array,start,len,buf);
1708     }
1709
1710     jint RegisterNatives(jclass clazz, const JNINativeMethod *methods,
1711                          jint nMethods) {
1712         return functions->RegisterNatives(this,clazz,methods,nMethods);
1713     }
1714     jint UnregisterNatives(jclass clazz) {
1715         return functions->UnregisterNatives(this,clazz);
1716     }  
1717    
1718     jint MonitorEnter(jobject obj) {
1719         return functions->MonitorEnter(this,obj);
1720     }
1721     jint MonitorExit(jobject obj) {
1722         return functions->MonitorExit(this,obj);
1723     }
1724
1725     jint GetJavaVM(JavaVM **vm) {
1726         return functions->GetJavaVM(this,vm);
1727     }
1728   
1729 #endif /* __cplusplus */
1730 };
1731
1732 /* These structures will be VM-specific. */
1733
1734 typedef struct JDK1_1InitArgs {
1735     jint version;
1736
1737     char **properties;
1738     jint checkSource; 
1739     jint nativeStackSize;
1740     jint javaStackSize;
1741     jint minHeapSize;
1742     jint maxHeapSize;
1743     jint verifyMode;
1744     char *classpath;
1745
1746     jint (JNICALL *vfprintf)(FILE *fp, const char *format, va_list args);
1747     void (JNICALL *exit)(jint code);
1748     void (JNICALL *abort)();
1749     
1750     jint enableClassGC;
1751     jint enableVerboseGC;
1752     jint disableAsyncGC;
1753     jint verbose;
1754     jboolean debugging;
1755     jint debugPort;
1756 } JDK1_1InitArgs;
1757
1758 typedef struct JDK1_1AttachArgs {
1759     void * __padding; /* C compilers don't allow empty structures. */
1760 } JDK1_1AttachArgs;
1761
1762 /* End VM-specific. */
1763
1764 struct JNIInvokeInterface_ {
1765     void *reserved0;
1766     void *reserved1;
1767     void *reserved2;
1768
1769     jint (JNICALL *DestroyJavaVM)(JavaVM *vm);
1770
1771     jint (JNICALL *AttachCurrentThread)
1772       (JavaVM *vm, JNIEnv **penv, void *args);
1773
1774     jint (JNICALL *DetachCurrentThread)(JavaVM *vm);
1775 };
1776
1777 struct JavaVM_ {
1778     const struct JNIInvokeInterface_ *functions;
1779     void *reserved0;
1780     void *reserved1;
1781     void *reserved2;
1782 #ifdef __cplusplus
1783
1784     jint DestroyJavaVM() {
1785         return functions->DestroyJavaVM(this);
1786     }
1787     jint AttachCurrentThread(JNIEnv **penv, void *args) {
1788         return functions->AttachCurrentThread(this, penv, args);
1789     }
1790     jint DetachCurrentThread() {
1791         return functions->DetachCurrentThread(this);
1792     }
1793
1794 #endif
1795 };
1796
1797 JNI_PUBLIC_API(void) JNI_GetDefaultJavaVMInitArgs(void *);
1798
1799 JNI_PUBLIC_API(jint) JNI_CreateJavaVM(JavaVM **, JNIEnv **, void *);
1800
1801 JNI_PUBLIC_API(jint) JNI_GetCreatedJavaVMs(JavaVM **, jsize, jsize *);
1802 JNI_PUBLIC_API(jref) JNI_MakeLocalRef(JNIEnv *pJNIEnv, void *pHObject);
1803
1804 #ifdef __cplusplus
1805 } /* extern "C" */
1806 #endif /* __cplusplus */
1807
1808 #endif /* JNI_H */
1809
1810