1517bfc4367efd879cb9928974797af1b2cc1e0c
[cacao.git] / src / native / jni.h
1 /* native/jni.h - JNI types and data structures
2
3    Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Reinhard Grafl
28             Roman Obermaisser
29
30    Changes: Christian Thalinger
31
32    $Id: jni.h 4331 2006-01-20 14:49:53Z twisti $
33
34 */
35
36
37 #ifndef _JNI_H
38 #define _JNI_H
39
40 #include <stdio.h>
41 #include <stdarg.h>
42
43 #include "vm/types.h"
44
45 #include "vm/field.h"
46 #include "vm/global.h"
47 #include "vm/method.h"
48
49
50 /* JNI versions */
51
52 #define JNI_VERSION_1_1    0x00010001
53 #define JNI_VERSION_1_2    0x00010002
54 #define JNI_VERSION_1_4    0x00010004
55
56 #define JNIEXPORT
57 #define JNICALL
58
59
60 /* JNI-Boolean */
61
62 #define JNI_FALSE        0
63 #define JNI_TRUE         1
64
65
66 /* Error codes */
67
68 #define JNI_OK           0
69 #define JNI_ERR          (-1)
70 #define JNI_EDETACHED    (-2)              /* thread detached from the VM */
71 #define JNI_EVERSION     (-3)              /* JNI version error */
72
73
74 /* Release<PrimitiveType>ArrayElements modes */
75
76 #define JNI_COMMIT       1
77 #define JNI_ABORT        2
78
79
80 /* JNI datatypes */
81
82 #define jboolean        u1
83 #define jbyte           s1
84 #define jchar           u2
85 #define jshort          s2
86 #define jint            s4
87 #define jlong           s8
88 #define jfloat          float
89 #define jdouble         double
90
91 #define jobject         java_objectheader*
92 #define jclass          struct classinfo*
93 #define jthrowable      jobject
94 #define jweak           jobject
95 #define jarray          java_arrayheader*
96 #define jlongArray      java_longarray*
97 #define jbooleanArray   java_booleanarray*
98 #define jintArray       java_intarray*
99 #define jcharArray      java_chararray*
100 #define jbyteArray      java_bytearray*
101 #define jshortArray     java_shortarray*
102 #define jdoubleArray    java_doublearray*
103 #define jfloatArray     java_floatarray*
104 #define jobjectArray    java_objectarray*
105 #define jstring         jobject
106
107 #define jsize           jint
108 #define jfieldID        fieldinfo*
109 #define jmethodID       methodinfo*     
110
111
112 typedef union jvalue {
113     jboolean z;
114     jbyte    b;
115     jchar    c;
116     jshort   s;
117     jint     i;
118     jlong    j;
119     jfloat   f;
120     jdouble  d;
121     jobject  l;
122 } jvalue;
123
124
125 typedef struct JDK1_1InitArgs JDK1_1InitArgs;
126
127 struct JDK1_1InitArgs {
128         /* The first two fields were reserved in JDK 1.1, and
129            formally introduced in JDK 1.1.2. */
130         /* Java VM version */
131         jint version;
132
133         /* System properties. */
134         char **properties;
135
136         /* whether to check the Java source files are newer than
137          * compiled class files. */
138         jint checkSource;
139
140         /* maximum native stack size of Java-created threads. */
141         jint nativeStackSize;
142
143         /* maximum Java stack size. */
144         jint javaStackSize;
145
146         /* initial heap size. */
147         jint minHeapSize;
148
149         /* maximum heap size. */
150         jint maxHeapSize;
151
152         /* controls whether Java byte code should be verified:
153          * 0 -- none, 1 -- remotely loaded code, 2 -- all code. */ 
154         jint verifyMode;
155
156         /* the local directory path for class loading. */
157         const char *classpath;
158
159         /* a hook for a function that redirects all VM messages. */
160         jint (*vfprintf)(FILE *fp, const char *format,
161                                          va_list args);
162
163         /* a VM exit hook. */
164         void (*exit)(jint code);
165
166         /* a VM abort hook. */
167         void (*abort)();
168
169         /* whether to enable class GC. */
170         jint enableClassGC;
171
172         /* whether GC messages will appear. */
173         jint enableVerboseGC;
174
175         /* whether asynchronous GC is allowed. */
176         jint disableAsyncGC;
177
178         /* Three reserved fields. */
179         jint reserved0;
180         jint reserved1;
181         jint reserved2;
182 };
183
184
185 typedef struct JDK1_1AttachArgs {
186         /*
187          * JDK 1.1 does not need any arguments to attach a
188          * native thread. The padding is here to satisfy the C
189          * compiler which does not permit empty structures.
190          */
191         void *__padding;
192 } JDK1_1AttachArgs;
193
194
195 typedef struct JNIInvokeInterface *JavaVM;
196 /*  typedef struct _JavaVM *JavaVM; */
197
198 /*  struct _JavaVM { */
199 struct JNIInvokeInterface {
200    void *(*reserved0) ();
201    void *(*reserved1) ();
202    void *(*reserved2) ();
203    jint (*DestroyJavaVM) (JavaVM *);
204    jint (*AttachCurrentThread) (JavaVM *, void **, void *);
205    jint (*DetachCurrentThread) (JavaVM *);
206    jint (*GetEnv) (JavaVM *, void **, jint);
207    jint (*AttachCurrentThreadAsDaemon) (JavaVM *, void **, void *);
208 };
209
210
211 /* native method name, signature and function pointer for use in RegisterNatives */
212
213 typedef struct {
214     char *name;
215     char *signature;
216     void *fnPtr;
217 } JNINativeMethod;
218
219
220 /* 
221         JNI function table, contains functions for the following usages:        
222         
223         Version Information 
224         Class Operations 
225         Exceptions 
226         Global and Local References 
227         Object Operations 
228         Accessing Fields of Objects 
229         Calling Instance Methods 
230         Accessing Static Fields 
231         Calling Static Methods 
232         String Operations 
233         Array Operations 
234         Registering Native Methods 
235         Monitor Operations 
236         Java VM Interface 
237 */
238
239 typedef struct JNINativeInterface *JNIEnv;
240 /*  typedef struct JNI_Table *JNIEnv; */
241
242 /*  struct JNI_Table { */
243 struct JNINativeInterface {
244     /* reserverd for future JNI-functions */
245     void *unused0;
246     void *unused1;
247     void *unused2;
248     void *unused3;
249     
250     /* version information */
251     
252     jint (*GetVersion) (JNIEnv*);
253
254     /* class operations */
255
256     jclass (*DefineClass) (JNIEnv*, const char *name, jobject loader, const jbyte *buf, jsize len);
257     jclass (*FindClass) (JNIEnv*, const char *name);
258
259     jmethodID (*FromReflectedMethod) (JNIEnv*, jobject method);
260     jfieldID (*FromReflectedField) (JNIEnv*, jobject field);
261
262     jobject (*ToReflectedMethod) (JNIEnv*, jclass cls, jmethodID methodID, jboolean isStatic);
263
264     jclass (*GetSuperclass) (JNIEnv*, jclass sub);
265     jboolean (*IsAssignableFrom) (JNIEnv*, jclass sub, jclass sup);
266
267     jobject (*ToReflectedField) (JNIEnv*, jclass cls, jfieldID fieldID, jboolean isStatic);
268
269     /* exceptions */ 
270
271     jint (*Throw) (JNIEnv*, jthrowable obj);
272     jint (*ThrowNew) (JNIEnv*, jclass clazz, const char *msg);
273     jthrowable (*ExceptionOccurred) (JNIEnv*);
274     void (*ExceptionDescribe) (JNIEnv*);
275     void (*ExceptionClear) (JNIEnv*);
276     void (*FatalError) (JNIEnv*, const char *msg);
277
278     /* global and local references */
279
280     jint (*PushLocalFrame) (JNIEnv*, jint capacity);
281     jobject (*PopLocalFrame) (JNIEnv*, jobject result);
282     
283     jobject (*NewGlobalRef) (JNIEnv*, jobject lobj);
284     void (*DeleteGlobalRef) (JNIEnv*, jobject gref);
285     void (*DeleteLocalRef) (JNIEnv*, jobject obj);
286     jboolean (*IsSameObject) (JNIEnv*, jobject obj1, jobject obj2);
287     jobject (*NewLocalRef) (JNIEnv*, jobject ref);
288     jint (*EnsureLocalCapacity) (JNIEnv*, jint capacity);
289
290     /* object operations */ 
291
292     jobject (*AllocObject) (JNIEnv*, jclass clazz);
293     jobject (*NewObject) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
294     jobject (*NewObjectV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
295     jobject (*NewObjectA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
296
297     jclass (*GetObjectClass) (JNIEnv*, jobject obj);
298     jboolean (*IsInstanceOf) (JNIEnv*, jobject obj, jclass clazz);
299
300     jmethodID (*GetMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
301
302     /* calling instance methods */ 
303
304     jobject (*CallObjectMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
305     jobject (*CallObjectMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
306     jobject (*CallObjectMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
307
308     jboolean (*CallBooleanMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
309     jboolean (*CallBooleanMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
310     jboolean (*CallBooleanMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
311
312     jbyte (*CallByteMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
313     jbyte (*CallByteMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
314     jbyte (*CallByteMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
315
316     jchar (*CallCharMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
317     jchar (*CallCharMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
318     jchar (*CallCharMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
319
320     jshort (*CallShortMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
321     jshort (*CallShortMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
322     jshort (*CallShortMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
323
324     jint (*CallIntMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
325     jint (*CallIntMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
326     jint (*CallIntMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
327
328     jlong (*CallLongMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
329     jlong (*CallLongMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
330     jlong (*CallLongMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
331
332     jfloat (*CallFloatMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
333     jfloat (*CallFloatMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
334     jfloat (*CallFloatMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
335
336     jdouble (*CallDoubleMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
337     jdouble (*CallDoubleMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
338     jdouble (*CallDoubleMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue *args);
339
340     void (*CallVoidMethod) (JNIEnv*, jobject obj, jmethodID methodID, ...);
341     void (*CallVoidMethodV) (JNIEnv*, jobject obj, jmethodID methodID, va_list args);
342     void (*CallVoidMethodA) (JNIEnv*, jobject obj, jmethodID methodID, jvalue * args);
343
344     jobject (*CallNonvirtualObjectMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
345     jobject (*CallNonvirtualObjectMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
346     jobject (*CallNonvirtualObjectMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
347
348     jboolean (*CallNonvirtualBooleanMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
349     jboolean (*CallNonvirtualBooleanMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
350     jboolean (*CallNonvirtualBooleanMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
351
352     jbyte (*CallNonvirtualByteMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
353     jbyte (*CallNonvirtualByteMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
354     jbyte (*CallNonvirtualByteMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
355
356     jchar (*CallNonvirtualCharMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
357     jchar (*CallNonvirtualCharMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
358     jchar (*CallNonvirtualCharMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
359
360     jshort (*CallNonvirtualShortMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
361     jshort (*CallNonvirtualShortMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
362     jshort (*CallNonvirtualShortMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
363
364     jint (*CallNonvirtualIntMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
365     jint (*CallNonvirtualIntMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
366     jint (*CallNonvirtualIntMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
367
368     jlong (*CallNonvirtualLongMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
369     jlong (*CallNonvirtualLongMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
370     jlong (*CallNonvirtualLongMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
371
372     jfloat (*CallNonvirtualFloatMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
373     jfloat (*CallNonvirtualFloatMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
374     jfloat (*CallNonvirtualFloatMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
375
376     jdouble (*CallNonvirtualDoubleMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
377     jdouble (*CallNonvirtualDoubleMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
378     jdouble (*CallNonvirtualDoubleMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue *args);
379
380     void (*CallNonvirtualVoidMethod) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, ...);
381     void (*CallNonvirtualVoidMethodV) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, va_list args);
382     void (*CallNonvirtualVoidMethodA) (JNIEnv*, jobject obj, jclass clazz, jmethodID methodID, jvalue * args);
383
384     /* accessing fields */
385
386     jfieldID (*GetFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
387
388     jobject (*GetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID);
389     jboolean (*GetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID);
390     jbyte (*GetByteField) (JNIEnv*, jobject obj, jfieldID fieldID);
391     jchar (*GetCharField) (JNIEnv*, jobject obj, jfieldID fieldID);
392     jshort (*GetShortField) (JNIEnv*, jobject obj, jfieldID fieldID);
393     jint (*GetIntField) (JNIEnv*, jobject obj, jfieldID fieldID);
394     jlong (*GetLongField) (JNIEnv*, jobject obj, jfieldID fieldID);
395     jfloat (*GetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID);
396     jdouble (*GetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID);
397
398     void (*SetObjectField) (JNIEnv*, jobject obj, jfieldID fieldID, jobject val);
399     void (*SetBooleanField) (JNIEnv*, jobject obj, jfieldID fieldID, jboolean val);
400     void (*SetByteField) (JNIEnv*, jobject obj, jfieldID fieldID, jbyte val);
401     void (*SetCharField) (JNIEnv*, jobject obj, jfieldID fieldID, jchar val);
402     void (*SetShortField) (JNIEnv*, jobject obj, jfieldID fieldID, jshort val);
403     void (*SetIntField) (JNIEnv*, jobject obj, jfieldID fieldID, jint val);
404     void (*SetLongField) (JNIEnv*, jobject obj, jfieldID fieldID, jlong val);
405     void (*SetFloatField) (JNIEnv*, jobject obj, jfieldID fieldID, jfloat val);
406     void (*SetDoubleField) (JNIEnv*, jobject obj, jfieldID fieldID, jdouble val);
407
408     /* calling static methods */ 
409     
410     jmethodID (*GetStaticMethodID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
411
412     jobject (*CallStaticObjectMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
413     jobject (*CallStaticObjectMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
414     jobject (*CallStaticObjectMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
415
416     jboolean (*CallStaticBooleanMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
417     jboolean (*CallStaticBooleanMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
418     jboolean (*CallStaticBooleanMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
419
420     jbyte (*CallStaticByteMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
421     jbyte (*CallStaticByteMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
422     jbyte (*CallStaticByteMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
423
424     jchar (*CallStaticCharMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
425     jchar (*CallStaticCharMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
426     jchar (*CallStaticCharMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
427
428     jshort (*CallStaticShortMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
429     jshort (*CallStaticShortMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
430     jshort (*CallStaticShortMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
431
432     jint (*CallStaticIntMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
433     jint (*CallStaticIntMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
434     jint (*CallStaticIntMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
435
436     jlong (*CallStaticLongMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
437     jlong (*CallStaticLongMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
438     jlong (*CallStaticLongMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
439
440     jfloat (*CallStaticFloatMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
441     jfloat (*CallStaticFloatMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
442     jfloat (*CallStaticFloatMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
443
444     jdouble (*CallStaticDoubleMethod) (JNIEnv*, jclass clazz, jmethodID methodID, ...);
445     jdouble (*CallStaticDoubleMethodV) (JNIEnv*, jclass clazz, jmethodID methodID, va_list args);
446     jdouble (*CallStaticDoubleMethodA) (JNIEnv*, jclass clazz, jmethodID methodID, jvalue *args);
447
448     void (*CallStaticVoidMethod) (JNIEnv*, jclass cls, jmethodID methodID, ...);
449     void (*CallStaticVoidMethodV) (JNIEnv*, jclass cls, jmethodID methodID, va_list args);
450     void (*CallStaticVoidMethodA) (JNIEnv*, jclass cls, jmethodID methodID, jvalue * args);
451
452     /* accessing static fields */
453
454     jfieldID (*GetStaticFieldID) (JNIEnv*, jclass clazz, const char *name, const char *sig);
455     jobject (*GetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID);
456     jboolean (*GetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID);
457     jbyte (*GetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID);
458     jchar (*GetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID);
459     jshort (*GetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID);
460     jint (*GetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID);
461     jlong (*GetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID);
462     jfloat (*GetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID);
463     jdouble (*GetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID);
464
465     void (*SetStaticObjectField) (JNIEnv*, jclass clazz, jfieldID fieldID, jobject value);
466     void (*SetStaticBooleanField) (JNIEnv*, jclass clazz, jfieldID fieldID, jboolean value);
467     void (*SetStaticByteField) (JNIEnv*, jclass clazz, jfieldID fieldID, jbyte value);
468     void (*SetStaticCharField) (JNIEnv*, jclass clazz, jfieldID fieldID, jchar value);
469     void (*SetStaticShortField) (JNIEnv*, jclass clazz, jfieldID fieldID, jshort value);
470     void (*SetStaticIntField) (JNIEnv*, jclass clazz, jfieldID fieldID, jint value);
471     void (*SetStaticLongField) (JNIEnv*, jclass clazz, jfieldID fieldID, jlong value);
472     void (*SetStaticFloatField) (JNIEnv*, jclass clazz, jfieldID fieldID, jfloat value);
473     void (*SetStaticDoubleField) (JNIEnv*, jclass clazz, jfieldID fieldID, jdouble value);
474
475     /* string operations */ 
476
477     jstring (*NewString) (JNIEnv*, const jchar *unicode, jsize len);
478     jsize (*GetStringLength) (JNIEnv*, jstring str);
479     const jchar *(*GetStringChars) (JNIEnv*, jstring str, jboolean *isCopy);
480     void (*ReleaseStringChars) (JNIEnv*, jstring str, const jchar *chars);
481
482     jstring (*NewStringUTF) (JNIEnv*, const char *bytes);
483     jsize (*GetStringUTFLength) (JNIEnv*, jstring str);
484     const char* (*GetStringUTFChars) (JNIEnv*, jstring str, jboolean *isCopy);
485     void (*ReleaseStringUTFChars) (JNIEnv*, jstring str, const char* chars);
486
487     /* array operations */
488
489     jsize (*GetArrayLength) (JNIEnv*, jarray array);
490
491     jobjectArray (*NewObjectArray) (JNIEnv*, jsize len, jclass clazz, jobject init);
492     jobject (*GetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index);
493     void (*SetObjectArrayElement) (JNIEnv*, jobjectArray array, jsize index, jobject val);
494
495     jbooleanArray (*NewBooleanArray) (JNIEnv*, jsize len);
496     jbyteArray (*NewByteArray) (JNIEnv*, jsize len);
497     jcharArray (*NewCharArray) (JNIEnv*, jsize len);
498     jshortArray (*NewShortArray) (JNIEnv*, jsize len);
499     jintArray (*NewIntArray) (JNIEnv*, jsize len);
500     jlongArray (*NewLongArray) (JNIEnv*, jsize len);
501     jfloatArray (*NewFloatArray) (JNIEnv*, jsize len);
502     jdoubleArray (*NewDoubleArray) (JNIEnv*, jsize len);
503
504     jboolean * (*GetBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *isCopy);
505     jbyte * (*GetByteArrayElements) (JNIEnv*, jbyteArray array, jboolean *isCopy);
506     jchar * (*GetCharArrayElements) (JNIEnv*, jcharArray array, jboolean *isCopy);
507     jshort * (*GetShortArrayElements) (JNIEnv*, jshortArray array, jboolean *isCopy);
508     jint * (*GetIntArrayElements) (JNIEnv*, jintArray array, jboolean *isCopy);
509     jlong * (*GetLongArrayElements) (JNIEnv*, jlongArray array, jboolean *isCopy);
510     jfloat * (*GetFloatArrayElements) (JNIEnv*, jfloatArray array, jboolean *isCopy);
511     jdouble * (*GetDoubleArrayElements) (JNIEnv*, jdoubleArray array, jboolean *isCopy);
512
513     void (*ReleaseBooleanArrayElements) (JNIEnv*, jbooleanArray array, jboolean *elems, jint mode);
514     void (*ReleaseByteArrayElements) (JNIEnv*, jbyteArray array, jbyte *elems, jint mode);
515     void (*ReleaseCharArrayElements) (JNIEnv*, jcharArray array, jchar *elems, jint mode);
516     void (*ReleaseShortArrayElements) (JNIEnv*, jshortArray array, jshort *elems, jint mode);
517     void (*ReleaseIntArrayElements) (JNIEnv*, jintArray array, jint *elems, jint mode);
518     void (*ReleaseLongArrayElements) (JNIEnv*, jlongArray array, jlong *elems, jint mode);
519     void (*ReleaseFloatArrayElements) (JNIEnv*, jfloatArray array, jfloat *elems, jint mode);
520     void (*ReleaseDoubleArrayElements) (JNIEnv*, jdoubleArray array, jdouble *elems, jint mode);
521
522     void (*GetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
523     void (*GetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
524     void (*GetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
525     void (*GetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
526     void (*GetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
527     void (*GetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
528     void (*GetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
529     void (*GetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
530
531     void (*SetBooleanArrayRegion) (JNIEnv*, jbooleanArray array, jsize start, jsize l, jboolean *buf);
532     void (*SetByteArrayRegion) (JNIEnv*, jbyteArray array, jsize start, jsize len, jbyte *buf);
533     void (*SetCharArrayRegion) (JNIEnv*, jcharArray array, jsize start, jsize len, jchar *buf);
534     void (*SetShortArrayRegion) (JNIEnv*, jshortArray array, jsize start, jsize len, jshort *buf);
535     void (*SetIntArrayRegion) (JNIEnv*, jintArray array, jsize start, jsize len, jint *buf);
536     void (*SetLongArrayRegion) (JNIEnv*, jlongArray array, jsize start, jsize len, jlong *buf);
537     void (*SetFloatArrayRegion) (JNIEnv*, jfloatArray array, jsize start, jsize len, jfloat *buf);
538     void (*SetDoubleArrayRegion) (JNIEnv*, jdoubleArray array, jsize start, jsize len, jdouble *buf);
539
540     /* registering native methods */
541
542     jint (*RegisterNatives) (JNIEnv*, jclass clazz, const JNINativeMethod *methods, jint nMethods);
543     jint (*UnregisterNatives) (JNIEnv*, jclass clazz);
544
545     /* monitor operations */
546
547     jint (*MonitorEnter) (JNIEnv*, jobject obj);
548     jint (*MonitorExit) (JNIEnv*, jobject obj);
549
550     /* JavaVM interface */
551
552     jint (*GetJavaVM) (JNIEnv*, JavaVM **vm);
553
554         /* new JNI 1.2 functions */
555
556     void (*GetStringRegion) (JNIEnv*, jstring str, jsize start, jsize len, jchar *buf);
557     void (*GetStringUTFRegion) (JNIEnv*, jstring str, jsize start, jsize len, char *buf);
558
559     void * (*GetPrimitiveArrayCritical) (JNIEnv*, jarray array, jboolean *isCopy);
560     void (*ReleasePrimitiveArrayCritical) (JNIEnv*, jarray array, void *carray, jint mode);
561
562     const jchar * (*GetStringCritical) (JNIEnv*, jstring string, jboolean *isCopy);
563     void (*ReleaseStringCritical) (JNIEnv*, jstring string, const jchar *cstring);
564
565     jweak (*NewWeakGlobalRef) (JNIEnv*, jobject obj);
566     void (*DeleteWeakGlobalRef) (JNIEnv*, jweak ref);
567
568     jboolean (*ExceptionCheck) (JNIEnv*);
569
570         /* new JNI 1.4 functions */
571
572         jobject (*NewDirectByteBuffer) (JNIEnv *env, void* address, jlong capacity);
573         void* (*GetDirectBufferAddress) (JNIEnv *env, jobject buf);
574         jlong (*GetDirectBufferCapacity) (JNIEnv *env, jobject buf);
575 };
576
577
578 /* function prototypes ********************************************************/
579
580 jint JNI_GetDefaultJavaVMInitArgs(void *vm_args);
581 jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs);
582 jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args);
583
584 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig);
585
586 jobject GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID);
587 jboolean GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID);
588 jbyte GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID);
589 jchar GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID);
590 jshort GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID);
591 jint GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID);
592 jlong GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID);
593 jfloat GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID);
594 jdouble GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID);
595
596 void SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID, jobject val);
597 void SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val);
598 void SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val);
599 void SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID, jchar val);
600 void SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID, jshort val);
601 void SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint val);
602 void SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID, jlong val);
603 void SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val);
604 void SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val);
605
606
607 /* CACAO related stuff ********************************************************/
608
609 /* local reference table ******************************************************/
610
611 #define LOCALREFTABLE_CAPACITY    16
612
613 typedef struct localref_table localref_table;
614
615 /* localref_table **************************************************************
616
617    ATTENTION: keep this structure a multiple of 8-bytes!!! This is
618    essential for the native stub on 64-bit architectures.
619
620 *******************************************************************************/
621
622 struct localref_table {
623         s4                 capacity;        /* table size                         */
624         s4                 used;            /* currently used references          */
625         s4                 localframes;     /* number of current frames           */
626         s4                 PADDING;         /* 8-byte padding                     */
627         localref_table    *prev;            /* link to prev table (LocalFrame)    */
628         java_objectheader *refs[LOCALREFTABLE_CAPACITY]; /* references            */
629 };
630
631 #if defined(USE_THREADS)
632 #define LOCALREFTABLE    (THREADINFO->_localref_table)
633 #else
634 extern localref_table *_no_threads_localref_table;
635
636 #define LOCALREFTABLE    (_no_threads_localref_table)
637 #endif
638
639
640 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
641 #define getField(obj,typ,var)     *((typ*) ((long int) obj + (long int) var->offset))
642 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
643
644 /* initialize JNI subsystem */
645 bool jni_init(void);
646
647 jobject *_Jv_jni_invokeNative(methodinfo *m, jobject obj,
648                                                           java_objectarray *params);
649
650 extern void* ptr_env;
651 extern struct JNINativeInterface JNI_JNIEnvTable;
652
653 #endif /* _JNI_H */
654
655
656 /*
657  * These are local overrides for various environment variables in Emacs.
658  * Please do not remove this and leave it at the end of the file, where
659  * Emacs will automagically detect them.
660  * ---------------------------------------------------------------------
661  * Local variables:
662  * mode: c
663  * indent-tabs-mode: t
664  * c-basic-offset: 4
665  * tab-width: 4
666  * End:
667  */