1 /* Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
3 This file is part of libgcj.
5 This software is copyrighted work licensed under the terms of the
6 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
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
18 #define _Jv_va_list va_list
22 /* This is wrong, because it pollutes the name-space too much! */
23 #include <gcj/javaprims.h>
25 typedef struct _Jv_JNIEnv JNIEnv;
28 #define JNI_FALSE false
30 #else /* __cplusplus */
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__)));
39 typedef double jdouble;
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;
58 typedef void *jfieldID;
59 typedef void *jmethodID;
61 typedef const struct JNINativeInterface *JNIEnv;
66 #endif /* __cplusplus */
68 /* FIXME: this is wrong. */
69 typedef jobject jweak;
71 /* Version numbers. */
72 #define JNI_VERSION_1_1 0x00010001
73 #define JNI_VERSION_1_2 0x00010002
75 /* Used when releasing array elements. */
92 typedef void * (*_Jv_func)(...);
94 /* This structure is used when registering native methods. */
99 void *fnPtr; /* Sigh. */
102 /* FIXME: this is just a placeholder. */
105 struct JNINativeInterface
112 jint (*GetVersion) (JNIEnv *);
113 jclass (*DefineClass) (JNIEnv *, jobject,
114 const jbyte *, jsize);
115 jclass (*FindClass) (JNIEnv *, const char *);
117 jmethodID (*FromReflectedMethod) (JNIEnv *, jobject);
118 jfieldID (*FromReflectedField) (JNIEnv *, jobject);
119 jobject (*ToReflectedMethod) (JNIEnv *, jclass, jmethodID,
122 jclass (*GetSuperclass) (JNIEnv *, jclass);
123 jboolean (*IsAssignableFrom) (JNIEnv *, jclass, jclass);
125 jobject (*ToReflectedField) (JNIEnv *, jclass, jfieldID,
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 *);
135 jint (*PushLocalFrame) (JNIEnv *, jint);
136 jobject (*PopLocalFrame) (JNIEnv *, jobject result);
138 jobject (*NewGlobalRef) (JNIEnv *, jobject);
139 void (*DeleteGlobalRef) (JNIEnv *, jobject);
140 void (*DeleteLocalRef) (JNIEnv *, jobject);;
141 jboolean (*IsSameObject) (JNIEnv *, jobject, jobject);
143 jobject (*NewLocalRef) (JNIEnv *, jobject);
144 jint (*EnsureLocalCapacity) (JNIEnv *, jint);
146 jobject (*AllocObject) (JNIEnv *, jclass);
147 jobject (*NewObject) (JNIEnv *, jclass, jmethodID, ...);
148 jobject (*NewObjectV) (JNIEnv *, jclass, jmethodID,
150 jobject (*NewObjectA) (JNIEnv *, jclass, jmethodID,
153 jclass (*GetObjectClass) (JNIEnv *, jobject);
154 jboolean (*IsInstanceOf) (JNIEnv *, jobject, jclass);
155 jmethodID (*GetMethodID) (JNIEnv *, jclass, const char *,
158 jobject (*CallObjectMethod) (JNIEnv *, jobject, jmethodID,
160 jobject (*CallObjectMethodV) (JNIEnv *, jobject, jmethodID,
162 jobject (*CallObjectMethodA) (JNIEnv *, jobject, jmethodID,
164 jboolean (*CallBooleanMethod) (JNIEnv *, jobject, jmethodID,
166 jboolean (*CallBooleanMethodV) (JNIEnv *, jobject, jmethodID,
168 jboolean (*CallBooleanMethodA) (JNIEnv *, jobject, jmethodID,
170 jbyte (*CallByteMethod) (JNIEnv *, jobject, jmethodID,
172 jbyte (*CallByteMethodV) (JNIEnv *, jobject, jmethodID,
174 jbyte (*CallByteMethodA) (JNIEnv *, jobject, jmethodID,
176 jchar (*CallCharMethod) (JNIEnv *, jobject, jmethodID,
178 jchar (*CallCharMethodV) (JNIEnv *, jobject, jmethodID,
180 jchar (*CallCharMethodA) (JNIEnv *, jobject, jmethodID,
182 jshort (*CallShortMethod) (JNIEnv *, jobject, jmethodID,
184 jshort (*CallShortMethodV) (JNIEnv *, jobject, jmethodID,
186 jshort (*CallShortMethodA) (JNIEnv *, jobject, jmethodID,
188 jint (*CallIntMethod) (JNIEnv *, jobject, jmethodID,
190 jint (*CallIntMethodV) (JNIEnv *, jobject, jmethodID,
192 jint (*CallIntMethodA) (JNIEnv *, jobject, jmethodID,
194 jlong (*CallLongMethod) (JNIEnv *, jobject, jmethodID,
196 jlong (*CallLongMethodV) (JNIEnv *, jobject, jmethodID,
198 jlong (*CallLongMethodA) (JNIEnv *, jobject, jmethodID,
200 jfloat (*CallFloatMethod) (JNIEnv *, jobject, jmethodID,
202 jfloat (*CallFloatMethodV) (JNIEnv *, jobject, jmethodID,
204 jfloat (*CallFloatMethodA) (JNIEnv *, jobject, jmethodID,
206 jdouble (*CallDoubleMethod) (JNIEnv *, jobject, jmethodID,
208 jdouble (*CallDoubleMethodV) (JNIEnv *, jobject, jmethodID,
210 jdouble (*CallDoubleMethodA) (JNIEnv *, jobject, jmethodID,
212 void (*CallVoidMethod) (JNIEnv *, jobject, jmethodID,
214 void (*CallVoidMethodV) (JNIEnv *, jobject, jmethodID,
216 void (*CallVoidMethodA) (JNIEnv *, jobject, jmethodID,
219 jobject (*CallNonvirtualObjectMethod) (JNIEnv *, jobject, jclass,
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,
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,
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,
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,
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,
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,
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,
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,
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,
275 void (*CallNonvirtualVoidMethodV) (JNIEnv *, jobject, jclass,
276 jmethodID, _Jv_va_list);
277 void (*CallNonvirtualVoidMethodA) (JNIEnv *, jobject, jclass,
278 jmethodID, jvalue *);
280 jfieldID (*GetFieldID) (JNIEnv *, jclass, const char *,
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);
293 void (*SetObjectField) (JNIEnv *, jobject,
295 void (*SetBooleanField) (JNIEnv *, jobject,
297 void (*SetByteField) (JNIEnv *, jobject,
299 void (*SetCharField) (JNIEnv *, jobject,
301 void (*SetShortField) (JNIEnv *, jobject,
303 void (*SetIntField) (JNIEnv *, jobject,
305 void (*SetLongField) (JNIEnv *, jobject,
307 void (*SetFloatField) (JNIEnv *, jobject,
309 void (*SetDoubleField) (JNIEnv *, jobject,
312 jmethodID (*GetStaticMethodID) (JNIEnv *, jclass, const char *,
315 jobject (*CallStaticObjectMethod) (JNIEnv *, jclass, jmethodID,
317 jobject (*CallStaticObjectMethodV) (JNIEnv *, jclass, jmethodID,
319 jobject (*CallStaticObjectMethodA) (JNIEnv *, jclass, jmethodID,
321 jboolean (*CallStaticBooleanMethod) (JNIEnv *, jclass, jmethodID,
323 jboolean (*CallStaticBooleanMethodV) (JNIEnv *, jclass, jmethodID,
325 jboolean (*CallStaticBooleanMethodA) (JNIEnv *, jclass, jmethodID,
327 jbyte (*CallStaticByteMethod) (JNIEnv *, jclass, jmethodID,
329 jbyte (*CallStaticByteMethodV) (JNIEnv *, jclass, jmethodID,
331 jbyte (*CallStaticByteMethodA) (JNIEnv *, jclass, jmethodID,
333 jchar (*CallStaticCharMethod) (JNIEnv *, jclass, jmethodID,
335 jchar (*CallStaticCharMethodV) (JNIEnv *, jclass, jmethodID,
337 jchar (*CallStaticCharMethodA) (JNIEnv *, jclass, jmethodID,
339 jshort (*CallStaticShortMethod) (JNIEnv *, jclass, jmethodID,
341 jshort (*CallStaticShortMethodV) (JNIEnv *, jclass, jmethodID,
343 jshort (*CallStaticShortMethodA) (JNIEnv *, jclass, jmethodID,
345 jint (*CallStaticIntMethod) (JNIEnv *, jclass, jmethodID,
347 jint (*CallStaticIntMethodV) (JNIEnv *, jclass, jmethodID,
349 jint (*CallStaticIntMethodA) (JNIEnv *, jclass, jmethodID,
351 jlong (*CallStaticLongMethod) (JNIEnv *, jclass, jmethodID,
353 jlong (*CallStaticLongMethodV) (JNIEnv *, jclass, jmethodID,
355 jlong (*CallStaticLongMethodA) (JNIEnv *, jclass, jmethodID,
357 jfloat (*CallStaticFloatMethod) (JNIEnv *, jclass, jmethodID,
359 jfloat (*CallStaticFloatMethodV) (JNIEnv *, jclass, jmethodID,
361 jfloat (*CallStaticFloatMethodA) (JNIEnv *, jclass, jmethodID,
363 jdouble (*CallStaticDoubleMethod) (JNIEnv *, jclass, jmethodID,
365 jdouble (*CallStaticDoubleMethodV) (JNIEnv *, jclass, jmethodID,
367 jdouble (*CallStaticDoubleMethodA) (JNIEnv *, jclass, jmethodID,
369 void (*CallStaticVoidMethod) (JNIEnv *, jclass, jmethodID,
371 void (*CallStaticVoidMethodV) (JNIEnv *, jclass, jmethodID,
373 void (*CallStaticVoidMethodA) (JNIEnv *, jclass, jmethodID,
376 jfieldID (*GetStaticFieldID) (JNIEnv *, jclass, const char *,
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);
389 void (*SetStaticObjectField) (JNIEnv *, jclass,
391 void (*SetStaticBooleanField) (JNIEnv *, jclass,
393 void (*SetStaticByteField) (JNIEnv *, jclass,
395 void (*SetStaticCharField) (JNIEnv *, jclass,
397 void (*SetStaticShortField) (JNIEnv *, jclass,
399 void (*SetStaticIntField) (JNIEnv *, jclass,
401 void (*SetStaticLongField) (JNIEnv *, jclass,
403 void (*SetStaticFloatField) (JNIEnv *, jclass,
405 void (*SetStaticDoubleField) (JNIEnv *, jclass,
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,
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);
431 jboolean * (*GetBooleanArrayElements) (JNIEnv *, jbooleanArray,
433 jbyte * (*GetByteArrayElements) (JNIEnv *, jbyteArray,
435 jchar * (*GetCharArrayElements) (JNIEnv *, jcharArray,
437 jshort * (*GetShortArrayElements) (JNIEnv *, jshortArray,
439 jint * (*GetIntArrayElements) (JNIEnv *, jintArray,
441 jlong * (*GetLongArrayElements) (JNIEnv *, jlongArray,
443 jfloat * (*GetFloatArrayElements) (JNIEnv *, jfloatArray,
445 jdouble * (*GetDoubleArrayElements) (JNIEnv *, jdoubleArray,
448 void (*ReleaseBooleanArrayElements) (JNIEnv *, jbooleanArray,
450 void (*ReleaseByteArrayElements) (JNIEnv *, jbyteArray,
452 void (*ReleaseCharArrayElements) (JNIEnv *, jcharArray,
454 void (*ReleaseShortArrayElements) (JNIEnv *, jshortArray,
456 void (*ReleaseIntArrayElements) (JNIEnv *, jintArray,
458 void (*ReleaseLongArrayElements) (JNIEnv *, jlongArray,
460 void (*ReleaseFloatArrayElements) (JNIEnv *, jfloatArray,
462 void (*ReleaseDoubleArrayElements) (JNIEnv *, jdoubleArray,
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 *);
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 *);
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 **);
506 void (*GetStringRegion) (JNIEnv *, jstring, jsize,
508 void (*GetStringUTFRegion) (JNIEnv *, jstring, jsize,
511 void * (*GetPrimitiveArrayCritical) (JNIEnv *, jarray, jboolean *);
512 void (*ReleasePrimitiveArrayCritical) (JNIEnv *, jarray, void *, jint);
514 const jchar * (*GetStringCritical) (JNIEnv *, jstring, jboolean *);
515 void (*ReleaseStringCritical) (JNIEnv *, jstring, const jchar *);
517 jweak (*NewWeakGlobalRef) (JNIEnv *, jobject);
518 void (*DeleteWeakGlobalRef) (JNIEnv *, jweak);
520 jboolean (*ExceptionCheck) (JNIEnv *);
528 /* The method table. */
529 struct JNINativeInterface *p;
531 /* FIXME: this is really ugly. */
532 #ifndef __GCJ_JNI_IMPL__
535 /* The current exception. */
538 /* The class of the current native method. */
542 jclass GetSuperclass (jclass cl)
543 { return p->GetSuperclass (this, cl); }
545 jsize GetStringLength (jstring str)
546 { return p->GetStringLength (this, str); }
549 #endif /* __cplusplus */
551 #endif /* __GCJ_JNI_H__ */