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