Added documentation for java.net.
[cacao.git] / jni.h
1 /******************************** jni.h ***************************************
2
3         contains Java Native Interface types and data structures 
4         includes layout of the JNI function table
5         
6 *******************************************************************************/
7
8 #include <stdarg.h>
9
10 #define JNIEXPORT
11 #define JNICALL
12
13 /* JNI datatypes */
14
15 #define jobject         java_objectheader*
16 #define jclass           struct classinfo*
17 #define jthrowable                 jobject
18 #define jweak                      jobject
19 #define jarray           java_arrayheader*
20 #define jlongArray         java_longarray*
21 #define jbooleanArray   java_booleanarray*
22 #define jintArray           java_intarray*
23 #define jcharArray         java_chararray*
24 #define jbyteArray         java_bytearray*
25 #define jshortArray       java_shortarray*
26 #define jdoubleArray     java_doublearray*
27 #define jfloatArray       java_floatarray*
28 #define jobjectArray     java_objectarray*
29 #define jstring                    jobject
30 #define jint                            s4
31 #define jchar                           s2
32 #define jboolean                        u1
33 #define jbyte                           s1
34 #define jshort                          s2
35 #define jlong                           s8
36 #define jfloat                       float
37 #define jdouble                     double
38 #define jsize                         jint
39 #define jfieldID                fieldinfo*
40 #define jmethodID              methodinfo*      
41
42 struct _JavaVM;                              /* opaque structure */
43 typedef struct _JavaVM* JavaVM;
44
45 typedef union jvalue {
46     jboolean z;
47     jbyte    b;
48     jchar    c;
49     jshort   s;
50     jint     i;
51     jlong    j;
52     jfloat   f;
53     jdouble  d;
54     jobject  l;
55 } jvalue;
56
57 /* JNI-Boolean */
58
59 #define JNI_FALSE 0
60 #define JNI_TRUE  1
61
62 /* native method name, signature and function pointer for use in RegisterNatives */
63
64 typedef struct {
65     char *name;
66     char *signature;
67     void *fnPtr;
68 } JNINativeMethod;
69
70
71 /* 
72         JNI function table, contains functions for the following usages:        
73         
74         Version Information 
75         Class Operations 
76         Exceptions 
77         Global and Local References 
78         Object Operations 
79         Accessing Fields of Objects 
80         Calling Instance Methods 
81         Accessing Static Fields 
82         Calling Static Methods 
83         String Operations 
84         Array Operations 
85         Registering Native Methods 
86         Monitor Operations 
87         Java VM Interface 
88 */
89
90 typedef struct JNI_Table JNIEnv;
91
92 struct JNI_Table {
93     
94     /* reserverd for future JNI-functions */
95     void *unused0;
96     void *unused1;
97     void *unused2;
98     void *unused3;
99     
100     /* version information */
101     
102     jint (*GetVersion) (JNIEnv*);
103
104     /* class operations */
105
106     jclass (*DefineClass) (JNIEnv*, const char *name, jobject loader, const jbyte *buf, jsize len);
107     jclass (*FindClass) (JNIEnv*, const char *name);
108
109     jmethodID (*FromReflectedMethod) (JNIEnv*, jobject method);
110     jfieldID (*FromReflectedField) (JNIEnv*, jobject field);
111
112     jobject (*ToReflectedMethod) (JNIEnv*, jclass cls, jmethodID methodID, jboolean isStatic);
113
114     jclass (*GetSuperclass) (JNIEnv*, jclass sub);
115     jboolean (*IsAssignableForm) (JNIEnv*, jclass sub, jclass sup);
116
117     jobject (*ToReflectedField) (JNIEnv*, jclass cls, jfieldID fieldID, jboolean isStatic);
118
119     /* exceptions */ 
120
121     jint (*Throw) (JNIEnv*, jthrowable obj);
122     jint (*ThrowNew) (JNIEnv*, jclass clazz, const char *msg);
123     jthrowable (*ExceptionOccurred) (JNIEnv*);
124     void (*ExceptionDescribe) (JNIEnv*);
125     void (*ExceptionClear) (JNIEnv*);
126     void (*FatalError) (JNIEnv*, const char *msg);
127
128     /* global and local references */
129
130     jint (*PushLocalFrame) (JNIEnv*, jint capacity);
131     jobject (*PopLocalFrame) (JNIEnv*, jobject result);
132     
133     jobject (*NewGlobalRef) (JNIEnv*, jobject lobj);
134     void (*DeleteGlobalRef) (JNIEnv*, jobject gref);
135     void (*DeleteLocalRef) (JNIEnv*, jobject obj);
136     jboolean (*IsSameObject) (JNIEnv*, jobject obj1, jobject obj2);
137     jobject (*NewLocalRef) (JNIEnv*, jobject ref);
138     jint (*EnsureLocalCapacity) (JNIEnv*, jint capacity);
139
140     /* object operations */ 
141
142     jobject (*AllocObject) (JNIEnv*, jclass clazz);
143     jobject (*NewObject) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
144     jobject (*NewObjectV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
145     jobject (*NewObjectA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
146
147     jclass (*GetObjectClass) (JNIEnv*, jobject obj);
148     jboolean (*IsInstanceOf) (JNIEnv*, jobject obj, jclass clazz);
149
150     jmethodID (*GetMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
151
152     /* calling instance methods */ 
153
154     jobject (*CallObjectMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
155     jobject (*CallObjectMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
156     jobject (*CallObjectMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
157
158     jboolean (*CallBooleanMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
159     jboolean (*CallBooleanMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
160     jboolean (*CallBooleanMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
161
162     jbyte (*CallByteMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
163     jbyte (*CallByteMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
164     jbyte (*CallByteMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
165
166     jchar (*CallCharMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
167     jchar (*CallCharMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
168     jchar (*CallCharMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
169
170     jshort (*CallShortMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
171     jshort (*CallShortMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
172     jshort (*CallShortMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
173
174     jint (*CallIntMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
175     jint (*CallIntMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
176     jint (*CallIntMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
177
178     jlong (*CallLongMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
179     jlong (*CallLongMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
180     jlong (*CallLongMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
181
182     jfloat (*CallFloatMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
183     jfloat (*CallFloatMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
184     jfloat (*CallFloatMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
185
186     jdouble (*CallDoubleMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
187     jdouble (*CallDoubleMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
188     jdouble (*CallDoubleMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
189
190     void (*CallVoidMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
191     void (*CallVoidMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
192     void (*CallVoidMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
193
194     jobject (*CallNonvirtualObjectMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
195     jobject (*CallNonvirtualObjectMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
196     jobject (*CallNonvirtualObjectMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
197
198     jboolean (*CallNonvirtualBooleanMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
199     jboolean (*CallNonvirtualBooleanMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
200     jboolean (*CallNonvirtualBooleanMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
201
202     jbyte (*CallNonvirtualByteMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
203     jbyte (*CallNonvirtualByteMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
204     jbyte (*CallNonvirtualByteMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
205
206     jchar (*CallNonvirtualCharMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
207     jchar (*CallNonvirtualCharMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
208     jchar (*CallNonvirtualCharMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
209
210     jshort (*CallNonvirtualShortMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
211     jshort (*CallNonvirtualShortMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
212     jshort (*CallNonvirtualShortMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
213
214     jint (*CallNonvirtualIntMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
215     jint (*CallNonvirtualIntMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
216     jint (*CallNonvirtualIntMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
217
218     jlong (*CallNonvirtualLongMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
219     jlong (*CallNonvirtualLongMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
220     jlong (*CallNonvirtualLongMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
221
222     jfloat (*CallNonvirtualFloatMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
223     jfloat (*CallNonvirtualFloatMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
224     jfloat (*CallNonvirtualFloatMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
225
226     jdouble (*CallNonvirtualDoubleMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
227     jdouble (*CallNonvirtualDoubleMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
228     jdouble (*CallNonvirtualDoubleMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
229
230     void (*CallNonvirtualVoidMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
231     void (*CallNonvirtualVoidMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
232     void (*CallNonvirtualVoidMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
233
234     /* accessing fields */
235
236     jfieldID (*GetFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
237
238     jobject (*GetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID);
239     jboolean (*GetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID);
240     jbyte (*GetByteField) (JNIEnv*, jobject obj, jfieldID fieldID);
241     jchar (*GetCharField) (JNIEnv*, jobject obj, jfieldID fieldID);
242     jshort (*GetShortField) (JNIEnv*, jobject obj, jfieldID fieldID);
243     jint (*GetIntField) (JNIEnv*, jobject obj, jfieldID fieldID);
244     jlong (*GetLongField) (JNIEnv*, jobject obj, jfieldID fieldID);
245     jfloat (*GetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID);
246     jdouble (*GetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID);
247
248     void (*SetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID, jobject val);
249     void (*SetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID, jboolean val);
250     void (*SetByteField) (JNIEnv*, jobject obj, jfieldID fieldID, jbyte val);
251     void (*SetCharField) (JNIEnv*, jobject obj, jfieldID fieldID, jchar val);
252     void (*SetShortField) (JNIEnv*, jobject obj, jfieldID fieldID, jshort val);
253     void (*SetIntField) (JNIEnv*, jobject obj, jfieldID fieldID, jint val);
254     void (*SetLongField) (JNIEnv*, jobject obj, jfieldID fieldID, jlong val);
255     void (*SetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID, jfloat val);
256     void (*SetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID, jdouble val);
257
258     /* calling static methods */ 
259     
260     jmethodID (*GetStaticMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
261
262     jobject (*CallStaticObjectMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
263     jobject (*CallStaticObjectMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
264     jobject (*CallStaticObjectMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
265
266     jboolean (*CallStaticBooleanMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
267     jboolean (*CallStaticBooleanMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
268     jboolean (*CallStaticBooleanMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
269
270     jbyte (*CallStaticByteMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
271     jbyte (*CallStaticByteMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
272     jbyte (*CallStaticByteMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
273
274     jchar (*CallStaticCharMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
275     jchar (*CallStaticCharMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
276     jchar (*CallStaticCharMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
277
278     jshort (*CallStaticShortMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
279     jshort (*CallStaticShortMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
280     jshort (*CallStaticShortMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
281
282     jint (*CallStaticIntMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
283     jint (*CallStaticIntMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
284     jint (*CallStaticIntMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
285
286     jlong (*CallStaticLongMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
287     jlong (*CallStaticLongMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
288     jlong (*CallStaticLongMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
289
290     jfloat (*CallStaticFloatMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
291     jfloat (*CallStaticFloatMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
292     jfloat (*CallStaticFloatMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
293
294     jdouble (*CallStaticDoubleMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
295     jdouble (*CallStaticDoubleMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
296     jdouble (*CallStaticDoubleMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
297
298     void (*CallStaticVoidMethod) (JNIEnv*, jclass cls, jmethodID methodID, ...);
299     void (*CallStaticVoidMethodV) (JNIEnv*, jclass cls, jmethodID methodID, va_list args);
300     void (*CallStaticVoidMethodA) (JNIEnv*, jclass cls, jmethodID methodID, jvalue * args);
301
302     /* accessing static fields */
303
304     jfieldID (*GetStaticFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
305     jobject (*GetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID);
306     jboolean (*GetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID);
307     jbyte (*GetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID);
308     jchar (*GetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID);
309     jshort (*GetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID);
310     jint (*GetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID);
311     jlong (*GetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID);
312     jfloat (*GetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID);
313     jdouble (*GetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID);
314
315     void (*SetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID, jobject value);
316     void (*SetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID, jboolean value);
317     void (*SetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID, jbyte value);
318     void (*SetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID, jchar value);
319     void (*SetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID, jshort value);
320     void (*SetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID, jint value);
321     void (*SetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID, jlong value);
322     void (*SetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID, jfloat value);
323     void (*SetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID, jdouble value);
324
325     /* string operations */ 
326
327     jstring (*NewString) (JNIEnv*, const jchar *unicode, jsize len);
328     jsize (*GetStringLength) (JNIEnv*, jstring str);
329     const jchar *(*GetStringChars) (JNIEnv*, jstring str, jboolean *isCopy);
330     void (*ReleaseStringChars) (JNIEnv*, jstring str, const jchar *chars);
331
332     jstring (*NewStringUTF) (JNIEnv*, const char *utf);
333     jsize (*GetStringUTFLength) (JNIEnv*, jstring str);
334     const char* (*GetStringUTFChars) (JNIEnv*, jstring str, jboolean *isCopy);
335     void (*ReleaseStringUTFChars) (JNIEnv*, jstring str, const char* chars);
336
337     /* array operations */
338
339     jsize (*GetArrayLength) (JNIEnv*, jarray array);
340
341     jobjectArray (*NewObjectArray) (JNIEnv*, jsize len, jclass clazz, jobject init);
342     jobject (*GetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index);
343     void (*SetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index, jobject val);
344
345     jbooleanArray (*NewBooleanArray) (JNIEnv*, jsize len);
346     jbyteArray (*NewByteArray) (JNIEnv*, jsize len);
347     jcharArray (*NewCharArray) (JNIEnv*, jsize len);
348     jshortArray (*NewShortArray) (JNIEnv*, jsize len);
349     jintArray (*NewIntArray) (JNIEnv*, jsize len);
350     jlongArray (*NewLongArray) (JNIEnv*, jsize len);
351     jfloatArray (*NewFloatArray) (JNIEnv*, jsize len);
352     jdoubleArray (*NewDoubleArray) (JNIEnv*, jsize len);
353
354     jboolean * (*GetBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *isCopy);
355     jbyte * (*GetByteArrayElements) (JNIEnv*, jbyteArray array, jboolean *isCopy);
356     jchar * (*GetCharArrayElements) (JNIEnv*, jcharArray array, jboolean *isCopy);
357     jshort * (*GetShortArrayElements) (JNIEnv*, jshortArray array, jboolean *isCopy);
358     jint * (*GetIntArrayElements) (JNIEnv*, jintArray array, jboolean *isCopy);
359     jlong * (*GetLongArrayElements) (JNIEnv*, jlongArray array, jboolean *isCopy);
360     jfloat * (*GetFloatArrayElements) (JNIEnv*, jfloatArray array, jboolean *isCopy);
361     jdouble * (*GetDoubleArrayElements) (JNIEnv*, jdoubleArray array, jboolean *isCopy);
362
363     void (*ReleaseBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *elems, jint mode);
364     void (*ReleaseByteArrayElements) (JNIEnv*, jbyteArray array, jbyte *elems, jint mode);
365     void (*ReleaseCharArrayElements) (JNIEnv*, jcharArray array, jchar *elems, jint mode);
366     void (*ReleaseShortArrayElements) (JNIEnv*, jshortArray array, jshort *elems, jint mode);
367     void (*ReleaseIntArrayElements) (JNIEnv*, jintArray array, jint *elems, jint mode);
368     void (*ReleaseLongArrayElements) (JNIEnv*, jlongArray array, jlong *elems, jint mode);
369     void (*ReleaseFloatArrayElements) (JNIEnv*, jfloatArray array, jfloat *elems, jint mode);
370     void (*ReleaseDoubleArrayElements) (JNIEnv*, jdoubleArray array, jdouble *elems, jint mode);
371
372     void (*GetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
373     void (*GetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
374     void (*GetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
375     void (*GetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
376     void (*GetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
377     void (*GetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
378     void (*GetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
379     void (*GetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
380
381     void (*SetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
382     void (*SetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
383     void (*SetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
384     void (*SetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
385     void (*SetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
386     void (*SetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
387     void (*SetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
388     void (*SetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
389
390     /* registering native methods */
391
392     jint (*RegisterNatives) (JNIEnv*, jclass clazz, const JNINativeMethod *methods, jint nMethods);
393     jint (*UnregisterNatives) (JNIEnv*, jclass clazz);
394
395     /* monitor operations */
396
397     jint (*MonitorEnter) (JNIEnv*, jobject obj);
398     jint (*MonitorExit) (JNIEnv*, jobject obj);
399
400     /* JavaVM interface */
401
402     jint (*GetJavaVM) (JNIEnv*, JavaVM **vm);
403
404     void (*GetStringRegion) (JNIEnv*, jstring str, jsize start, jsize len, jchar *buf);
405     void (*GetStringUTFRegion) (JNIEnv*, jstring str, jsize start, jsize len, char *buf);
406
407     void * (*GetPrimitiveArrayCritical) (JNIEnv*, jarray array, jboolean *isCopy);
408     void (*ReleasePrimitiveArrayCritical) (JNIEnv*, jarray array, void *carray, jint mode);
409
410     const jchar * (*GetStringCritical) (JNIEnv*, jstring string, jboolean *isCopy);
411     void (*ReleaseStringCritical) (JNIEnv*, jstring string, const jchar *cstring);
412
413     jweak (*NewWeakGlobalRef) (JNIEnv*, jobject obj);
414     void (*DeleteWeakGlobalRef) (JNIEnv*, jweak ref);
415
416     jboolean (*ExceptionCheck) (JNIEnv*);
417 };
418
419
420 /* the active JNI function table */
421
422 extern JNIEnv env;
423
424
425