OSDN Git Service

60b2302754a80bc46c97d7246b743bcebcb21617
[pf3gnuchains/gcc-fork.git] / libjava / include / jni.h
1 /* Copyright (C) 1998, 1999, 2000  Red Hat, Inc.
2
3    This file is part of libgcj.
4
5 This software is copyrighted work licensed under the terms of the
6 Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
7 details.  */
8
9 /* Note: this file must be compilable by the C compiler (for now,
10    assuming GNU C is ok).  This means you must never use `//'
11    comments, and all C++-specific code must be conditional on
12    __cplusplus.  */
13
14 #ifndef __GCJ_JNI_H__
15 #define __GCJ_JNI_H__
16
17 #include <stdarg.h>
18 #define _Jv_va_list va_list
19
20 #ifdef __cplusplus
21
22 /* This is wrong, because it pollutes the name-space too much! */
23 #include <gcj/javaprims.h>
24
25 typedef struct _Jv_JNIEnv JNIEnv;
26
27 #define JNI_TRUE true
28 #define JNI_FALSE false
29
30 #else /* __cplusplus */
31
32 typedef int    jbyte  __attribute__((__mode__(__QI__)));
33 typedef int    jshort __attribute__((__mode__(__HI__)));
34 typedef int    jint   __attribute__((__mode__(__SI__)));
35 typedef int    jlong  __attribute__((__mode__(__DI__)));
36 typedef bool   jboolean __attribute__((__mode__(__QI__)));
37 typedef unsigned short jchar __attribute__((__mode__(__HI__)));
38 typedef float  jfloat;
39 typedef double jdouble;
40 typedef jint jsize;
41
42 typedef void *jobject;
43 typedef jobject jclass;
44 typedef jobject jstring;
45 typedef jobject jarray;
46 typedef jobject jthrowable;
47 typedef jobject jobjectArray;
48 typedef jobject jbyteArray;
49 typedef jobject jshortArray;
50 typedef jobject jintArray;
51 typedef jobject jlongArray;
52 typedef jobject jbooleanArray;
53 typedef jobject jcharArray;
54 typedef jobject jfloatArray;
55 typedef jobject jdoubleArray;
56
57 /* Dummy defines.  */
58 typedef void *jfieldID;
59 typedef void *jmethodID;
60
61 typedef const struct JNINativeInterface *JNIEnv;
62
63 #define JNI_TRUE 1
64 #define JNI_TRUE 0
65
66 #endif /* __cplusplus */
67
68 /* FIXME: this is wrong.  */
69 typedef jobject jweak;
70
71 /* Version numbers.  */
72 #define JNI_VERSION_1_1 0x00010001
73 #define JNI_VERSION_1_2 0x00010002
74
75 /* Used when releasing array elements.  */
76 #define JNI_COMMIT 1
77 #define JNI_ABORT  2
78
79 typedef union jvalue
80 {
81   jboolean z;
82   jbyte    b;
83   jchar    c;
84   jshort   s;
85   jint     i;
86   jlong    j;
87   jfloat   f;
88   jdouble  d;
89   jobject  l;
90 } jvalue;
91
92 typedef void * (*_Jv_func)(...);
93
94 /* This structure is used when registering native methods.  */
95 typedef struct
96 {
97   char *name;
98   char *signature;
99   void *fnPtr;                  /* Sigh.  */
100 } JNINativeMethod;
101
102 /* FIXME: this is just a placeholder.  */
103 typedef int JavaVM;
104
105 struct JNINativeInterface
106 {
107   _Jv_func reserved0;
108   _Jv_func reserved1;
109   _Jv_func reserved2;
110   _Jv_func reserved3;
111
112   jint     (*GetVersion)                   (JNIEnv *);
113   jclass   (*DefineClass)                  (JNIEnv *, jobject,
114                                             const jbyte *, jsize);
115   jclass   (*FindClass)                    (JNIEnv *, const char *);
116
117   jmethodID (*FromReflectedMethod)         (JNIEnv *, jobject);
118   jfieldID  (*FromReflectedField)          (JNIEnv *, jobject);
119   jobject   (*ToReflectedMethod)           (JNIEnv *, jclass, jmethodID,
120                                             jboolean);
121
122   jclass   (*GetSuperclass)                (JNIEnv *, jclass);
123   jboolean (*IsAssignableFrom)             (JNIEnv *, jclass, jclass);
124
125   jobject  (*ToReflectedField)             (JNIEnv *, jclass, jfieldID,
126                                             jboolean);
127
128   jint     (*Throw)                        (JNIEnv *, jthrowable);
129   jint     (*ThrowNew)                     (JNIEnv *, jclass, const char *);
130   jthrowable (*ExceptionOccurred)          (JNIEnv *);
131   void     (*ExceptionDescribe)            (JNIEnv *);
132   void     (*ExceptionClear)               (JNIEnv *);
133   void     (*FatalError)                   (JNIEnv *, const char *);
134
135   jint     (*PushLocalFrame)               (JNIEnv *, jint);
136   jobject  (*PopLocalFrame)                (JNIEnv *, jobject result);
137
138   jobject  (*NewGlobalRef)                 (JNIEnv *, jobject);
139   void     (*DeleteGlobalRef)              (JNIEnv *, jobject);
140   void     (*DeleteLocalRef)               (JNIEnv *, jobject);;
141   jboolean (*IsSameObject)                 (JNIEnv *, jobject, jobject);
142
143   jobject  (*NewLocalRef)                  (JNIEnv *, jobject);
144   jint     (*EnsureLocalCapacity)          (JNIEnv *, jint);
145
146   jobject  (*AllocObject)                  (JNIEnv *, jclass);
147   jobject (*NewObject)                     (JNIEnv *, jclass, jmethodID, ...);
148   jobject (*NewObjectV)                    (JNIEnv *, jclass, jmethodID,
149                                             _Jv_va_list);
150   jobject (*NewObjectA)                    (JNIEnv *, jclass, jmethodID,
151                                             jvalue *);
152
153   jclass   (*GetObjectClass)               (JNIEnv *, jobject);
154   jboolean (*IsInstanceOf)                 (JNIEnv *, jobject, jclass);
155   jmethodID (*GetMethodID)                 (JNIEnv *, jclass, const char *,
156                                             const char *);
157
158   jobject       (*CallObjectMethod)        (JNIEnv *, jobject, jmethodID,
159                                             ...);
160   jobject       (*CallObjectMethodV)       (JNIEnv *, jobject, jmethodID,
161                                             _Jv_va_list);
162   jobject       (*CallObjectMethodA)       (JNIEnv *, jobject, jmethodID,
163                                             jvalue *);
164   jboolean      (*CallBooleanMethod)       (JNIEnv *, jobject, jmethodID,
165                                             ...);
166   jboolean      (*CallBooleanMethodV)      (JNIEnv *, jobject, jmethodID,
167                                             _Jv_va_list);
168   jboolean      (*CallBooleanMethodA)      (JNIEnv *, jobject, jmethodID,
169                                             jvalue *);
170   jbyte         (*CallByteMethod)          (JNIEnv *, jobject, jmethodID,
171                                             ...);
172   jbyte         (*CallByteMethodV)         (JNIEnv *, jobject, jmethodID,
173                                             _Jv_va_list);
174   jbyte         (*CallByteMethodA)         (JNIEnv *, jobject, jmethodID,
175                                             jvalue *);
176   jchar         (*CallCharMethod)          (JNIEnv *, jobject, jmethodID,
177                                             ...);
178   jchar         (*CallCharMethodV)         (JNIEnv *, jobject, jmethodID,
179                                             _Jv_va_list);
180   jchar         (*CallCharMethodA)         (JNIEnv *, jobject, jmethodID,
181                                             jvalue *);
182   jshort        (*CallShortMethod)         (JNIEnv *, jobject, jmethodID,
183                                             ...);
184   jshort        (*CallShortMethodV)        (JNIEnv *, jobject, jmethodID,
185                                             _Jv_va_list);
186   jshort        (*CallShortMethodA)        (JNIEnv *, jobject, jmethodID,
187                                             jvalue *);
188   jint          (*CallIntMethod)           (JNIEnv *, jobject, jmethodID,
189                                             ...);
190   jint          (*CallIntMethodV)          (JNIEnv *, jobject, jmethodID,
191                                             _Jv_va_list);
192   jint          (*CallIntMethodA)          (JNIEnv *, jobject, jmethodID,
193                                             jvalue *);
194   jlong         (*CallLongMethod)          (JNIEnv *, jobject, jmethodID,
195                                             ...);
196   jlong         (*CallLongMethodV)         (JNIEnv *, jobject, jmethodID,
197                                             _Jv_va_list);
198   jlong         (*CallLongMethodA)         (JNIEnv *, jobject, jmethodID,
199                                             jvalue *);
200   jfloat        (*CallFloatMethod)         (JNIEnv *, jobject, jmethodID,
201                                             ...);
202   jfloat        (*CallFloatMethodV)        (JNIEnv *, jobject, jmethodID,
203                                             _Jv_va_list);
204   jfloat        (*CallFloatMethodA)        (JNIEnv *, jobject, jmethodID,
205                                             jvalue *);
206   jdouble       (*CallDoubleMethod)        (JNIEnv *, jobject, jmethodID,
207                                             ...);
208   jdouble       (*CallDoubleMethodV)       (JNIEnv *, jobject, jmethodID,
209                                             _Jv_va_list);
210   jdouble       (*CallDoubleMethodA)       (JNIEnv *, jobject, jmethodID,
211                                             jvalue *);
212   void          (*CallVoidMethod)          (JNIEnv *, jobject, jmethodID,
213                                             ...);
214   void          (*CallVoidMethodV)         (JNIEnv *, jobject, jmethodID,
215                                             _Jv_va_list);
216   void          (*CallVoidMethodA)         (JNIEnv *, jobject, jmethodID,
217                                             jvalue *);
218
219   jobject   (*CallNonvirtualObjectMethod)  (JNIEnv *, jobject, jclass,
220                                             jmethodID, ...);
221   jobject   (*CallNonvirtualObjectMethodV) (JNIEnv *, jobject, jclass,
222                                             jmethodID, _Jv_va_list);
223   jobject   (*CallNonvirtualObjectMethodA) (JNIEnv *, jobject, jclass,
224                                             jmethodID, jvalue *);
225   jboolean  (*CallNonvirtualBooleanMethod) (JNIEnv *, jobject, jclass,
226                                             jmethodID, ...);
227   jboolean  (*CallNonvirtualBooleanMethodV) (JNIEnv *, jobject, jclass,
228                                              jmethodID, _Jv_va_list);
229   jboolean  (*CallNonvirtualBooleanMethodA) (JNIEnv *, jobject, jclass,
230                                              jmethodID, jvalue *);
231   jbyte     (*CallNonvirtualByteMethod)    (JNIEnv *, jobject, jclass,
232                                             jmethodID, ...);
233   jbyte     (*CallNonvirtualByteMethodV)   (JNIEnv *, jobject, jclass,
234                                             jmethodID, _Jv_va_list);
235   jbyte     (*CallNonvirtualByteMethodA)   (JNIEnv *, jobject, jclass,
236                                             jmethodID, jvalue *);
237   jchar     (*CallNonvirtualCharMethod)    (JNIEnv *, jobject, jclass,
238                                             jmethodID, ...);
239   jchar     (*CallNonvirtualCharMethodV)   (JNIEnv *, jobject, jclass,
240                                             jmethodID, _Jv_va_list);
241   jchar     (*CallNonvirtualCharMethodA)   (JNIEnv *, jobject, jclass,
242                                             jmethodID, jvalue *);
243   jshort    (*CallNonvirtualShortMethod)   (JNIEnv *, jobject, jclass,
244                                             jmethodID, ...);
245   jshort    (*CallNonvirtualShortMethodV)  (JNIEnv *, jobject, jclass,
246                                             jmethodID, _Jv_va_list);
247   jshort    (*CallNonvirtualShortMethodA)  (JNIEnv *, jobject, jclass,
248                                             jmethodID, jvalue *);
249   jint      (*CallNonvirtualIntMethod)     (JNIEnv *, jobject, jclass,
250                                             jmethodID, ...);
251   jint      (*CallNonvirtualIntMethodV)    (JNIEnv *, jobject, jclass,
252                                             jmethodID, _Jv_va_list);
253   jint      (*CallNonvirtualIntMethodA)    (JNIEnv *, jobject, jclass,
254                                             jmethodID, jvalue *);
255   jlong     (*CallNonvirtualLongMethod)    (JNIEnv *, jobject, jclass,
256                                             jmethodID, ...);
257   jlong     (*CallNonvirtualLongMethodV)   (JNIEnv *, jobject, jclass,
258                                             jmethodID, _Jv_va_list);
259   jlong     (*CallNonvirtualLongMethodA)   (JNIEnv *, jobject, jclass,
260                                             jmethodID, jvalue *);
261   jfloat    (*CallNonvirtualFloatMethod)   (JNIEnv *, jobject, jclass,
262                                             jmethodID, ...);
263   jfloat    (*CallNonvirtualFloatMethodV)  (JNIEnv *, jobject, jclass,
264                                             jmethodID, _Jv_va_list);
265   jfloat    (*CallNonvirtualFloatMethodA)  (JNIEnv *, jobject, jclass,
266                                             jmethodID, jvalue *);
267   jdouble   (*CallNonvirtualDoubleMethod)  (JNIEnv *, jobject, jclass,
268                                             jmethodID, ...);
269   jdouble   (*CallNonvirtualDoubleMethodV) (JNIEnv *, jobject, jclass,
270                                             jmethodID, _Jv_va_list);
271   jdouble   (*CallNonvirtualDoubleMethodA) (JNIEnv *, jobject, jclass,
272                                             jmethodID, jvalue *);
273   void      (*CallNonvirtualVoidMethod)    (JNIEnv *, jobject, jclass,
274                                             jmethodID, ...);
275   void      (*CallNonvirtualVoidMethodV)   (JNIEnv *, jobject, jclass,
276                                             jmethodID, _Jv_va_list);
277   void      (*CallNonvirtualVoidMethodA)   (JNIEnv *, jobject, jclass,
278                                             jmethodID, jvalue *);
279
280   jfieldID      (*GetFieldID)              (JNIEnv *, jclass, const char *,
281                                             const char *);
282
283   jobject  (*GetObjectField)               (JNIEnv *, jobject, jfieldID);
284   jboolean (*GetBooleanField)              (JNIEnv *, jobject, jfieldID);
285   jbyte    (*GetByteField)                 (JNIEnv *, jobject, jfieldID);
286   jchar    (*GetCharField)                 (JNIEnv *, jobject, jfieldID);
287   jshort   (*GetShortField)                (JNIEnv *, jobject, jfieldID);
288   jint     (*GetIntField)                  (JNIEnv *, jobject, jfieldID);
289   jlong    (*GetLongField)                 (JNIEnv *, jobject, jfieldID);
290   jfloat   (*GetFloatField)                (JNIEnv *, jobject, jfieldID);
291   jdouble  (*GetDoubleField)               (JNIEnv *, jobject, jfieldID);
292
293   void          (*SetObjectField)          (JNIEnv *, jobject,
294                                             jfieldID, jobject);
295   void          (*SetBooleanField)         (JNIEnv *, jobject,
296                                             jfieldID, jboolean);
297   void          (*SetByteField)            (JNIEnv *, jobject,
298                                             jfieldID, jbyte);
299   void          (*SetCharField)            (JNIEnv *, jobject,
300                                             jfieldID, jchar);
301   void          (*SetShortField)           (JNIEnv *, jobject,
302                                             jfieldID, jshort);
303   void          (*SetIntField)             (JNIEnv *, jobject,
304                                             jfieldID, jint);
305   void          (*SetLongField)            (JNIEnv *, jobject,
306                                             jfieldID, jlong);
307   void          (*SetFloatField)           (JNIEnv *, jobject,
308                                             jfieldID, jfloat);
309   void          (*SetDoubleField)          (JNIEnv *, jobject,
310                                             jfieldID, jdouble);
311
312   jmethodID (*GetStaticMethodID)           (JNIEnv *, jclass, const char *,
313                                             const char *);
314
315   jobject       (*CallStaticObjectMethod)  (JNIEnv *, jclass, jmethodID,
316                                             ...);
317   jobject       (*CallStaticObjectMethodV) (JNIEnv *, jclass, jmethodID,
318                                             _Jv_va_list);
319   jobject       (*CallStaticObjectMethodA) (JNIEnv *, jclass, jmethodID,
320                                             jvalue *);
321   jboolean      (*CallStaticBooleanMethod) (JNIEnv *, jclass, jmethodID,
322                                             ...);
323   jboolean      (*CallStaticBooleanMethodV) (JNIEnv *, jclass, jmethodID,
324                                              _Jv_va_list);
325   jboolean      (*CallStaticBooleanMethodA) (JNIEnv *, jclass, jmethodID,
326                                              jvalue *);
327   jbyte         (*CallStaticByteMethod)    (JNIEnv *, jclass, jmethodID,
328                                             ...);
329   jbyte         (*CallStaticByteMethodV)   (JNIEnv *, jclass, jmethodID,
330                                             _Jv_va_list);
331   jbyte         (*CallStaticByteMethodA)   (JNIEnv *, jclass, jmethodID,
332                                             jvalue *);
333   jchar         (*CallStaticCharMethod)    (JNIEnv *, jclass, jmethodID,
334                                             ...);
335   jchar         (*CallStaticCharMethodV)   (JNIEnv *, jclass, jmethodID,
336                                             _Jv_va_list);
337   jchar         (*CallStaticCharMethodA)   (JNIEnv *, jclass, jmethodID,
338                                             jvalue *);
339   jshort        (*CallStaticShortMethod)   (JNIEnv *, jclass, jmethodID,
340                                             ...);
341   jshort        (*CallStaticShortMethodV)  (JNIEnv *, jclass, jmethodID,
342                                             _Jv_va_list);
343   jshort        (*CallStaticShortMethodA)  (JNIEnv *, jclass, jmethodID,
344                                             jvalue *);
345   jint          (*CallStaticIntMethod)     (JNIEnv *, jclass, jmethodID,
346                                             ...);
347   jint          (*CallStaticIntMethodV)    (JNIEnv *, jclass, jmethodID,
348                                             _Jv_va_list);
349   jint          (*CallStaticIntMethodA)    (JNIEnv *, jclass, jmethodID,
350                                             jvalue *);
351   jlong         (*CallStaticLongMethod)    (JNIEnv *, jclass, jmethodID,
352                                             ...);
353   jlong         (*CallStaticLongMethodV)   (JNIEnv *, jclass, jmethodID,
354                                             _Jv_va_list);
355   jlong         (*CallStaticLongMethodA)   (JNIEnv *, jclass, jmethodID,
356                                             jvalue *);
357   jfloat        (*CallStaticFloatMethod)   (JNIEnv *, jclass, jmethodID,
358                                             ...);
359   jfloat        (*CallStaticFloatMethodV)  (JNIEnv *, jclass, jmethodID,
360                                             _Jv_va_list);
361   jfloat        (*CallStaticFloatMethodA)  (JNIEnv *, jclass, jmethodID,
362                                             jvalue *);
363   jdouble       (*CallStaticDoubleMethod)  (JNIEnv *, jclass, jmethodID,
364                                             ...);
365   jdouble       (*CallStaticDoubleMethodV) (JNIEnv *, jclass, jmethodID,
366                                             _Jv_va_list);
367   jdouble       (*CallStaticDoubleMethodA) (JNIEnv *, jclass, jmethodID,
368                                             jvalue *);
369   void          (*CallStaticVoidMethod)    (JNIEnv *, jclass, jmethodID,
370                                             ...);
371   void          (*CallStaticVoidMethodV)   (JNIEnv *, jclass, jmethodID,
372                                             _Jv_va_list);
373   void          (*CallStaticVoidMethodA)   (JNIEnv *, jclass, jmethodID,
374                                             jvalue *);
375
376   jfieldID      (*GetStaticFieldID)        (JNIEnv *, jclass, const char *,
377                                             const char *);
378
379   jobject       (*GetStaticObjectField)    (JNIEnv *, jclass, jfieldID);
380   jboolean      (*GetStaticBooleanField)   (JNIEnv *, jclass, jfieldID);
381   jbyte         (*GetStaticByteField)      (JNIEnv *, jclass, jfieldID);
382   jchar         (*GetStaticCharField)      (JNIEnv *, jclass, jfieldID);
383   jshort        (*GetStaticShortField)     (JNIEnv *, jclass, jfieldID);
384   jint          (*GetStaticIntField)       (JNIEnv *, jclass, jfieldID);
385   jlong         (*GetStaticLongField)      (JNIEnv *, jclass, jfieldID);
386   jfloat        (*GetStaticFloatField)     (JNIEnv *, jclass, jfieldID);
387   jdouble       (*GetStaticDoubleField)    (JNIEnv *, jclass, jfieldID);
388
389   void          (*SetStaticObjectField)    (JNIEnv *, jclass,
390                                             jfieldID, jobject);
391   void          (*SetStaticBooleanField)   (JNIEnv *, jclass,
392                                             jfieldID, jboolean);
393   void          (*SetStaticByteField)      (JNIEnv *, jclass,
394                                             jfieldID, jbyte);
395   void          (*SetStaticCharField)      (JNIEnv *, jclass,
396                                             jfieldID, jchar);
397   void          (*SetStaticShortField)     (JNIEnv *, jclass,
398                                             jfieldID, jshort);
399   void          (*SetStaticIntField)       (JNIEnv *, jclass,
400                                             jfieldID, jint);
401   void          (*SetStaticLongField)      (JNIEnv *, jclass,
402                                             jfieldID, jlong);
403   void          (*SetStaticFloatField)     (JNIEnv *, jclass,
404                                             jfieldID, jfloat);
405   void          (*SetStaticDoubleField)    (JNIEnv *, jclass,
406                                             jfieldID, jdouble);
407
408   jstring  (*NewString)                    (JNIEnv *, const jchar *, jsize);
409   jint     (*GetStringLength)              (JNIEnv *, jstring);
410   const jchar * (*GetStringChars)          (JNIEnv *, jstring, jboolean *);
411   void     (*ReleaseStringChars)           (JNIEnv *, jstring, const jchar *);
412   jstring  (*NewStringUTF)                 (JNIEnv *, const char *);
413   jsize    (*GetStringUTFLength)           (JNIEnv *, jstring);
414   const char * (*GetStringUTFChars)        (JNIEnv *, jstring, jboolean *);
415   void     (*ReleaseStringUTFChars)        (JNIEnv *, jstring, const char *);
416   jsize    (*GetArrayLength)               (JNIEnv *, jarray);
417   jarray   (*NewObjectArray)               (JNIEnv *, jsize, jclass, jobject);
418   jobject  (*GetObjectArrayElement)        (JNIEnv *, jobjectArray, jsize);
419   void     (*SetObjectArrayElement)        (JNIEnv *, jobjectArray, jsize,
420                                             jobject);
421
422   jbooleanArray (*NewBooleanArray)         (JNIEnv *, jsize);
423   jbyteArray    (*NewByteArray)            (JNIEnv *, jsize);
424   jcharArray    (*NewCharArray)            (JNIEnv *, jsize);
425   jshortArray   (*NewShortArray)           (JNIEnv *, jsize);
426   jintArray     (*NewIntArray)             (JNIEnv *, jsize);
427   jlongArray    (*NewLongArray)            (JNIEnv *, jsize);
428   jfloatArray   (*NewFloatArray)           (JNIEnv *, jsize);
429   jdoubleArray  (*NewDoubleArray)          (JNIEnv *, jsize);
430
431   jboolean *    (*GetBooleanArrayElements) (JNIEnv *, jbooleanArray,
432                                             jboolean *);
433   jbyte *       (*GetByteArrayElements)    (JNIEnv *, jbyteArray,
434                                             jboolean *);
435   jchar *       (*GetCharArrayElements)    (JNIEnv *, jcharArray,
436                                             jboolean *);
437   jshort *      (*GetShortArrayElements)   (JNIEnv *, jshortArray,
438                                             jboolean *);
439   jint *        (*GetIntArrayElements)     (JNIEnv *, jintArray,
440                                             jboolean *);
441   jlong *       (*GetLongArrayElements)    (JNIEnv *, jlongArray,
442                                             jboolean *);
443   jfloat *      (*GetFloatArrayElements)   (JNIEnv *, jfloatArray,
444                                             jboolean *);
445   jdouble *     (*GetDoubleArrayElements)  (JNIEnv *, jdoubleArray,
446                                             jboolean *);
447
448   void          (*ReleaseBooleanArrayElements) (JNIEnv *, jbooleanArray,
449                                                 jboolean *, jint);
450   void          (*ReleaseByteArrayElements)    (JNIEnv *, jbyteArray,
451                                                 jbyte *, jint);
452   void          (*ReleaseCharArrayElements)    (JNIEnv *, jcharArray,
453                                                 jchar *, jint);
454   void          (*ReleaseShortArrayElements)   (JNIEnv *, jshortArray,
455                                                 jshort *, jint);
456   void          (*ReleaseIntArrayElements)     (JNIEnv *, jintArray,
457                                                 jint *, jint);
458   void          (*ReleaseLongArrayElements)    (JNIEnv *, jlongArray,
459                                                 jlong *, jint);
460   void          (*ReleaseFloatArrayElements)   (JNIEnv *, jfloatArray,
461                                                 jfloat *, jint);
462   void          (*ReleaseDoubleArrayElements)  (JNIEnv *, jdoubleArray,
463                                                 jdouble *, jint);
464
465   void          (*GetBooleanArrayRegion)   (JNIEnv *, jbooleanArray,
466                                             jsize, jsize, jboolean *);
467   void          (*GetByteArrayRegion)      (JNIEnv *, jbooleanArray,
468                                             jsize, jsize, jboolean *);
469   void          (*GetCharArrayRegion)      (JNIEnv *, jbooleanArray,
470                                             jsize, jsize, jboolean *);
471   void          (*GetShortArrayRegion)     (JNIEnv *, jbooleanArray,
472                                             jsize, jsize, jboolean *);
473   void          (*GetIntArrayRegion)       (JNIEnv *, jbooleanArray,
474                                             jsize, jsize, jboolean *);
475   void          (*GetLongArrayRegion)      (JNIEnv *, jbooleanArray,
476                                             jsize, jsize, jboolean *);
477   void          (*GetFloatArrayRegion)     (JNIEnv *, jbooleanArray,
478                                             jsize, jsize, jboolean *);
479   void          (*GetDoubleArrayRegion)    (JNIEnv *, jbooleanArray,
480                                             jsize, jsize, jboolean *);
481
482   void          (*SetBooleanArrayRegion)   (JNIEnv *, jbooleanArray,
483                                             jsize, jsize, jboolean *);
484   void          (*SetByteArrayRegion)      (JNIEnv *, jbooleanArray,
485                                             jsize, jsize, jboolean *);
486   void          (*SetCharArrayRegion)      (JNIEnv *, jbooleanArray,
487                                             jsize, jsize, jboolean *);
488   void          (*SetShortArrayRegion)     (JNIEnv *, jbooleanArray,
489                                             jsize, jsize, jboolean *);
490   void          (*SetIntArrayRegion)       (JNIEnv *, jbooleanArray,
491                                             jsize, jsize, jboolean *);
492   void          (*SetLongArrayRegion)      (JNIEnv *, jbooleanArray,
493                                             jsize, jsize, jboolean *);
494   void          (*SetFloatArrayRegion)     (JNIEnv *, jbooleanArray,
495                                             jsize, jsize, jboolean *);
496   void          (*SetDoubleArrayRegion)    (JNIEnv *, jbooleanArray,
497                                             jsize, jsize, jboolean *);
498
499   jint     (*RegisterNatives)              (JNIEnv *, jclass,
500                                             const JNINativeMethod *, jint);
501   jint     (*UnregisterNatives)            (JNIEnv *, jclass);
502   jint     (*MonitorEnter)                 (JNIEnv *, jobject);
503   jint     (*MonitorExit)                  (JNIEnv *, jobject);
504   jint     (*GetJavaVM)                    (JNIEnv *, JavaVM **);
505
506   void     (*GetStringRegion)              (JNIEnv *, jstring, jsize,
507                                             jsize, jchar *);
508   void     (*GetStringUTFRegion)           (JNIEnv *, jstring, jsize,
509                                             jsize, char *);
510
511   void * (*GetPrimitiveArrayCritical)      (JNIEnv *, jarray, jboolean *);
512   void   (*ReleasePrimitiveArrayCritical)  (JNIEnv *, jarray, void *, jint);
513
514   const jchar * (*GetStringCritical)       (JNIEnv *, jstring, jboolean *);
515   void          (*ReleaseStringCritical)   (JNIEnv *, jstring, const jchar *);
516
517   jweak  (*NewWeakGlobalRef)               (JNIEnv *, jobject);
518   void   (*DeleteWeakGlobalRef)            (JNIEnv *, jweak);
519
520   jboolean      (*ExceptionCheck)          (JNIEnv *);
521 };
522
523 #ifdef __cplusplus
524
525 class _Jv_JNIEnv
526 {
527 public:
528   /* The method table.  */
529   struct JNINativeInterface *p;
530
531   /* FIXME: this is really ugly.  */
532 #ifndef __GCJ_JNI_IMPL__
533 private:
534 #endif
535   /* The current exception.  */
536   jthrowable ex;
537
538   /* The class of the current native method.  */
539   jclass klass;
540
541 public:
542   jclass GetSuperclass (jclass cl)
543   { return p->GetSuperclass (this, cl); }
544
545   jsize GetStringLength (jstring str)
546   { return p->GetStringLength (this, str); }
547 };
548
549 #endif /* __cplusplus */
550
551 #endif /* __GCJ_JNI_H__ */