1 /* src/native/jni.c - implementation of the Java Native Interface functions
3 Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
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.
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA
25 $Id: jni.c 7464 2007-03-06 00:26:31Z edwin $
37 #include "mm/gc-common.h"
38 #include "mm/memory.h"
39 #include "native/jni.h"
40 #include "native/native.h"
42 #if defined(ENABLE_JAVASE)
43 # if defined(WITH_CLASSPATH_GNU)
44 # include "native/include/gnu_classpath_Pointer.h"
46 # if SIZEOF_VOID_P == 8
47 # include "native/include/gnu_classpath_Pointer64.h"
49 # include "native/include/gnu_classpath_Pointer32.h"
54 #include "native/include/java_lang_Object.h"
55 #include "native/include/java_lang_Byte.h"
56 #include "native/include/java_lang_Character.h"
57 #include "native/include/java_lang_Short.h"
58 #include "native/include/java_lang_Integer.h"
59 #include "native/include/java_lang_Boolean.h"
60 #include "native/include/java_lang_Long.h"
61 #include "native/include/java_lang_Float.h"
62 #include "native/include/java_lang_Double.h"
63 #include "native/include/java_lang_String.h"
64 #include "native/include/java_lang_Throwable.h"
66 #if defined(ENABLE_JAVASE)
67 # include "native/include/java_lang_ClassLoader.h"
69 # include "native/include/java_lang_reflect_Constructor.h"
70 # include "native/include/java_lang_reflect_Field.h"
71 # include "native/include/java_lang_reflect_Method.h"
73 # include "native/include/java_nio_Buffer.h"
74 # include "native/include/java_nio_DirectByteBufferImpl.h"
77 #if defined(ENABLE_JVMTI)
78 # include "native/jvmti/cacaodbg.h"
81 #include "native/vm/java_lang_Class.h"
83 #if defined(ENABLE_JAVASE)
84 # include "native/vm/java_lang_ClassLoader.h"
87 #if defined(ENABLE_THREADS)
88 # include "threads/native/lock.h"
89 # include "threads/native/threads.h"
91 # include "threads/none/lock.h"
92 # include "threads/none/threads.h"
95 #include "toolbox/logging.h"
97 #include "vm/builtin.h"
98 #include "vm/exceptions.h"
99 #include "vm/global.h"
100 #include "vm/initialize.h"
101 #include "vm/stringlocal.h"
104 #include "vm/jit/asmpart.h"
105 #include "vm/jit/jit.h"
106 #include "vm/jit/stacktrace.h"
108 #include "vmcore/loader.h"
109 #include "vmcore/options.h"
110 #include "vm/resolve.h"
111 #include "vmcore/statistics.h"
114 /* global variables ***********************************************************/
116 /* global reference table *****************************************************/
118 /* hashsize must be power of 2 */
120 #define HASHTABLE_GLOBAL_REF_SIZE 64 /* initial size of globalref-hash */
122 static hashtable *hashtable_global_ref; /* hashtable for globalrefs */
125 /* direct buffer stuff ********************************************************/
127 #if defined(ENABLE_JAVASE)
128 static classinfo *class_java_nio_Buffer;
129 static classinfo *class_java_nio_DirectByteBufferImpl;
130 static classinfo *class_java_nio_DirectByteBufferImpl_ReadWrite;
132 # if defined(WITH_CLASSPATH_GNU)
133 # if SIZEOF_VOID_P == 8
134 static classinfo *class_gnu_classpath_Pointer64;
136 static classinfo *class_gnu_classpath_Pointer32;
140 static methodinfo *dbbirw_init;
144 /* local reference table ******************************************************/
146 #if !defined(ENABLE_THREADS)
147 localref_table *_no_threads_localref_table;
151 /* accessing instance fields macros *******************************************/
153 #define SET_FIELD(o,type,f,value) \
154 *((type *) ((ptrint) (o) + (ptrint) ((fieldinfo *) (f))->offset)) = (type) (value)
156 #define GET_FIELD(o,type,f) \
157 *((type *) ((ptrint) (o) + (ptrint) ((fieldinfo *) (f))->offset))
160 /* some forward declarations **************************************************/
162 jobject _Jv_JNI_NewLocalRef(JNIEnv *env, jobject ref);
163 jint _Jv_JNI_EnsureLocalCapacity(JNIEnv* env, jint capacity);
166 /* jni_init ********************************************************************
168 Initialize the JNI subsystem.
170 *******************************************************************************/
174 /* create global ref hashtable */
176 hashtable_global_ref = NEW(hashtable);
178 hashtable_create(hashtable_global_ref, HASHTABLE_GLOBAL_REF_SIZE);
181 #if defined(ENABLE_JAVASE)
182 /* direct buffer stuff */
184 if (!(class_java_nio_Buffer =
185 load_class_bootstrap(utf_new_char("java/nio/Buffer"))) ||
186 !link_class(class_java_nio_Buffer))
189 if (!(class_java_nio_DirectByteBufferImpl =
190 load_class_bootstrap(utf_new_char("java/nio/DirectByteBufferImpl"))) ||
191 !link_class(class_java_nio_DirectByteBufferImpl))
194 if (!(class_java_nio_DirectByteBufferImpl_ReadWrite =
195 load_class_bootstrap(utf_new_char("java/nio/DirectByteBufferImpl$ReadWrite"))) ||
196 !link_class(class_java_nio_DirectByteBufferImpl_ReadWrite))
200 class_resolvemethod(class_java_nio_DirectByteBufferImpl_ReadWrite,
202 utf_new_char("(Ljava/lang/Object;Lgnu/classpath/Pointer;III)V"))))
205 # if defined(WITH_CLASSPATH_GNU)
206 # if SIZEOF_VOID_P == 8
207 if (!(class_gnu_classpath_Pointer64 =
208 load_class_bootstrap(utf_new_char("gnu/classpath/Pointer64"))) ||
209 !link_class(class_gnu_classpath_Pointer64))
212 if (!(class_gnu_classpath_Pointer32 =
213 load_class_bootstrap(utf_new_char("gnu/classpath/Pointer32"))) ||
214 !link_class(class_gnu_classpath_Pointer32))
218 #endif /* defined(ENABLE_JAVASE) */
224 /* jni_init_localref_table *****************************************************
226 Initializes the local references table of the current thread.
228 *******************************************************************************/
230 bool jni_init_localref_table(void)
234 lrt = GCNEW(localref_table);
239 lrt->capacity = LOCALREFTABLE_CAPACITY;
241 lrt->localframes = 1;
242 lrt->prev = LOCALREFTABLE;
244 /* clear the references array (memset is faster then a for-loop) */
246 MSET(lrt->refs, 0, java_objectheader*, LOCALREFTABLE_CAPACITY);
254 /* _Jv_jni_vmargs_from_objectarray *********************************************
258 *******************************************************************************/
260 static bool _Jv_jni_vmargs_from_objectarray(java_objectheader *o,
263 java_objectarray *params)
265 java_objectheader *param;
267 typedesc *paramtypes;
273 paramcount = descr->paramcount;
274 paramtypes = descr->paramtypes;
276 /* if method is non-static fill first block and skip `this' pointer */
282 vmargs[0].type = TYPE_ADR;
283 vmargs[0].data.l = (u8) (ptrint) o;
290 for (j = 0; j < paramcount; i++, j++, paramtypes++) {
291 switch (paramtypes->type) {
292 /* primitive types */
297 param = params->data[j];
302 /* internally used data type */
303 vmargs[i].type = paramtypes->type;
305 /* convert the value according to its declared type */
307 c = param->vftbl->class;
309 switch (paramtypes->decltype) {
310 case PRIMITIVETYPE_BOOLEAN:
311 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
312 value = (s8) ((java_lang_Boolean *) param)->value;
316 vmargs[i].data.l = value;
319 case PRIMITIVETYPE_BYTE:
320 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
321 value = (s8) ((java_lang_Byte *) param)->value;
325 vmargs[i].data.l = value;
328 case PRIMITIVETYPE_CHAR:
329 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
330 value = (s8) ((java_lang_Character *) param)->value;
334 vmargs[i].data.l = value;
337 case PRIMITIVETYPE_SHORT:
338 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
339 value = (s8) ((java_lang_Short *) param)->value;
340 else if (c == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
341 value = (s8) ((java_lang_Byte *) param)->value;
345 vmargs[i].data.l = value;
348 case PRIMITIVETYPE_INT:
349 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
350 value = (s8) ((java_lang_Integer *) param)->value;
351 else if (c == primitivetype_table[PRIMITIVETYPE_SHORT].class_wrap)
352 value = (s8) ((java_lang_Short *) param)->value;
353 else if (c == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
354 value = (s8) ((java_lang_Byte *) param)->value;
358 vmargs[i].data.l = value;
361 case PRIMITIVETYPE_LONG:
362 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
363 value = (s8) ((java_lang_Long *) param)->value;
364 else if (c == primitivetype_table[PRIMITIVETYPE_INT].class_wrap)
365 value = (s8) ((java_lang_Integer *) param)->value;
366 else if (c == primitivetype_table[PRIMITIVETYPE_SHORT].class_wrap)
367 value = (s8) ((java_lang_Short *) param)->value;
368 else if (c == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
369 value = (s8) ((java_lang_Byte *) param)->value;
373 vmargs[i].data.l = value;
376 case PRIMITIVETYPE_FLOAT:
377 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
378 vmargs[i].data.f = (jfloat) ((java_lang_Float *) param)->value;
383 case PRIMITIVETYPE_DOUBLE:
384 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
385 vmargs[i].data.d = (jdouble) ((java_lang_Double *) param)->value;
386 else if (c == primitivetype_table[PRIMITIVETYPE_FLOAT].class_wrap)
387 vmargs[i].data.f = (jfloat) ((java_lang_Float *) param)->value;
398 if (!resolve_class_from_typedesc(paramtypes, true, true, &c))
401 if (params->data[j] != 0) {
402 if (paramtypes->arraydim > 0) {
403 if (!builtin_arrayinstanceof(params->data[j], c))
407 if (!builtin_instanceof(params->data[j], c))
412 vmargs[i].type = TYPE_ADR;
413 vmargs[i].data.l = (u8) (ptrint) params->data[j];
422 /* *rettype = descr->returntype.decltype; */
427 exceptions_throw_illegalargumentexception();
432 /* _Jv_jni_CallObjectMethod ****************************************************
434 Internal function to call Java Object methods.
436 *******************************************************************************/
438 static java_objectheader *_Jv_jni_CallObjectMethod(java_objectheader *o,
440 methodinfo *m, va_list ap)
443 java_objectheader *ro;
445 STATISTICS(jniinvokation());
448 exceptions_throw_nullpointerexception();
452 /* Class initialization is done by the JIT compiler. This is ok
453 since a static method always belongs to the declaring class. */
455 if (m->flags & ACC_STATIC) {
456 /* For static methods we reset the object. */
461 /* for convenience */
466 /* For instance methods we make a virtual function table lookup. */
468 resm = method_vftbl_lookup(vftbl, m);
471 STATISTICS(jnicallXmethodnvokation());
473 ro = vm_call_method_valist(resm, o, ap);
479 /* _Jv_jni_CallObjectMethodA ***************************************************
481 Internal function to call Java Object methods.
483 *******************************************************************************/
485 static java_objectheader *_Jv_jni_CallObjectMethodA(java_objectheader *o,
487 methodinfo *m, jvalue *args)
490 java_objectheader *ro;
492 STATISTICS(jniinvokation());
495 exceptions_throw_nullpointerexception();
499 /* Class initialization is done by the JIT compiler. This is ok
500 since a static method always belongs to the declaring class. */
502 if (m->flags & ACC_STATIC) {
503 /* For static methods we reset the object. */
508 /* for convenience */
513 /* For instance methods we make a virtual function table lookup. */
515 resm = method_vftbl_lookup(vftbl, m);
518 STATISTICS(jnicallXmethodnvokation());
520 ro = vm_call_method_jvalue(resm, o, args);
526 /* _Jv_jni_CallIntMethod *******************************************************
528 Internal function to call Java integer class methods (boolean,
529 byte, char, short, int).
531 *******************************************************************************/
533 static jint _Jv_jni_CallIntMethod(java_objectheader *o, vftbl_t *vftbl,
534 methodinfo *m, va_list ap)
539 STATISTICS(jniinvokation());
542 exceptions_throw_nullpointerexception();
546 /* Class initialization is done by the JIT compiler. This is ok
547 since a static method always belongs to the declaring class. */
549 if (m->flags & ACC_STATIC) {
550 /* For static methods we reset the object. */
555 /* for convenience */
560 /* For instance methods we make a virtual function table lookup. */
562 resm = method_vftbl_lookup(vftbl, m);
565 STATISTICS(jnicallXmethodnvokation());
567 i = vm_call_method_int_valist(resm, o, ap);
573 /* _Jv_jni_CallIntMethodA ******************************************************
575 Internal function to call Java integer class methods (boolean,
576 byte, char, short, int).
578 *******************************************************************************/
580 static jint _Jv_jni_CallIntMethodA(java_objectheader *o, vftbl_t *vftbl,
581 methodinfo *m, jvalue *args)
586 STATISTICS(jniinvokation());
589 exceptions_throw_nullpointerexception();
593 /* Class initialization is done by the JIT compiler. This is ok
594 since a static method always belongs to the declaring class. */
596 if (m->flags & ACC_STATIC) {
597 /* For static methods we reset the object. */
602 /* for convenience */
607 /* For instance methods we make a virtual function table lookup. */
609 resm = method_vftbl_lookup(vftbl, m);
612 STATISTICS(jnicallXmethodnvokation());
614 i = vm_call_method_int_jvalue(resm, o, args);
620 /* _Jv_jni_CallLongMethod ******************************************************
622 Internal function to call Java long methods.
624 *******************************************************************************/
626 static jlong _Jv_jni_CallLongMethod(java_objectheader *o, vftbl_t *vftbl,
627 methodinfo *m, va_list ap)
632 STATISTICS(jniinvokation());
635 exceptions_throw_nullpointerexception();
639 /* Class initialization is done by the JIT compiler. This is ok
640 since a static method always belongs to the declaring class. */
642 if (m->flags & ACC_STATIC) {
643 /* For static methods we reset the object. */
648 /* for convenience */
653 /* For instance methods we make a virtual function table lookup. */
655 resm = method_vftbl_lookup(vftbl, m);
658 STATISTICS(jnicallXmethodnvokation());
660 l = vm_call_method_long_valist(resm, o, ap);
666 /* _Jv_jni_CallFloatMethod *****************************************************
668 Internal function to call Java float methods.
670 *******************************************************************************/
672 static jfloat _Jv_jni_CallFloatMethod(java_objectheader *o, vftbl_t *vftbl,
673 methodinfo *m, va_list ap)
678 /* Class initialization is done by the JIT compiler. This is ok
679 since a static method always belongs to the declaring class. */
681 if (m->flags & ACC_STATIC) {
682 /* For static methods we reset the object. */
687 /* for convenience */
692 /* For instance methods we make a virtual function table lookup. */
694 resm = method_vftbl_lookup(vftbl, m);
697 STATISTICS(jnicallXmethodnvokation());
699 f = vm_call_method_float_valist(resm, o, ap);
705 /* _Jv_jni_CallDoubleMethod ****************************************************
707 Internal function to call Java double methods.
709 *******************************************************************************/
711 static jdouble _Jv_jni_CallDoubleMethod(java_objectheader *o, vftbl_t *vftbl,
712 methodinfo *m, va_list ap)
717 /* Class initialization is done by the JIT compiler. This is ok
718 since a static method always belongs to the declaring class. */
720 if (m->flags & ACC_STATIC) {
721 /* For static methods we reset the object. */
726 /* for convenience */
731 /* For instance methods we make a virtual function table lookup. */
733 resm = method_vftbl_lookup(vftbl, m);
736 d = vm_call_method_double_valist(resm, o, ap);
742 /* _Jv_jni_CallVoidMethod ******************************************************
744 Internal function to call Java void methods.
746 *******************************************************************************/
748 static void _Jv_jni_CallVoidMethod(java_objectheader *o, vftbl_t *vftbl,
749 methodinfo *m, va_list ap)
754 exceptions_throw_nullpointerexception();
758 /* Class initialization is done by the JIT compiler. This is ok
759 since a static method always belongs to the declaring class. */
761 if (m->flags & ACC_STATIC) {
762 /* For static methods we reset the object. */
767 /* for convenience */
772 /* For instance methods we make a virtual function table lookup. */
774 resm = method_vftbl_lookup(vftbl, m);
777 STATISTICS(jnicallXmethodnvokation());
779 (void) vm_call_method_valist(resm, o, ap);
783 /* _Jv_jni_CallVoidMethodA *****************************************************
785 Internal function to call Java void methods.
787 *******************************************************************************/
789 static void _Jv_jni_CallVoidMethodA(java_objectheader *o, vftbl_t *vftbl,
790 methodinfo *m, jvalue *args)
795 exceptions_throw_nullpointerexception();
799 /* Class initialization is done by the JIT compiler. This is ok
800 since a static method always belongs to the declaring class. */
802 if (m->flags & ACC_STATIC) {
803 /* For static methods we reset the object. */
808 /* for convenience */
813 /* For instance methods we make a virtual function table lookup. */
815 resm = method_vftbl_lookup(vftbl, m);
818 STATISTICS(jnicallXmethodnvokation());
820 (void) vm_call_method_jvalue(resm, o, args);
824 /* _Jv_jni_invokeNative ********************************************************
826 Invoke a method on the given object with the given arguments.
828 For instance methods OBJ must be != NULL and the method is looked up
829 in the vftbl of the object.
831 For static methods, OBJ is ignored.
833 *******************************************************************************/
835 java_objectheader *_Jv_jni_invokeNative(methodinfo *m, java_objectheader *o,
836 java_objectarray *params)
840 java_objectheader *ro;
843 java_objectheader *xptr;
846 exceptions_throw_nullpointerexception();
850 argcount = m->parseddesc->paramcount;
851 paramcount = argcount;
853 /* if method is non-static, remove the `this' pointer */
855 if (!(m->flags & ACC_STATIC))
858 /* For instance methods the object has to be an instance of the
859 class the method belongs to. For static methods the obj
860 parameter is ignored. */
862 if (!(m->flags & ACC_STATIC) && o && (!builtin_instanceof(o, m->class))) {
863 exceptions_throw_illegalargumentexception();
867 /* check if we got the right number of arguments */
869 if (((params == NULL) && (paramcount != 0)) ||
870 (params && (params->header.size != paramcount)))
872 exceptions_throw_illegalargumentexception();
876 /* for instance methods we need an object */
878 if (!(m->flags & ACC_STATIC) && (o == NULL)) {
879 /* XXX not sure if that is the correct exception */
880 exceptions_throw_nullpointerexception();
884 /* for static methods, zero object to make subsequent code simpler */
885 if (m->flags & ACC_STATIC)
889 /* for instance methods we must do a vftbl lookup */
890 resm = method_vftbl_lookup(o->vftbl, m);
893 /* for static methods, just for convenience */
897 vmargs = MNEW(vm_arg, argcount);
899 if (!_Jv_jni_vmargs_from_objectarray(o, resm->parseddesc, vmargs, params))
902 switch (resm->parseddesc->returntype.decltype) {
904 (void) vm_call_method_vmarg(resm, argcount, vmargs);
909 case PRIMITIVETYPE_BOOLEAN: {
911 java_lang_Boolean *bo;
913 i = vm_call_method_int_vmarg(resm, argcount, vmargs);
915 ro = builtin_new(class_java_lang_Boolean);
917 /* setting the value of the object direct */
919 bo = (java_lang_Boolean *) ro;
924 case PRIMITIVETYPE_BYTE: {
928 i = vm_call_method_int_vmarg(resm, argcount, vmargs);
930 ro = builtin_new(class_java_lang_Byte);
932 /* setting the value of the object direct */
934 bo = (java_lang_Byte *) ro;
939 case PRIMITIVETYPE_CHAR: {
941 java_lang_Character *co;
943 i = vm_call_method_int_vmarg(resm, argcount, vmargs);
945 ro = builtin_new(class_java_lang_Character);
947 /* setting the value of the object direct */
949 co = (java_lang_Character *) ro;
954 case PRIMITIVETYPE_SHORT: {
958 i = vm_call_method_int_vmarg(resm, argcount, vmargs);
960 ro = builtin_new(class_java_lang_Short);
962 /* setting the value of the object direct */
964 so = (java_lang_Short *) ro;
969 case PRIMITIVETYPE_INT: {
971 java_lang_Integer *io;
973 i = vm_call_method_int_vmarg(resm, argcount, vmargs);
975 ro = builtin_new(class_java_lang_Integer);
977 /* setting the value of the object direct */
979 io = (java_lang_Integer *) ro;
984 case PRIMITIVETYPE_LONG: {
988 l = vm_call_method_long_vmarg(resm, argcount, vmargs);
990 ro = builtin_new(class_java_lang_Long);
992 /* setting the value of the object direct */
994 lo = (java_lang_Long *) ro;
999 case PRIMITIVETYPE_FLOAT: {
1001 java_lang_Float *fo;
1003 f = vm_call_method_float_vmarg(resm, argcount, vmargs);
1005 ro = builtin_new(class_java_lang_Float);
1007 /* setting the value of the object direct */
1009 fo = (java_lang_Float *) ro;
1014 case PRIMITIVETYPE_DOUBLE: {
1016 java_lang_Double *_do;
1018 d = vm_call_method_double_vmarg(resm, argcount, vmargs);
1020 ro = builtin_new(class_java_lang_Double);
1022 /* setting the value of the object direct */
1024 _do = (java_lang_Double *) ro;
1030 ro = vm_call_method_vmarg(resm, argcount, vmargs);
1034 /* if this happens the exception has already been set by
1035 fill_callblock_from_objectarray */
1037 MFREE(vmargs, vm_arg, argcount);
1042 MFREE(vmargs, vm_arg, argcount);
1044 xptr = exceptions_get_exception();
1047 /* clear exception pointer, we are calling JIT code again */
1049 exceptions_clear_exception();
1051 exceptions_throw_invocationtargetexception(xptr);
1058 /* GetVersion ******************************************************************
1060 Returns the major version number in the higher 16 bits and the
1061 minor version number in the lower 16 bits.
1063 *******************************************************************************/
1065 jint _Jv_JNI_GetVersion(JNIEnv *env)
1067 STATISTICS(jniinvokation());
1069 /* we support JNI 1.4 */
1071 return JNI_VERSION_1_4;
1075 /* Class Operations ***********************************************************/
1077 /* DefineClass *****************************************************************
1079 Loads a class from a buffer of raw class data. The buffer
1080 containing the raw class data is not referenced by the VM after the
1081 DefineClass call returns, and it may be discarded if desired.
1083 *******************************************************************************/
1085 jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
1086 const jbyte *buf, jsize bufLen)
1088 #if defined(ENABLE_JAVASE)
1089 java_lang_ClassLoader *cl;
1090 java_lang_String *s;
1094 STATISTICS(jniinvokation());
1096 cl = (java_lang_ClassLoader *) loader;
1097 s = javastring_new_from_utf_string(name);
1098 ba = (java_bytearray *) buf;
1100 c = (jclass) _Jv_java_lang_ClassLoader_defineClass(cl, s, ba, 0, bufLen,
1103 return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
1105 vm_abort("_Jv_JNI_DefineClass: not implemented in this configuration");
1107 /* keep compiler happy */
1114 /* FindClass *******************************************************************
1116 This function loads a locally-defined class. It searches the
1117 directories and zip files specified by the CLASSPATH environment
1118 variable for the class with the specified name.
1120 *******************************************************************************/
1122 jclass _Jv_JNI_FindClass(JNIEnv *env, const char *name)
1124 #if defined(ENABLE_JAVASE)
1129 STATISTICS(jniinvokation());
1131 u = utf_new_char_classname((char *) name);
1133 /* Check stacktrace for classloader, if one found use it,
1134 otherwise use the system classloader. */
1136 /* Quote from the JNI documentation:
1138 In the Java 2 Platform, FindClass locates the class loader
1139 associated with the current native method. If the native code
1140 belongs to a system class, no class loader will be
1141 involved. Otherwise, the proper class loader will be invoked to
1142 load and link the named class. When FindClass is called through
1143 the Invocation Interface, there is no current native method or
1144 its associated class loader. In that case, the result of
1145 ClassLoader.getBaseClassLoader is used." */
1147 cc = stacktrace_getCurrentClass();
1150 c = load_class_from_sysloader(u);
1152 c = load_class_from_classloader(u, cc->classloader);
1160 return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
1162 vm_abort("_Jv_JNI_FindClass: not implemented in this configuration");
1164 /* keep compiler happy */
1171 /* GetSuperclass ***************************************************************
1173 If clazz represents any class other than the class Object, then
1174 this function returns the object that represents the superclass of
1175 the class specified by clazz.
1177 *******************************************************************************/
1179 jclass _Jv_JNI_GetSuperclass(JNIEnv *env, jclass sub)
1183 STATISTICS(jniinvokation());
1185 c = ((classinfo *) sub)->super.cls;
1190 return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
1194 /* IsAssignableFrom ************************************************************
1196 Determines whether an object of sub can be safely cast to sup.
1198 *******************************************************************************/
1200 jboolean _Jv_JNI_IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
1202 java_lang_Class *csup;
1203 java_lang_Class *csub;
1205 csup = (java_lang_Class *) sup;
1206 csub = (java_lang_Class *) sub;
1208 STATISTICS(jniinvokation());
1210 return _Jv_java_lang_Class_isAssignableFrom(csup, csub);
1214 /* Throw ***********************************************************************
1216 Causes a java.lang.Throwable object to be thrown.
1218 *******************************************************************************/
1220 jint _Jv_JNI_Throw(JNIEnv *env, jthrowable obj)
1222 java_objectheader *o;
1224 STATISTICS(jniinvokation());
1226 o = (java_objectheader *) obj;
1228 exceptions_set_exception(o);
1234 /* ThrowNew ********************************************************************
1236 Constructs an exception object from the specified class with the
1237 message specified by message and causes that exception to be
1240 *******************************************************************************/
1242 jint _Jv_JNI_ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
1245 java_objectheader *o;
1246 java_objectheader *s;
1248 STATISTICS(jniinvokation());
1250 c = (classinfo *) clazz;
1251 s = javastring_new_from_utf_string(msg);
1253 /* instantiate exception object */
1255 o = native_new_and_init_string(c, s);
1260 exceptions_set_exception(o);
1266 /* ExceptionOccurred ***********************************************************
1268 Determines if an exception is being thrown. The exception stays
1269 being thrown until either the native code calls ExceptionClear(),
1270 or the Java code handles the exception.
1272 *******************************************************************************/
1274 jthrowable _Jv_JNI_ExceptionOccurred(JNIEnv *env)
1276 java_objectheader *o;
1278 STATISTICS(jniinvokation());
1280 o = exceptions_get_exception();
1282 return _Jv_JNI_NewLocalRef(env, (jthrowable) o);
1286 /* ExceptionDescribe ***********************************************************
1288 Prints an exception and a backtrace of the stack to a system
1289 error-reporting channel, such as stderr. This is a convenience
1290 routine provided for debugging.
1292 *******************************************************************************/
1294 void _Jv_JNI_ExceptionDescribe(JNIEnv *env)
1296 java_objectheader *o;
1299 STATISTICS(jniinvokation());
1301 o = exceptions_get_exception();
1304 /* clear exception, because we are calling jit code again */
1306 exceptions_clear_exception();
1308 /* get printStackTrace method from exception class */
1310 m = class_resolveclassmethod(o->vftbl->class,
1311 utf_printStackTrace,
1317 /* XXX what should we do? */
1320 /* print the stacktrace */
1322 (void) vm_call_method(m, o);
1327 /* ExceptionClear **************************************************************
1329 Clears any exception that is currently being thrown. If no
1330 exception is currently being thrown, this routine has no effect.
1332 *******************************************************************************/
1334 void _Jv_JNI_ExceptionClear(JNIEnv *env)
1336 STATISTICS(jniinvokation());
1338 exceptions_clear_exception();
1342 /* FatalError ******************************************************************
1344 Raises a fatal error and does not expect the VM to recover. This
1345 function does not return.
1347 *******************************************************************************/
1349 void _Jv_JNI_FatalError(JNIEnv *env, const char *msg)
1351 STATISTICS(jniinvokation());
1353 /* this seems to be the best way */
1359 /* PushLocalFrame **************************************************************
1361 Creates a new local reference frame, in which at least a given
1362 number of local references can be created.
1364 *******************************************************************************/
1366 jint _Jv_JNI_PushLocalFrame(JNIEnv* env, jint capacity)
1369 localref_table *lrt;
1370 localref_table *nlrt;
1372 STATISTICS(jniinvokation());
1377 /* Allocate new local reference table on Java heap. Calculate the
1378 additional memory we have to allocate. */
1380 if (capacity > LOCALREFTABLE_CAPACITY)
1381 additionalrefs = capacity - LOCALREFTABLE_CAPACITY;
1385 nlrt = GCMNEW(u1, sizeof(localref_table) + additionalrefs * SIZEOF_VOID_P);
1390 /* get current local reference table from thread */
1392 lrt = LOCALREFTABLE;
1394 /* Set up the new local reference table and add it to the local
1397 nlrt->capacity = capacity;
1399 nlrt->localframes = lrt->localframes + 1;
1402 /* store new local reference table in thread */
1404 LOCALREFTABLE = nlrt;
1410 /* PopLocalFrame ***************************************************************
1412 Pops off the current local reference frame, frees all the local
1413 references, and returns a local reference in the previous local
1414 reference frame for the given result object.
1416 *******************************************************************************/
1418 jobject _Jv_JNI_PopLocalFrame(JNIEnv* env, jobject result)
1420 localref_table *lrt;
1421 localref_table *plrt;
1424 STATISTICS(jniinvokation());
1426 /* get current local reference table from thread */
1428 lrt = LOCALREFTABLE;
1430 localframes = lrt->localframes;
1432 /* Don't delete the top local frame, as this one is allocated in
1433 the native stub on the stack and is freed automagically on
1436 if (localframes == 1)
1437 return _Jv_JNI_NewLocalRef(env, result);
1439 /* release all current local frames */
1441 for (; localframes >= 1; localframes--) {
1442 /* get previous frame */
1446 /* clear all reference entries */
1448 MSET(&lrt->refs[0], 0, java_objectheader*, lrt->capacity);
1452 /* set new local references table */
1457 /* store new local reference table in thread */
1459 LOCALREFTABLE = lrt;
1461 /* add local reference and return the value */
1463 return _Jv_JNI_NewLocalRef(env, result);
1467 /* DeleteLocalRef **************************************************************
1469 Deletes the local reference pointed to by localRef.
1471 *******************************************************************************/
1473 void _Jv_JNI_DeleteLocalRef(JNIEnv *env, jobject localRef)
1475 java_objectheader *o;
1476 localref_table *lrt;
1479 STATISTICS(jniinvokation());
1481 o = (java_objectheader *) localRef;
1483 /* get local reference table (thread specific) */
1485 lrt = LOCALREFTABLE;
1487 /* go through all local frames */
1489 for (; lrt != NULL; lrt = lrt->prev) {
1491 /* and try to remove the reference */
1493 for (i = 0; i < lrt->capacity; i++) {
1494 if (lrt->refs[i] == o) {
1495 lrt->refs[i] = NULL;
1503 /* this should not happen */
1505 /* if (opt_checkjni) */
1506 /* FatalError(env, "Bad global or local ref passed to JNI"); */
1507 log_text("JNI-DeleteLocalRef: Local ref passed to JNI not found");
1511 /* IsSameObject ****************************************************************
1513 Tests whether two references refer to the same Java object.
1515 *******************************************************************************/
1517 jboolean _Jv_JNI_IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
1519 STATISTICS(jniinvokation());
1528 /* NewLocalRef *****************************************************************
1530 Creates a new local reference that refers to the same object as ref.
1532 *******************************************************************************/
1534 jobject _Jv_JNI_NewLocalRef(JNIEnv *env, jobject ref)
1536 localref_table *lrt;
1539 STATISTICS(jniinvokation());
1544 /* get local reference table (thread specific) */
1546 lrt = LOCALREFTABLE;
1548 /* Check if we have space for the requested reference? No,
1549 allocate a new frame. This is actually not what the spec says,
1550 but for compatibility reasons... */
1552 if (lrt->used == lrt->capacity) {
1553 if (_Jv_JNI_EnsureLocalCapacity(env, 16) != 0)
1556 /* get the new local reference table */
1558 lrt = LOCALREFTABLE;
1561 /* insert the reference */
1563 for (i = 0; i < lrt->capacity; i++) {
1564 if (lrt->refs[i] == NULL) {
1565 lrt->refs[i] = (java_objectheader *) ref;
1572 /* should not happen, just to be sure */
1576 /* keep compiler happy */
1582 /* EnsureLocalCapacity *********************************************************
1584 Ensures that at least a given number of local references can be
1585 created in the current thread
1587 *******************************************************************************/
1589 jint _Jv_JNI_EnsureLocalCapacity(JNIEnv* env, jint capacity)
1591 localref_table *lrt;
1593 STATISTICS(jniinvokation());
1595 /* get local reference table (thread specific) */
1597 lrt = LOCALREFTABLE;
1599 /* check if capacity elements are available in the local references table */
1601 if ((lrt->used + capacity) > lrt->capacity)
1602 return _Jv_JNI_PushLocalFrame(env, capacity);
1608 /* AllocObject *****************************************************************
1610 Allocates a new Java object without invoking any of the
1611 constructors for the object. Returns a reference to the object.
1613 *******************************************************************************/
1615 jobject _Jv_JNI_AllocObject(JNIEnv *env, jclass clazz)
1618 java_objectheader *o;
1620 STATISTICS(jniinvokation());
1622 c = (classinfo *) clazz;
1624 if ((c->flags & ACC_INTERFACE) || (c->flags & ACC_ABSTRACT)) {
1625 exceptions_throw_instantiationexception(c);
1631 return _Jv_JNI_NewLocalRef(env, o);
1635 /* NewObject *******************************************************************
1637 Programmers place all arguments that are to be passed to the
1638 constructor immediately following the methodID
1639 argument. NewObject() accepts these arguments and passes them to
1640 the Java method that the programmer wishes to invoke.
1642 *******************************************************************************/
1644 jobject _Jv_JNI_NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1646 java_objectheader *o;
1650 STATISTICS(jniinvokation());
1652 m = (methodinfo *) methodID;
1656 o = builtin_new(clazz);
1661 /* call constructor */
1663 va_start(ap, methodID);
1664 _Jv_jni_CallVoidMethod(o, o->vftbl, m, ap);
1667 return _Jv_JNI_NewLocalRef(env, o);
1671 /* NewObjectV ******************************************************************
1673 Programmers place all arguments that are to be passed to the
1674 constructor in an args argument of type va_list that immediately
1675 follows the methodID argument. NewObjectV() accepts these
1676 arguments, and, in turn, passes them to the Java method that the
1677 programmer wishes to invoke.
1679 *******************************************************************************/
1681 jobject _Jv_JNI_NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID,
1684 java_objectheader *o;
1687 STATISTICS(jniinvokation());
1689 m = (methodinfo *) methodID;
1693 o = builtin_new(clazz);
1698 /* call constructor */
1700 _Jv_jni_CallVoidMethod(o, o->vftbl, m, args);
1702 return _Jv_JNI_NewLocalRef(env, o);
1706 /* NewObjectA *****************************************************************
1708 Programmers place all arguments that are to be passed to the
1709 constructor in an args array of jvalues that immediately follows
1710 the methodID argument. NewObjectA() accepts the arguments in this
1711 array, and, in turn, passes them to the Java method that the
1712 programmer wishes to invoke.
1714 *******************************************************************************/
1716 jobject _Jv_JNI_NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID,
1719 java_objectheader *o;
1722 STATISTICS(jniinvokation());
1724 m = (methodinfo *) methodID;
1728 o = builtin_new(clazz);
1733 /* call constructor */
1735 _Jv_jni_CallVoidMethodA(o, o->vftbl, m, args);
1737 return _Jv_JNI_NewLocalRef(env, o);
1741 /* GetObjectClass **************************************************************
1743 Returns the class of an object.
1745 *******************************************************************************/
1747 jclass _Jv_JNI_GetObjectClass(JNIEnv *env, jobject obj)
1749 java_objectheader *o;
1752 STATISTICS(jniinvokation());
1754 o = (java_objectheader *) obj;
1756 if ((o == NULL) || (o->vftbl == NULL))
1759 c = o->vftbl->class;
1761 return (jclass) _Jv_JNI_NewLocalRef(env, (jobject) c);
1765 /* IsInstanceOf ****************************************************************
1767 Tests whether an object is an instance of a class.
1769 *******************************************************************************/
1771 jboolean _Jv_JNI_IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
1774 java_lang_Object *o;
1776 STATISTICS(jniinvokation());
1778 c = (java_lang_Class *) clazz;
1779 o = (java_lang_Object *) obj;
1781 return _Jv_java_lang_Class_isInstance(c, o);
1785 /* Reflection Support *********************************************************/
1787 /* FromReflectedMethod *********************************************************
1789 Converts java.lang.reflect.Method or java.lang.reflect.Constructor
1790 object to a method ID.
1792 *******************************************************************************/
1794 jmethodID _Jv_JNI_FromReflectedMethod(JNIEnv *env, jobject method)
1796 #if defined(ENABLE_JAVASE)
1801 STATISTICS(jniinvokation());
1806 if (builtin_instanceof(method, class_java_lang_reflect_Method)) {
1807 java_lang_reflect_Method *rm;
1809 rm = (java_lang_reflect_Method *) method;
1810 c = (classinfo *) (rm->declaringClass);
1813 else if (builtin_instanceof(method, class_java_lang_reflect_Constructor)) {
1814 java_lang_reflect_Constructor *rc;
1816 rc = (java_lang_reflect_Constructor *) method;
1817 c = (classinfo *) (rc->clazz);
1823 mi = &(c->methods[slot]);
1825 return (jmethodID) mi;
1827 vm_abort("_Jv_JNI_FromReflectedMethod: not implemented in this configuration");
1829 /* keep compiler happy */
1836 /* FromReflectedField **********************************************************
1838 Converts a java.lang.reflect.Field to a field ID.
1840 *******************************************************************************/
1842 jfieldID _Jv_JNI_FromReflectedField(JNIEnv* env, jobject field)
1844 #if defined(ENABLE_JAVASE)
1845 java_lang_reflect_Field *rf;
1849 STATISTICS(jniinvokation());
1851 rf = (java_lang_reflect_Field *) field;
1856 c = (classinfo *) rf->declaringClass;
1858 f = &(c->fields[rf->slot]);
1860 return (jfieldID) f;
1862 vm_abort("_Jv_JNI_FromReflectedField: not implemented in this configuration");
1864 /* keep compiler happy */
1871 /* ToReflectedMethod ***********************************************************
1873 Converts a method ID derived from cls to an instance of the
1874 java.lang.reflect.Method class or to an instance of the
1875 java.lang.reflect.Constructor class.
1877 *******************************************************************************/
1879 jobject _Jv_JNI_ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID,
1882 STATISTICS(jniinvokation());
1884 log_text("JNI-Call: ToReflectedMethod: IMPLEMENT ME!");
1890 /* ToReflectedField ************************************************************
1892 Converts a field ID derived from cls to an instance of the
1893 java.lang.reflect.Field class.
1895 *******************************************************************************/
1897 jobject _Jv_JNI_ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID,
1900 STATISTICS(jniinvokation());
1902 log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!");
1908 /* Calling Instance Methods ***************************************************/
1910 /* GetMethodID *****************************************************************
1912 Returns the method ID for an instance (nonstatic) method of a class
1913 or interface. The method may be defined in one of the clazz's
1914 superclasses and inherited by clazz. The method is determined by
1915 its name and signature.
1917 GetMethodID() causes an uninitialized class to be initialized.
1919 *******************************************************************************/
1921 jmethodID _Jv_JNI_GetMethodID(JNIEnv* env, jclass clazz, const char *name,
1929 STATISTICS(jniinvokation());
1931 c = (classinfo *) clazz;
1936 if (!(c->state & CLASS_INITIALIZED))
1937 if (!initialize_class(c))
1940 /* try to get the method of the class or one of it's superclasses */
1942 uname = utf_new_char((char *) name);
1943 udesc = utf_new_char((char *) sig);
1945 m = class_resolvemethod(clazz, uname, udesc);
1947 if ((m == NULL) || (m->flags & ACC_STATIC)) {
1948 exceptions_throw_nosuchmethoderror(c, uname, udesc);
1953 return (jmethodID) m;
1957 /* JNI-functions for calling instance methods *********************************/
1959 jobject _Jv_JNI_CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID,
1962 java_objectheader *o;
1964 java_objectheader *ret;
1967 o = (java_objectheader *) obj;
1968 m = (methodinfo *) methodID;
1970 va_start(ap, methodID);
1971 ret = _Jv_jni_CallObjectMethod(o, o->vftbl, m, ap);
1974 return _Jv_JNI_NewLocalRef(env, ret);
1978 jobject _Jv_JNI_CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
1981 java_objectheader *o;
1983 java_objectheader *ret;
1985 o = (java_objectheader *) obj;
1986 m = (methodinfo *) methodID;
1988 ret = _Jv_jni_CallObjectMethod(o, o->vftbl, m, args);
1990 return _Jv_JNI_NewLocalRef(env, ret);
1994 jobject _Jv_JNI_CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
1997 java_objectheader *o;
1999 java_objectheader *ret;
2001 o = (java_objectheader *) obj;
2002 m = (methodinfo *) methodID;
2004 ret = _Jv_jni_CallObjectMethodA(o, o->vftbl, m, args);
2006 return _Jv_JNI_NewLocalRef(env, ret);
2010 jboolean _Jv_JNI_CallBooleanMethod(JNIEnv *env, jobject obj, jmethodID methodID,
2013 java_objectheader *o;
2018 o = (java_objectheader *) obj;
2019 m = (methodinfo *) methodID;
2021 va_start(ap, methodID);
2022 b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
2029 jboolean _Jv_JNI_CallBooleanMethodV(JNIEnv *env, jobject obj,
2030 jmethodID methodID, va_list args)
2032 java_objectheader *o;
2036 o = (java_objectheader *) obj;
2037 m = (methodinfo *) methodID;
2039 b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
2045 jboolean _Jv_JNI_CallBooleanMethodA(JNIEnv *env, jobject obj,
2046 jmethodID methodID, jvalue *args)
2048 java_objectheader *o;
2052 o = (java_objectheader *) obj;
2053 m = (methodinfo *) methodID;
2055 b = _Jv_jni_CallIntMethodA(o, o->vftbl, m, args);
2061 jbyte _Jv_JNI_CallByteMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
2063 java_objectheader *o;
2068 o = (java_objectheader *) obj;
2069 m = (methodinfo *) methodID;
2071 va_start(ap, methodID);
2072 b = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
2080 jbyte _Jv_JNI_CallByteMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2083 java_objectheader *o;
2087 o = (java_objectheader *) obj;
2088 m = (methodinfo *) methodID;
2090 b = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
2096 jbyte _Jv_JNI_CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2099 log_text("JNI-Call: CallByteMethodA: IMPLEMENT ME!");
2105 jchar _Jv_JNI_CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
2107 java_objectheader *o;
2112 o = (java_objectheader *) obj;
2113 m = (methodinfo *) methodID;
2115 va_start(ap, methodID);
2116 c = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
2123 jchar _Jv_JNI_CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2126 java_objectheader *o;
2130 o = (java_objectheader *) obj;
2131 m = (methodinfo *) methodID;
2133 c = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
2139 jchar _Jv_JNI_CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2142 log_text("JNI-Call: CallCharMethodA: IMPLEMENT ME!");
2148 jshort _Jv_JNI_CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID,
2151 java_objectheader *o;
2156 o = (java_objectheader *) obj;
2157 m = (methodinfo *) methodID;
2159 va_start(ap, methodID);
2160 s = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
2167 jshort _Jv_JNI_CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2170 java_objectheader *o;
2174 o = (java_objectheader *) obj;
2175 m = (methodinfo *) methodID;
2177 s = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
2183 jshort _Jv_JNI_CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2186 log_text("JNI-Call: CallShortMethodA: IMPLEMENT ME!");
2193 jint _Jv_JNI_CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
2195 java_objectheader *o;
2200 o = (java_objectheader *) obj;
2201 m = (methodinfo *) methodID;
2203 va_start(ap, methodID);
2204 i = _Jv_jni_CallIntMethod(o, o->vftbl, m, ap);
2211 jint _Jv_JNI_CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2214 java_objectheader *o;
2218 o = (java_objectheader *) obj;
2219 m = (methodinfo *) methodID;
2221 i = _Jv_jni_CallIntMethod(o, o->vftbl, m, args);
2227 jint _Jv_JNI_CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2230 log_text("JNI-Call: CallIntMethodA: IMPLEMENT ME!");
2237 jlong _Jv_JNI_CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
2239 java_objectheader *o;
2244 o = (java_objectheader *) obj;
2245 m = (methodinfo *) methodID;
2247 va_start(ap, methodID);
2248 l = _Jv_jni_CallLongMethod(o, o->vftbl, m, ap);
2255 jlong _Jv_JNI_CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2258 java_objectheader *o;
2262 o = (java_objectheader *) obj;
2263 m = (methodinfo *) methodID;
2265 l = _Jv_jni_CallLongMethod(o, o->vftbl, m, args);
2271 jlong _Jv_JNI_CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2274 log_text("JNI-Call: CallLongMethodA: IMPLEMENT ME!");
2281 jfloat _Jv_JNI_CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID,
2284 java_objectheader *o;
2289 o = (java_objectheader *) obj;
2290 m = (methodinfo *) methodID;
2292 va_start(ap, methodID);
2293 f = _Jv_jni_CallFloatMethod(o, o->vftbl, m, ap);
2300 jfloat _Jv_JNI_CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2303 java_objectheader *o;
2307 o = (java_objectheader *) obj;
2308 m = (methodinfo *) methodID;
2310 f = _Jv_jni_CallFloatMethod(o, o->vftbl, m, args);
2316 jfloat _Jv_JNI_CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2319 log_text("JNI-Call: CallFloatMethodA: IMPLEMENT ME!");
2326 jdouble _Jv_JNI_CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID,
2329 java_objectheader *o;
2334 o = (java_objectheader *) obj;
2335 m = (methodinfo *) methodID;
2337 va_start(ap, methodID);
2338 d = _Jv_jni_CallDoubleMethod(o, o->vftbl, m, ap);
2345 jdouble _Jv_JNI_CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2348 java_objectheader *o;
2352 o = (java_objectheader *) obj;
2353 m = (methodinfo *) methodID;
2355 d = _Jv_jni_CallDoubleMethod(o, o->vftbl, m, args);
2361 jdouble _Jv_JNI_CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2364 log_text("JNI-Call: CallDoubleMethodA: IMPLEMENT ME!");
2371 void _Jv_JNI_CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
2373 java_objectheader *o;
2377 o = (java_objectheader *) obj;
2378 m = (methodinfo *) methodID;
2380 va_start(ap, methodID);
2381 _Jv_jni_CallVoidMethod(o, o->vftbl, m, ap);
2386 void _Jv_JNI_CallVoidMethodV(JNIEnv *env, jobject obj, jmethodID methodID,
2389 java_objectheader *o;
2392 o = (java_objectheader *) obj;
2393 m = (methodinfo *) methodID;
2395 _Jv_jni_CallVoidMethod(o, o->vftbl, m, args);
2399 void _Jv_JNI_CallVoidMethodA(JNIEnv *env, jobject obj, jmethodID methodID,
2402 java_objectheader *o;
2405 o = (java_objectheader *) obj;
2406 m = (methodinfo *) methodID;
2408 _Jv_jni_CallVoidMethodA(o, o->vftbl, m, args);
2413 jobject _Jv_JNI_CallNonvirtualObjectMethod(JNIEnv *env, jobject obj,
2414 jclass clazz, jmethodID methodID,
2417 java_objectheader *o;
2420 java_objectheader *r;
2423 o = (java_objectheader *) obj;
2424 c = (classinfo *) clazz;
2425 m = (methodinfo *) methodID;
2427 va_start(ap, methodID);
2428 r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, ap);
2431 return _Jv_JNI_NewLocalRef(env, r);
2435 jobject _Jv_JNI_CallNonvirtualObjectMethodV(JNIEnv *env, jobject obj,
2436 jclass clazz, jmethodID methodID,
2439 java_objectheader *o;
2442 java_objectheader *r;
2444 o = (java_objectheader *) obj;
2445 c = (classinfo *) clazz;
2446 m = (methodinfo *) methodID;
2448 r = _Jv_jni_CallObjectMethod(o, c->vftbl, m, args);
2450 return _Jv_JNI_NewLocalRef(env, r);
2454 jobject _Jv_JNI_CallNonvirtualObjectMethodA(JNIEnv *env, jobject obj,
2455 jclass clazz, jmethodID methodID,
2458 log_text("JNI-Call: CallNonvirtualObjectMethodA: IMPLEMENT ME!");
2460 return _Jv_JNI_NewLocalRef(env, NULL);
2465 jboolean _Jv_JNI_CallNonvirtualBooleanMethod(JNIEnv *env, jobject obj,
2466 jclass clazz, jmethodID methodID,
2469 java_objectheader *o;
2475 o = (java_objectheader *) obj;
2476 c = (classinfo *) clazz;
2477 m = (methodinfo *) methodID;
2479 va_start(ap, methodID);
2480 b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
2487 jboolean _Jv_JNI_CallNonvirtualBooleanMethodV(JNIEnv *env, jobject obj,
2488 jclass clazz, jmethodID methodID,
2491 java_objectheader *o;
2496 o = (java_objectheader *) obj;
2497 c = (classinfo *) clazz;
2498 m = (methodinfo *) methodID;
2500 b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
2506 jboolean _Jv_JNI_CallNonvirtualBooleanMethodA(JNIEnv *env, jobject obj,
2507 jclass clazz, jmethodID methodID,
2510 log_text("JNI-Call: CallNonvirtualBooleanMethodA: IMPLEMENT ME!");
2516 jbyte _Jv_JNI_CallNonvirtualByteMethod(JNIEnv *env, jobject obj, jclass clazz,
2517 jmethodID methodID, ...)
2519 java_objectheader *o;
2525 o = (java_objectheader *) obj;
2526 c = (classinfo *) clazz;
2527 m = (methodinfo *) methodID;
2529 va_start(ap, methodID);
2530 b = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
2537 jbyte _Jv_JNI_CallNonvirtualByteMethodV(JNIEnv *env, jobject obj, jclass clazz,
2538 jmethodID methodID, va_list args)
2540 java_objectheader *o;
2545 o = (java_objectheader *) obj;
2546 c = (classinfo *) clazz;
2547 m = (methodinfo *) methodID;
2549 b = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
2555 jbyte _Jv_JNI_CallNonvirtualByteMethodA(JNIEnv *env, jobject obj, jclass clazz,
2556 jmethodID methodID, jvalue *args)
2558 log_text("JNI-Call: CallNonvirtualByteMethodA: IMPLEMENT ME!");
2565 jchar _Jv_JNI_CallNonvirtualCharMethod(JNIEnv *env, jobject obj, jclass clazz,
2566 jmethodID methodID, ...)
2568 java_objectheader *o;
2574 o = (java_objectheader *) obj;
2575 c = (classinfo *) clazz;
2576 m = (methodinfo *) methodID;
2578 va_start(ap, methodID);
2579 ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
2586 jchar _Jv_JNI_CallNonvirtualCharMethodV(JNIEnv *env, jobject obj, jclass clazz,
2587 jmethodID methodID, va_list args)
2589 java_objectheader *o;
2594 o = (java_objectheader *) obj;
2595 c = (classinfo *) clazz;
2596 m = (methodinfo *) methodID;
2598 ch = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
2604 jchar _Jv_JNI_CallNonvirtualCharMethodA(JNIEnv *env, jobject obj, jclass clazz,
2605 jmethodID methodID, jvalue *args)
2607 log_text("JNI-Call: CallNonvirtualCharMethodA: IMPLEMENT ME!");
2614 jshort _Jv_JNI_CallNonvirtualShortMethod(JNIEnv *env, jobject obj,
2615 jclass clazz, jmethodID methodID, ...)
2617 java_objectheader *o;
2623 o = (java_objectheader *) obj;
2624 c = (classinfo *) clazz;
2625 m = (methodinfo *) methodID;
2627 va_start(ap, methodID);
2628 s = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
2635 jshort _Jv_JNI_CallNonvirtualShortMethodV(JNIEnv *env, jobject obj,
2636 jclass clazz, jmethodID methodID,
2639 java_objectheader *o;
2644 o = (java_objectheader *) obj;
2645 c = (classinfo *) clazz;
2646 m = (methodinfo *) methodID;
2648 s = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
2654 jshort _Jv_JNI_CallNonvirtualShortMethodA(JNIEnv *env, jobject obj,
2655 jclass clazz, jmethodID methodID,
2658 log_text("JNI-Call: CallNonvirtualShortMethodA: IMPLEMENT ME!");
2665 jint _Jv_JNI_CallNonvirtualIntMethod(JNIEnv *env, jobject obj, jclass clazz,
2666 jmethodID methodID, ...)
2668 java_objectheader *o;
2674 o = (java_objectheader *) obj;
2675 c = (classinfo *) clazz;
2676 m = (methodinfo *) methodID;
2678 va_start(ap, methodID);
2679 i = _Jv_jni_CallIntMethod(o, c->vftbl, m, ap);
2686 jint _Jv_JNI_CallNonvirtualIntMethodV(JNIEnv *env, jobject obj, jclass clazz,
2687 jmethodID methodID, va_list args)
2689 java_objectheader *o;
2694 o = (java_objectheader *) obj;
2695 c = (classinfo *) clazz;
2696 m = (methodinfo *) methodID;
2698 i = _Jv_jni_CallIntMethod(o, c->vftbl, m, args);
2704 jint _Jv_JNI_CallNonvirtualIntMethodA(JNIEnv *env, jobject obj, jclass clazz,
2705 jmethodID methodID, jvalue *args)
2707 log_text("JNI-Call: CallNonvirtualIntMethodA: IMPLEMENT ME!");
2714 jlong _Jv_JNI_CallNonvirtualLongMethod(JNIEnv *env, jobject obj, jclass clazz,
2715 jmethodID methodID, ...)
2717 java_objectheader *o;
2723 o = (java_objectheader *) obj;
2724 c = (classinfo *) clazz;
2725 m = (methodinfo *) methodID;
2727 va_start(ap, methodID);
2728 l = _Jv_jni_CallLongMethod(o, c->vftbl, m, ap);
2735 jlong _Jv_JNI_CallNonvirtualLongMethodV(JNIEnv *env, jobject obj, jclass clazz,
2736 jmethodID methodID, va_list args)
2738 java_objectheader *o;
2743 o = (java_objectheader *) obj;
2744 c = (classinfo *) clazz;
2745 m = (methodinfo *) methodID;
2747 l = _Jv_jni_CallLongMethod(o, c->vftbl, m, args);
2753 jlong _Jv_JNI_CallNonvirtualLongMethodA(JNIEnv *env, jobject obj, jclass clazz,
2754 jmethodID methodID, jvalue *args)
2756 log_text("JNI-Call: CallNonvirtualLongMethodA: IMPLEMENT ME!");
2763 jfloat _Jv_JNI_CallNonvirtualFloatMethod(JNIEnv *env, jobject obj,
2764 jclass clazz, jmethodID methodID, ...)
2766 java_objectheader *o;
2772 o = (java_objectheader *) obj;
2773 c = (classinfo *) clazz;
2774 m = (methodinfo *) methodID;
2776 va_start(ap, methodID);
2777 f = _Jv_jni_CallFloatMethod(o, c->vftbl, m, ap);
2784 jfloat _Jv_JNI_CallNonvirtualFloatMethodV(JNIEnv *env, jobject obj,
2785 jclass clazz, jmethodID methodID,
2788 java_objectheader *o;
2793 o = (java_objectheader *) obj;
2794 c = (classinfo *) clazz;
2795 m = (methodinfo *) methodID;
2797 f = _Jv_jni_CallFloatMethod(o, c->vftbl, m, args);
2803 jfloat _Jv_JNI_CallNonvirtualFloatMethodA(JNIEnv *env, jobject obj,
2804 jclass clazz, jmethodID methodID,
2807 log_text("JNI-Call: CallNonvirtualFloatMethodA: IMPLEMENT ME!");
2814 jdouble _Jv_JNI_CallNonvirtualDoubleMethod(JNIEnv *env, jobject obj,
2815 jclass clazz, jmethodID methodID,
2818 java_objectheader *o;
2824 o = (java_objectheader *) obj;
2825 c = (classinfo *) clazz;
2826 m = (methodinfo *) methodID;
2828 va_start(ap, methodID);
2829 d = _Jv_jni_CallDoubleMethod(o, c->vftbl, m, ap);
2836 jdouble _Jv_JNI_CallNonvirtualDoubleMethodV(JNIEnv *env, jobject obj,
2837 jclass clazz, jmethodID methodID,
2840 java_objectheader *o;
2845 o = (java_objectheader *) obj;
2846 c = (classinfo *) clazz;
2847 m = (methodinfo *) methodID;
2849 d = _Jv_jni_CallDoubleMethod(o, c->vftbl, m, args);
2855 jdouble _Jv_JNI_CallNonvirtualDoubleMethodA(JNIEnv *env, jobject obj,
2856 jclass clazz, jmethodID methodID,
2859 log_text("JNI-Call: CallNonvirtualDoubleMethodA: IMPLEMENT ME!");
2866 void _Jv_JNI_CallNonvirtualVoidMethod(JNIEnv *env, jobject obj, jclass clazz,
2867 jmethodID methodID, ...)
2869 java_objectheader *o;
2874 o = (java_objectheader *) obj;
2875 c = (classinfo *) clazz;
2876 m = (methodinfo *) methodID;
2878 va_start(ap, methodID);
2879 _Jv_jni_CallVoidMethod(o, c->vftbl, m, ap);
2884 void _Jv_JNI_CallNonvirtualVoidMethodV(JNIEnv *env, jobject obj, jclass clazz,
2885 jmethodID methodID, va_list args)
2887 java_objectheader *o;
2891 o = (java_objectheader *) obj;
2892 c = (classinfo *) clazz;
2893 m = (methodinfo *) methodID;
2895 _Jv_jni_CallVoidMethod(o, c->vftbl, m, args);
2899 void _Jv_JNI_CallNonvirtualVoidMethodA(JNIEnv *env, jobject obj, jclass clazz,
2900 jmethodID methodID, jvalue * args)
2902 java_objectheader *o;
2906 o = (java_objectheader *) obj;
2907 c = (classinfo *) clazz;
2908 m = (methodinfo *) methodID;
2910 _Jv_jni_CallVoidMethodA(o, c->vftbl, m, args);
2914 /* Accessing Fields of Objects ************************************************/
2916 /* GetFieldID ******************************************************************
2918 Returns the field ID for an instance (nonstatic) field of a
2919 class. The field is specified by its name and signature. The
2920 Get<type>Field and Set<type>Field families of accessor functions
2921 use field IDs to retrieve object fields.
2923 *******************************************************************************/
2925 jfieldID _Jv_JNI_GetFieldID(JNIEnv *env, jclass clazz, const char *name,
2933 STATISTICS(jniinvokation());
2935 c = (classinfo *) clazz;
2937 uname = utf_new_char((char *) name);
2938 udesc = utf_new_char((char *) sig);
2940 f = class_findfield(clazz, uname, udesc);
2943 exceptions_throw_nosuchfielderror(c, uname);
2945 return (jfieldID) f;
2949 /* Get<type>Field Routines *****************************************************
2951 This family of accessor routines returns the value of an instance
2952 (nonstatic) field of an object. The field to access is specified by
2953 a field ID obtained by calling GetFieldID().
2955 *******************************************************************************/
2957 jobject _Jv_JNI_GetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID)
2959 java_objectheader *o;
2961 STATISTICS(jniinvokation());
2963 o = GET_FIELD(obj, java_objectheader*, fieldID);
2965 return _Jv_JNI_NewLocalRef(env, o);
2969 jboolean _Jv_JNI_GetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID)
2973 STATISTICS(jniinvokation());
2975 i = GET_FIELD(obj, s4, fieldID);
2977 return (jboolean) i;
2981 jbyte _Jv_JNI_GetByteField(JNIEnv *env, jobject obj, jfieldID fieldID)
2985 STATISTICS(jniinvokation());
2987 i = GET_FIELD(obj, s4, fieldID);
2993 jchar _Jv_JNI_GetCharField(JNIEnv *env, jobject obj, jfieldID fieldID)
2997 STATISTICS(jniinvokation());
2999 i = GET_FIELD(obj, s4, fieldID);
3005 jshort _Jv_JNI_GetShortField(JNIEnv *env, jobject obj, jfieldID fieldID)
3009 STATISTICS(jniinvokation());
3011 i = GET_FIELD(obj, s4, fieldID);
3017 jint _Jv_JNI_GetIntField(JNIEnv *env, jobject obj, jfieldID fieldID)
3019 java_objectheader *o;
3023 STATISTICS(jniinvokation());
3025 o = (java_objectheader *) obj;
3026 f = (fieldinfo *) fieldID;
3028 i = GET_FIELD(o, s4, f);
3034 jlong _Jv_JNI_GetLongField(JNIEnv *env, jobject obj, jfieldID fieldID)
3038 STATISTICS(jniinvokation());
3040 l = GET_FIELD(obj, s8, fieldID);
3046 jfloat _Jv_JNI_GetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID)
3050 STATISTICS(jniinvokation());
3052 f = GET_FIELD(obj, float, fieldID);
3058 jdouble _Jv_JNI_GetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID)
3062 STATISTICS(jniinvokation());
3064 d = GET_FIELD(obj, double, fieldID);
3070 /* Set<type>Field Routines *****************************************************
3072 This family of accessor routines sets the value of an instance
3073 (nonstatic) field of an object. The field to access is specified by
3074 a field ID obtained by calling GetFieldID().
3076 *******************************************************************************/
3078 void _Jv_JNI_SetObjectField(JNIEnv *env, jobject obj, jfieldID fieldID,
3081 STATISTICS(jniinvokation());
3083 SET_FIELD(obj, java_objectheader*, fieldID, value);
3087 void _Jv_JNI_SetBooleanField(JNIEnv *env, jobject obj, jfieldID fieldID,
3090 STATISTICS(jniinvokation());
3092 SET_FIELD(obj, s4, fieldID, value);
3096 void _Jv_JNI_SetByteField(JNIEnv *env, jobject obj, jfieldID fieldID,
3099 STATISTICS(jniinvokation());
3101 SET_FIELD(obj, s4, fieldID, value);
3105 void _Jv_JNI_SetCharField(JNIEnv *env, jobject obj, jfieldID fieldID,
3108 STATISTICS(jniinvokation());
3110 SET_FIELD(obj, s4, fieldID, value);
3114 void _Jv_JNI_SetShortField(JNIEnv *env, jobject obj, jfieldID fieldID,
3117 STATISTICS(jniinvokation());
3119 SET_FIELD(obj, s4, fieldID, value);
3123 void _Jv_JNI_SetIntField(JNIEnv *env, jobject obj, jfieldID fieldID, jint value)
3125 STATISTICS(jniinvokation());
3127 SET_FIELD(obj, s4, fieldID, value);
3131 void _Jv_JNI_SetLongField(JNIEnv *env, jobject obj, jfieldID fieldID,
3134 STATISTICS(jniinvokation());
3136 SET_FIELD(obj, s8, fieldID, value);
3140 void _Jv_JNI_SetFloatField(JNIEnv *env, jobject obj, jfieldID fieldID,
3143 STATISTICS(jniinvokation());
3145 SET_FIELD(obj, float, fieldID, value);
3149 void _Jv_JNI_SetDoubleField(JNIEnv *env, jobject obj, jfieldID fieldID,
3152 STATISTICS(jniinvokation());
3154 SET_FIELD(obj, double, fieldID, value);
3158 /* Calling Static Methods *****************************************************/
3160 /* GetStaticMethodID ***********************************************************
3162 Returns the method ID for a static method of a class. The method is
3163 specified by its name and signature.
3165 GetStaticMethodID() causes an uninitialized class to be
3168 *******************************************************************************/
3170 jmethodID _Jv_JNI_GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name,
3178 STATISTICS(jniinvokation());
3180 c = (classinfo *) clazz;
3185 if (!(c->state & CLASS_INITIALIZED))
3186 if (!initialize_class(c))
3189 /* try to get the static method of the class */
3191 uname = utf_new_char((char *) name);
3192 udesc = utf_new_char((char *) sig);
3194 m = class_resolvemethod(c, uname, udesc);
3196 if ((m == NULL) || !(m->flags & ACC_STATIC)) {
3197 exceptions_throw_nosuchmethoderror(c, uname, udesc);
3202 return (jmethodID) m;
3206 jobject _Jv_JNI_CallStaticObjectMethod(JNIEnv *env, jclass clazz,
3207 jmethodID methodID, ...)
3210 java_objectheader *o;
3213 m = (methodinfo *) methodID;
3215 va_start(ap, methodID);
3216 o = _Jv_jni_CallObjectMethod(NULL, NULL, m, ap);
3219 return _Jv_JNI_NewLocalRef(env, o);
3223 jobject _Jv_JNI_CallStaticObjectMethodV(JNIEnv *env, jclass clazz,
3224 jmethodID methodID, va_list args)
3227 java_objectheader *o;
3229 m = (methodinfo *) methodID;
3231 o = _Jv_jni_CallObjectMethod(NULL, NULL, m, args);
3233 return _Jv_JNI_NewLocalRef(env, o);
3237 jobject _Jv_JNI_CallStaticObjectMethodA(JNIEnv *env, jclass clazz,
3238 jmethodID methodID, jvalue *args)
3241 java_objectheader *o;
3243 m = (methodinfo *) methodID;
3245 o = _Jv_jni_CallObjectMethodA(NULL, NULL, m, args);
3247 return _Jv_JNI_NewLocalRef(env, o);
3251 jboolean _Jv_JNI_CallStaticBooleanMethod(JNIEnv *env, jclass clazz,
3252 jmethodID methodID, ...)
3258 m = (methodinfo *) methodID;
3260 va_start(ap, methodID);
3261 b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
3268 jboolean _Jv_JNI_CallStaticBooleanMethodV(JNIEnv *env, jclass clazz,
3269 jmethodID methodID, va_list args)
3274 m = (methodinfo *) methodID;
3276 b = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
3282 jboolean _Jv_JNI_CallStaticBooleanMethodA(JNIEnv *env, jclass clazz,
3283 jmethodID methodID, jvalue *args)
3285 log_text("JNI-Call: CallStaticBooleanMethodA: IMPLEMENT ME!");
3291 jbyte _Jv_JNI_CallStaticByteMethod(JNIEnv *env, jclass clazz,
3292 jmethodID methodID, ...)
3298 m = (methodinfo *) methodID;
3300 va_start(ap, methodID);
3301 b = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
3308 jbyte _Jv_JNI_CallStaticByteMethodV(JNIEnv *env, jclass clazz,
3309 jmethodID methodID, va_list args)
3314 m = (methodinfo *) methodID;
3316 b = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
3322 jbyte _Jv_JNI_CallStaticByteMethodA(JNIEnv *env, jclass clazz,
3323 jmethodID methodID, jvalue *args)
3325 log_text("JNI-Call: CallStaticByteMethodA: IMPLEMENT ME!");
3331 jchar _Jv_JNI_CallStaticCharMethod(JNIEnv *env, jclass clazz,
3332 jmethodID methodID, ...)
3338 m = (methodinfo *) methodID;
3340 va_start(ap, methodID);
3341 c = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
3348 jchar _Jv_JNI_CallStaticCharMethodV(JNIEnv *env, jclass clazz,
3349 jmethodID methodID, va_list args)
3354 m = (methodinfo *) methodID;
3356 c = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
3362 jchar _Jv_JNI_CallStaticCharMethodA(JNIEnv *env, jclass clazz,
3363 jmethodID methodID, jvalue *args)
3365 log_text("JNI-Call: CallStaticCharMethodA: IMPLEMENT ME!");
3371 jshort _Jv_JNI_CallStaticShortMethod(JNIEnv *env, jclass clazz,
3372 jmethodID methodID, ...)
3378 m = (methodinfo *) methodID;
3380 va_start(ap, methodID);
3381 s = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
3388 jshort _Jv_JNI_CallStaticShortMethodV(JNIEnv *env, jclass clazz,
3389 jmethodID methodID, va_list args)
3394 m = (methodinfo *) methodID;
3396 s = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
3402 jshort _Jv_JNI_CallStaticShortMethodA(JNIEnv *env, jclass clazz,
3403 jmethodID methodID, jvalue *args)
3405 log_text("JNI-Call: CallStaticShortMethodA: IMPLEMENT ME!");
3411 jint _Jv_JNI_CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID,
3418 m = (methodinfo *) methodID;
3420 va_start(ap, methodID);
3421 i = _Jv_jni_CallIntMethod(NULL, NULL, m, ap);
3428 jint _Jv_JNI_CallStaticIntMethodV(JNIEnv *env, jclass clazz,
3429 jmethodID methodID, va_list args)
3434 m = (methodinfo *) methodID;
3436 i = _Jv_jni_CallIntMethod(NULL, NULL, m, args);
3442 jint _Jv_JNI_CallStaticIntMethodA(JNIEnv *env, jclass clazz,
3443 jmethodID methodID, jvalue *args)
3445 log_text("JNI-Call: CallStaticIntMethodA: IMPLEMENT ME!");
3451 jlong _Jv_JNI_CallStaticLongMethod(JNIEnv *env, jclass clazz,
3452 jmethodID methodID, ...)
3458 m = (methodinfo *) methodID;
3460 va_start(ap, methodID);
3461 l = _Jv_jni_CallLongMethod(NULL, NULL, m, ap);
3468 jlong _Jv_JNI_CallStaticLongMethodV(JNIEnv *env, jclass clazz,
3469 jmethodID methodID, va_list args)
3474 m = (methodinfo *) methodID;
3476 l = _Jv_jni_CallLongMethod(NULL, NULL, m, args);
3482 jlong _Jv_JNI_CallStaticLongMethodA(JNIEnv *env, jclass clazz,
3483 jmethodID methodID, jvalue *args)
3485 log_text("JNI-Call: CallStaticLongMethodA: IMPLEMENT ME!");
3492 jfloat _Jv_JNI_CallStaticFloatMethod(JNIEnv *env, jclass clazz,
3493 jmethodID methodID, ...)
3499 m = (methodinfo *) methodID;
3501 va_start(ap, methodID);
3502 f = _Jv_jni_CallFloatMethod(NULL, NULL, m, ap);
3509 jfloat _Jv_JNI_CallStaticFloatMethodV(JNIEnv *env, jclass clazz,
3510 jmethodID methodID, va_list args)
3515 m = (methodinfo *) methodID;
3517 f = _Jv_jni_CallFloatMethod(NULL, NULL, m, args);
3523 jfloat _Jv_JNI_CallStaticFloatMethodA(JNIEnv *env, jclass clazz,
3524 jmethodID methodID, jvalue *args)
3526 log_text("JNI-Call: CallStaticFloatMethodA: IMPLEMENT ME!");
3532 jdouble _Jv_JNI_CallStaticDoubleMethod(JNIEnv *env, jclass clazz,
3533 jmethodID methodID, ...)
3539 m = (methodinfo *) methodID;
3541 va_start(ap, methodID);
3542 d = _Jv_jni_CallDoubleMethod(NULL, NULL, m, ap);
3549 jdouble _Jv_JNI_CallStaticDoubleMethodV(JNIEnv *env, jclass clazz,
3550 jmethodID methodID, va_list args)
3555 m = (methodinfo *) methodID;
3557 d = _Jv_jni_CallDoubleMethod(NULL, NULL, m, args);
3563 jdouble _Jv_JNI_CallStaticDoubleMethodA(JNIEnv *env, jclass clazz,
3564 jmethodID methodID, jvalue *args)
3566 log_text("JNI-Call: CallStaticDoubleMethodA: IMPLEMENT ME!");
3572 void _Jv_JNI_CallStaticVoidMethod(JNIEnv *env, jclass clazz,
3573 jmethodID methodID, ...)
3578 m = (methodinfo *) methodID;
3580 va_start(ap, methodID);
3581 _Jv_jni_CallVoidMethod(NULL, NULL, m, ap);
3586 void _Jv_JNI_CallStaticVoidMethodV(JNIEnv *env, jclass clazz,
3587 jmethodID methodID, va_list args)
3591 m = (methodinfo *) methodID;
3593 _Jv_jni_CallVoidMethod(NULL, NULL, m, args);
3597 void _Jv_JNI_CallStaticVoidMethodA(JNIEnv *env, jclass clazz,
3598 jmethodID methodID, jvalue * args)
3602 m = (methodinfo *) methodID;
3604 _Jv_jni_CallVoidMethodA(NULL, NULL, m, args);
3608 /* Accessing Static Fields ****************************************************/
3610 /* GetStaticFieldID ************************************************************
3612 Returns the field ID for a static field of a class. The field is
3613 specified by its name and signature. The GetStatic<type>Field and
3614 SetStatic<type>Field families of accessor functions use field IDs
3615 to retrieve static fields.
3617 *******************************************************************************/
3619 jfieldID _Jv_JNI_GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name,
3627 STATISTICS(jniinvokation());
3629 c = (classinfo *) clazz;
3631 uname = utf_new_char((char *) name);
3632 usig = utf_new_char((char *) sig);
3634 f = class_findfield(clazz, uname, usig);
3637 exceptions_throw_nosuchfielderror(c, uname);
3639 return (jfieldID) f;
3643 /* GetStatic<type>Field ********************************************************
3645 This family of accessor routines returns the value of a static
3648 *******************************************************************************/
3650 jobject _Jv_JNI_GetStaticObjectField(JNIEnv *env, jclass clazz,
3656 STATISTICS(jniinvokation());
3658 c = (classinfo *) clazz;
3659 f = (fieldinfo *) fieldID;
3661 if (!(c->state & CLASS_INITIALIZED))
3662 if (!initialize_class(c))
3665 return _Jv_JNI_NewLocalRef(env, f->value.a);
3669 jboolean _Jv_JNI_GetStaticBooleanField(JNIEnv *env, jclass clazz,
3675 STATISTICS(jniinvokation());
3677 c = (classinfo *) clazz;
3678 f = (fieldinfo *) fieldID;
3680 if (!(c->state & CLASS_INITIALIZED))
3681 if (!initialize_class(c))
3688 jbyte _Jv_JNI_GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
3693 STATISTICS(jniinvokation());
3695 c = (classinfo *) clazz;
3696 f = (fieldinfo *) fieldID;
3698 if (!(c->state & CLASS_INITIALIZED))
3699 if (!initialize_class(c))
3706 jchar _Jv_JNI_GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
3711 STATISTICS(jniinvokation());
3713 c = (classinfo *) clazz;
3714 f = (fieldinfo *) fieldID;
3716 if (!(c->state & CLASS_INITIALIZED))
3717 if (!initialize_class(c))
3724 jshort _Jv_JNI_GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
3729 STATISTICS(jniinvokation());
3731 c = (classinfo *) clazz;
3732 f = (fieldinfo *) fieldID;
3734 if (!(c->state & CLASS_INITIALIZED))
3735 if (!initialize_class(c))
3742 jint _Jv_JNI_GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
3747 STATISTICS(jniinvokation());
3749 c = (classinfo *) clazz;
3750 f = (fieldinfo *) fieldID;
3752 if (!(c->state & CLASS_INITIALIZED))
3753 if (!initialize_class(c))
3760 jlong _Jv_JNI_GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
3765 STATISTICS(jniinvokation());
3767 c = (classinfo *) clazz;
3768 f = (fieldinfo *) fieldID;
3770 if (!(c->state & CLASS_INITIALIZED))
3771 if (!initialize_class(c))
3778 jfloat _Jv_JNI_GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
3783 STATISTICS(jniinvokation());
3785 c = (classinfo *) clazz;
3786 f = (fieldinfo *) fieldID;
3788 if (!(c->state & CLASS_INITIALIZED))
3789 if (!initialize_class(c))
3796 jdouble _Jv_JNI_GetStaticDoubleField(JNIEnv *env, jclass clazz,
3802 STATISTICS(jniinvokation());
3804 c = (classinfo *) clazz;
3805 f = (fieldinfo *) fieldID;
3807 if (!(c->state & CLASS_INITIALIZED))
3808 if (!initialize_class(c))
3815 /* SetStatic<type>Field *******************************************************
3817 This family of accessor routines sets the value of a static field
3820 *******************************************************************************/
3822 void _Jv_JNI_SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3828 STATISTICS(jniinvokation());
3830 c = (classinfo *) clazz;
3831 f = (fieldinfo *) fieldID;
3833 if (!(c->state & CLASS_INITIALIZED))
3834 if (!initialize_class(c))
3841 void _Jv_JNI_SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3847 STATISTICS(jniinvokation());
3849 c = (classinfo *) clazz;
3850 f = (fieldinfo *) fieldID;
3852 if (!(c->state & CLASS_INITIALIZED))
3853 if (!initialize_class(c))
3860 void _Jv_JNI_SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3866 STATISTICS(jniinvokation());
3868 c = (classinfo *) clazz;
3869 f = (fieldinfo *) fieldID;
3871 if (!(c->state & CLASS_INITIALIZED))
3872 if (!initialize_class(c))
3879 void _Jv_JNI_SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3885 STATISTICS(jniinvokation());
3887 c = (classinfo *) clazz;
3888 f = (fieldinfo *) fieldID;
3890 if (!(c->state & CLASS_INITIALIZED))
3891 if (!initialize_class(c))
3898 void _Jv_JNI_SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3904 STATISTICS(jniinvokation());
3906 c = (classinfo *) clazz;
3907 f = (fieldinfo *) fieldID;
3909 if (!(c->state & CLASS_INITIALIZED))
3910 if (!initialize_class(c))
3917 void _Jv_JNI_SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3923 STATISTICS(jniinvokation());
3925 c = (classinfo *) clazz;
3926 f = (fieldinfo *) fieldID;
3928 if (!(c->state & CLASS_INITIALIZED))
3929 if (!initialize_class(c))
3936 void _Jv_JNI_SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3942 STATISTICS(jniinvokation());
3944 c = (classinfo *) clazz;
3945 f = (fieldinfo *) fieldID;
3947 if (!(c->state & CLASS_INITIALIZED))
3948 if (!initialize_class(c))
3955 void _Jv_JNI_SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3961 STATISTICS(jniinvokation());
3963 c = (classinfo *) clazz;
3964 f = (fieldinfo *) fieldID;
3966 if (!(c->state & CLASS_INITIALIZED))
3967 if (!initialize_class(c))
3974 void _Jv_JNI_SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID,
3980 STATISTICS(jniinvokation());
3982 c = (classinfo *) clazz;
3983 f = (fieldinfo *) fieldID;
3985 if (!(c->state & CLASS_INITIALIZED))
3986 if (!initialize_class(c))
3993 /* String Operations **********************************************************/
3995 /* NewString *******************************************************************
3997 Create new java.lang.String object from an array of Unicode
4000 *******************************************************************************/
4002 jstring _Jv_JNI_NewString(JNIEnv *env, const jchar *buf, jsize len)
4004 java_lang_String *s;
4008 STATISTICS(jniinvokation());
4010 s = (java_lang_String *) builtin_new(class_java_lang_String);
4011 a = builtin_newarray_char(len);
4013 /* javastring or characterarray could not be created */
4014 if ((a == NULL) || (s == NULL))
4018 for (i = 0; i < len; i++)
4019 a->data[i] = buf[i];
4025 return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s);
4029 static jchar emptyStringJ[]={0,0};
4031 /* GetStringLength *************************************************************
4033 Returns the length (the count of Unicode characters) of a Java
4036 *******************************************************************************/
4038 jsize _Jv_JNI_GetStringLength(JNIEnv *env, jstring str)
4040 return ((java_lang_String *) str)->count;
4044 /******************** convertes javastring to u2-array ****************************/
4046 u2 *javastring_tou2(jstring so)
4048 java_lang_String *s;
4053 STATISTICS(jniinvokation());
4055 s = (java_lang_String *) so;
4065 /* allocate memory */
4067 stringbuffer = MNEW(u2, s->count + 1);
4071 for (i = 0; i < s->count; i++)
4072 stringbuffer[i] = a->data[s->offset + i];
4074 /* terminate string */
4076 stringbuffer[i] = '\0';
4078 return stringbuffer;
4082 /* GetStringChars **************************************************************
4084 Returns a pointer to the array of Unicode characters of the
4085 string. This pointer is valid until ReleaseStringchars() is called.
4087 *******************************************************************************/
4089 const jchar *_Jv_JNI_GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
4093 STATISTICS(jniinvokation());
4095 jc = javastring_tou2(str);
4107 return emptyStringJ;
4111 /* ReleaseStringChars **********************************************************
4113 Informs the VM that the native code no longer needs access to
4114 chars. The chars argument is a pointer obtained from string using
4117 *******************************************************************************/
4119 void _Jv_JNI_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)
4121 STATISTICS(jniinvokation());
4123 if (chars == emptyStringJ)
4126 MFREE(((jchar *) chars), jchar, ((java_lang_String *) str)->count + 1);
4130 /* NewStringUTF ****************************************************************
4132 Constructs a new java.lang.String object from an array of UTF-8 characters.
4134 *******************************************************************************/
4136 jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes)
4138 java_lang_String *s;
4140 STATISTICS(jniinvokation());
4142 s = javastring_safe_new_from_utf8(bytes);
4144 return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s);
4148 /****************** returns the utf8 length in bytes of a string *******************/
4150 jsize _Jv_JNI_GetStringUTFLength (JNIEnv *env, jstring string)
4152 java_lang_String *s = (java_lang_String*) string;
4154 STATISTICS(jniinvokation());
4156 return (jsize) u2_utflength(s->value->data, s->count);
4160 /* GetStringUTFChars ***********************************************************
4162 Returns a pointer to an array of UTF-8 characters of the
4163 string. This array is valid until it is released by
4164 ReleaseStringUTFChars().
4166 *******************************************************************************/
4168 const char *_Jv_JNI_GetStringUTFChars(JNIEnv *env, jstring string,
4173 STATISTICS(jniinvokation());
4181 u = javastring_toutf((java_lang_String *) string, false);
4190 /* ReleaseStringUTFChars *******************************************************
4192 Informs the VM that the native code no longer needs access to
4193 utf. The utf argument is a pointer derived from string using
4194 GetStringUTFChars().
4196 *******************************************************************************/
4198 void _Jv_JNI_ReleaseStringUTFChars(JNIEnv *env, jstring string, const char *utf)
4200 STATISTICS(jniinvokation());
4202 /* XXX we don't release utf chars right now, perhaps that should be done
4203 later. Since there is always one reference the garbage collector will
4208 /* Array Operations ***********************************************************/
4210 /* GetArrayLength **************************************************************
4212 Returns the number of elements in the array.
4214 *******************************************************************************/
4216 jsize _Jv_JNI_GetArrayLength(JNIEnv *env, jarray array)
4218 java_arrayheader *a;
4220 STATISTICS(jniinvokation());
4222 a = (java_arrayheader *) array;
4228 /* NewObjectArray **************************************************************
4230 Constructs a new array holding objects in class elementClass. All
4231 elements are initially set to initialElement.
4233 *******************************************************************************/
4235 jobjectArray _Jv_JNI_NewObjectArray(JNIEnv *env, jsize length,
4236 jclass elementClass, jobject initialElement)
4238 java_objectarray *oa;
4241 STATISTICS(jniinvokation());
4244 exceptions_throw_negativearraysizeexception();
4248 oa = builtin_anewarray(length, elementClass);
4253 /* set all elements to initialElement */
4255 for (i = 0; i < length; i++)
4256 oa->data[i] = initialElement;
4258 return (jobjectArray) _Jv_JNI_NewLocalRef(env, (jobject) oa);
4262 jobject _Jv_JNI_GetObjectArrayElement(JNIEnv *env, jobjectArray array,
4265 java_objectarray *oa;
4268 STATISTICS(jniinvokation());
4270 oa = (java_objectarray *) array;
4272 if (index >= oa->header.size) {
4273 exceptions_throw_arrayindexoutofboundsexception();
4277 o = oa->data[index];
4279 return _Jv_JNI_NewLocalRef(env, o);
4283 void _Jv_JNI_SetObjectArrayElement(JNIEnv *env, jobjectArray array,
4284 jsize index, jobject val)
4286 java_objectarray *oa;
4287 java_objectheader *o;
4289 STATISTICS(jniinvokation());
4291 oa = (java_objectarray *) array;
4292 o = (java_objectheader *) val;
4294 if (index >= oa->header.size) {
4295 exceptions_throw_arrayindexoutofboundsexception();
4299 /* check if the class of value is a subclass of the element class
4302 if (!builtin_canstore(oa, o)) {
4303 exceptions_throw_arraystoreexception();
4307 oa->data[index] = val;
4311 jbooleanArray _Jv_JNI_NewBooleanArray(JNIEnv *env, jsize len)
4313 java_booleanarray *ba;
4315 STATISTICS(jniinvokation());
4318 exceptions_throw_negativearraysizeexception();
4322 ba = builtin_newarray_boolean(len);
4324 return (jbooleanArray) _Jv_JNI_NewLocalRef(env, (jobject) ba);
4328 jbyteArray _Jv_JNI_NewByteArray(JNIEnv *env, jsize len)
4332 STATISTICS(jniinvokation());
4335 exceptions_throw_negativearraysizeexception();
4339 ba = builtin_newarray_byte(len);
4341 return (jbyteArray) _Jv_JNI_NewLocalRef(env, (jobject) ba);
4345 jcharArray _Jv_JNI_NewCharArray(JNIEnv *env, jsize len)
4349 STATISTICS(jniinvokation());
4352 exceptions_throw_negativearraysizeexception();
4356 ca = builtin_newarray_char(len);
4358 return (jcharArray) _Jv_JNI_NewLocalRef(env, (jobject) ca);
4362 jshortArray _Jv_JNI_NewShortArray(JNIEnv *env, jsize len)
4364 java_shortarray *sa;
4366 STATISTICS(jniinvokation());
4369 exceptions_throw_negativearraysizeexception();
4373 sa = builtin_newarray_short(len);
4375 return (jshortArray) _Jv_JNI_NewLocalRef(env, (jobject) sa);
4379 jintArray _Jv_JNI_NewIntArray(JNIEnv *env, jsize len)
4383 STATISTICS(jniinvokation());
4386 exceptions_throw_negativearraysizeexception();
4390 ia = builtin_newarray_int(len);
4392 return (jintArray) _Jv_JNI_NewLocalRef(env, (jobject) ia);
4396 jlongArray _Jv_JNI_NewLongArray(JNIEnv *env, jsize len)
4400 STATISTICS(jniinvokation());
4403 exceptions_throw_negativearraysizeexception();
4407 la = builtin_newarray_long(len);
4409 return (jlongArray) _Jv_JNI_NewLocalRef(env, (jobject) la);
4413 jfloatArray _Jv_JNI_NewFloatArray(JNIEnv *env, jsize len)
4415 java_floatarray *fa;
4417 STATISTICS(jniinvokation());
4420 exceptions_throw_negativearraysizeexception();
4424 fa = builtin_newarray_float(len);
4426 return (jfloatArray) _Jv_JNI_NewLocalRef(env, (jobject) fa);
4430 jdoubleArray _Jv_JNI_NewDoubleArray(JNIEnv *env, jsize len)
4432 java_doublearray *da;
4434 STATISTICS(jniinvokation());
4437 exceptions_throw_negativearraysizeexception();
4441 da = builtin_newarray_double(len);
4443 return (jdoubleArray) _Jv_JNI_NewLocalRef(env, (jobject) da);
4447 /* Get<PrimitiveType>ArrayElements *********************************************
4449 A family of functions that returns the body of the primitive array.
4451 *******************************************************************************/
4453 jboolean *_Jv_JNI_GetBooleanArrayElements(JNIEnv *env, jbooleanArray array,
4456 java_booleanarray *ba;
4458 STATISTICS(jniinvokation());
4460 ba = (java_booleanarray *) array;
4463 *isCopy = JNI_FALSE;
4469 jbyte *_Jv_JNI_GetByteArrayElements(JNIEnv *env, jbyteArray array,
4474 STATISTICS(jniinvokation());
4476 ba = (java_bytearray *) array;
4479 *isCopy = JNI_FALSE;
4485 jchar *_Jv_JNI_GetCharArrayElements(JNIEnv *env, jcharArray array,
4490 STATISTICS(jniinvokation());
4492 ca = (java_chararray *) array;
4495 *isCopy = JNI_FALSE;
4501 jshort *_Jv_JNI_GetShortArrayElements(JNIEnv *env, jshortArray array,
4504 java_shortarray *sa;
4506 STATISTICS(jniinvokation());
4508 sa = (java_shortarray *) array;
4511 *isCopy = JNI_FALSE;
4517 jint *_Jv_JNI_GetIntArrayElements(JNIEnv *env, jintArray array,
4522 STATISTICS(jniinvokation());
4524 ia = (java_intarray *) array;
4527 *isCopy = JNI_FALSE;
4533 jlong *_Jv_JNI_GetLongArrayElements(JNIEnv *env, jlongArray array,
4538 STATISTICS(jniinvokation());
4540 la = (java_longarray *) array;
4543 *isCopy = JNI_FALSE;
4545 /* We cast this one to prevent a compiler warning on 64-bit
4546 systems since GNU Classpath typedef jlong to long long. */
4548 return (jlong *) la->data;
4552 jfloat *_Jv_JNI_GetFloatArrayElements(JNIEnv *env, jfloatArray array,
4555 java_floatarray *fa;
4557 STATISTICS(jniinvokation());
4559 fa = (java_floatarray *) array;
4562 *isCopy = JNI_FALSE;
4568 jdouble *_Jv_JNI_GetDoubleArrayElements(JNIEnv *env, jdoubleArray array,
4571 java_doublearray *da;
4573 STATISTICS(jniinvokation());
4575 da = (java_doublearray *) array;
4578 *isCopy = JNI_FALSE;
4584 /* Release<PrimitiveType>ArrayElements *****************************************
4586 A family of functions that informs the VM that the native code no
4587 longer needs access to elems. The elems argument is a pointer
4588 derived from array using the corresponding
4589 Get<PrimitiveType>ArrayElements() function. If necessary, this
4590 function copies back all changes made to elems to the original
4593 *******************************************************************************/
4595 void _Jv_JNI_ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array,
4596 jboolean *elems, jint mode)
4598 java_booleanarray *ba;
4600 STATISTICS(jniinvokation());
4602 ba = (java_booleanarray *) array;
4604 if (elems != ba->data) {
4607 MCOPY(ba->data, elems, u1, ba->header.size);
4610 MCOPY(ba->data, elems, u1, ba->header.size);
4611 /* XXX TWISTI how should it be freed? */
4614 /* XXX TWISTI how should it be freed? */
4621 void _Jv_JNI_ReleaseByteArrayElements(JNIEnv *env, jbyteArray array,
4622 jbyte *elems, jint mode)
4626 STATISTICS(jniinvokation());
4628 ba = (java_bytearray *) array;
4630 if (elems != ba->data) {
4633 MCOPY(ba->data, elems, s1, ba->header.size);
4636 MCOPY(ba->data, elems, s1, ba->header.size);
4637 /* XXX TWISTI how should it be freed? */
4640 /* XXX TWISTI how should it be freed? */
4647 void _Jv_JNI_ReleaseCharArrayElements(JNIEnv *env, jcharArray array,
4648 jchar *elems, jint mode)
4652 STATISTICS(jniinvokation());
4654 ca = (java_chararray *) array;
4656 if (elems != ca->data) {
4659 MCOPY(ca->data, elems, u2, ca->header.size);
4662 MCOPY(ca->data, elems, u2, ca->header.size);
4663 /* XXX TWISTI how should it be freed? */
4666 /* XXX TWISTI how should it be freed? */
4673 void _Jv_JNI_ReleaseShortArrayElements(JNIEnv *env, jshortArray array,
4674 jshort *elems, jint mode)
4676 java_shortarray *sa;
4678 STATISTICS(jniinvokation());
4680 sa = (java_shortarray *) array;
4682 if (elems != sa->data) {
4685 MCOPY(sa->data, elems, s2, sa->header.size);
4688 MCOPY(sa->data, elems, s2, sa->header.size);
4689 /* XXX TWISTI how should it be freed? */
4692 /* XXX TWISTI how should it be freed? */
4699 void _Jv_JNI_ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems,
4704 STATISTICS(jniinvokation());
4706 ia = (java_intarray *) array;
4708 if (elems != ia->data) {
4711 MCOPY(ia->data, elems, s4, ia->header.size);
4714 MCOPY(ia->data, elems, s4, ia->header.size);
4715 /* XXX TWISTI how should it be freed? */
4718 /* XXX TWISTI how should it be freed? */
4725 void _Jv_JNI_ReleaseLongArrayElements(JNIEnv *env, jlongArray array,
4726 jlong *elems, jint mode)
4730 STATISTICS(jniinvokation());
4732 la = (java_longarray *) array;
4734 /* We cast this one to prevent a compiler warning on 64-bit
4735 systems since GNU Classpath typedef jlong to long long. */
4737 if ((s8 *) elems != la->data) {
4740 MCOPY(la->data, elems, s8, la->header.size);
4743 MCOPY(la->data, elems, s8, la->header.size);
4744 /* XXX TWISTI how should it be freed? */
4747 /* XXX TWISTI how should it be freed? */
4754 void _Jv_JNI_ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array,
4755 jfloat *elems, jint mode)
4757 java_floatarray *fa;
4759 STATISTICS(jniinvokation());
4761 fa = (java_floatarray *) array;
4763 if (elems != fa->data) {
4766 MCOPY(fa->data, elems, float, fa->header.size);
4769 MCOPY(fa->data, elems, float, fa->header.size);
4770 /* XXX TWISTI how should it be freed? */
4773 /* XXX TWISTI how should it be freed? */
4780 void _Jv_JNI_ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array,
4781 jdouble *elems, jint mode)
4783 java_doublearray *da;
4785 STATISTICS(jniinvokation());
4787 da = (java_doublearray *) array;
4789 if (elems != da->data) {
4792 MCOPY(da->data, elems, double, da->header.size);
4795 MCOPY(da->data, elems, double, da->header.size);
4796 /* XXX TWISTI how should it be freed? */
4799 /* XXX TWISTI how should it be freed? */
4806 /* Get<PrimitiveType>ArrayRegion **********************************************
4808 A family of functions that copies a region of a primitive array
4811 *******************************************************************************/
4813 void _Jv_JNI_GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array,
4814 jsize start, jsize len, jboolean *buf)
4816 java_booleanarray *ba;
4818 STATISTICS(jniinvokation());
4820 ba = (java_booleanarray *) array;
4822 if ((start < 0) || (len < 0) || (start + len > ba->header.size))
4823 exceptions_throw_arrayindexoutofboundsexception();
4825 MCOPY(buf, &ba->data[start], u1, len);
4829 void _Jv_JNI_GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start,
4830 jsize len, jbyte *buf)
4834 STATISTICS(jniinvokation());
4836 ba = (java_bytearray *) array;
4838 if ((start < 0) || (len < 0) || (start + len > ba->header.size))
4839 exceptions_throw_arrayindexoutofboundsexception();
4841 MCOPY(buf, &ba->data[start], s1, len);
4845 void _Jv_JNI_GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start,
4846 jsize len, jchar *buf)
4850 STATISTICS(jniinvokation());
4852 ca = (java_chararray *) array;
4854 if ((start < 0) || (len < 0) || (start + len > ca->header.size))
4855 exceptions_throw_arrayindexoutofboundsexception();
4857 MCOPY(buf, &ca->data[start], u2, len);
4861 void _Jv_JNI_GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
4862 jsize len, jshort *buf)
4864 java_shortarray *sa;
4866 STATISTICS(jniinvokation());
4868 sa = (java_shortarray *) array;
4870 if ((start < 0) || (len < 0) || (start + len > sa->header.size))
4871 exceptions_throw_arrayindexoutofboundsexception();
4873 MCOPY(buf, &sa->data[start], s2, len);
4877 void _Jv_JNI_GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start,
4878 jsize len, jint *buf)
4882 STATISTICS(jniinvokation());
4884 ia = (java_intarray *) array;
4886 if ((start < 0) || (len < 0) || (start + len > ia->header.size))
4887 exceptions_throw_arrayindexoutofboundsexception();
4889 MCOPY(buf, &ia->data[start], s4, len);
4893 void _Jv_JNI_GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start,
4894 jsize len, jlong *buf)
4898 STATISTICS(jniinvokation());
4900 la = (java_longarray *) array;
4902 if ((start < 0) || (len < 0) || (start + len > la->header.size))
4903 exceptions_throw_arrayindexoutofboundsexception();
4905 MCOPY(buf, &la->data[start], s8, len);
4909 void _Jv_JNI_GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
4910 jsize len, jfloat *buf)
4912 java_floatarray *fa;
4914 STATISTICS(jniinvokation());
4916 fa = (java_floatarray *) array;
4918 if ((start < 0) || (len < 0) || (start + len > fa->header.size))
4919 exceptions_throw_arrayindexoutofboundsexception();
4921 MCOPY(buf, &fa->data[start], float, len);
4925 void _Jv_JNI_GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
4926 jsize len, jdouble *buf)
4928 java_doublearray *da;
4930 STATISTICS(jniinvokation());
4932 da = (java_doublearray *) array;
4934 if ((start < 0) || (len < 0) || (start + len > da->header.size))
4935 exceptions_throw_arrayindexoutofboundsexception();
4937 MCOPY(buf, &da->data[start], double, len);
4941 /* Set<PrimitiveType>ArrayRegion **********************************************
4943 A family of functions that copies back a region of a primitive
4944 array from a buffer.
4946 *******************************************************************************/
4948 void _Jv_JNI_SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array,
4949 jsize start, jsize len, jboolean *buf)
4951 java_booleanarray *ba;
4953 STATISTICS(jniinvokation());
4955 ba = (java_booleanarray *) array;
4957 if ((start < 0) || (len < 0) || (start + len > ba->header.size))
4958 exceptions_throw_arrayindexoutofboundsexception();
4960 MCOPY(&ba->data[start], buf, u1, len);
4964 void _Jv_JNI_SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start,
4965 jsize len, jbyte *buf)
4969 STATISTICS(jniinvokation());
4971 ba = (java_bytearray *) array;
4973 if ((start < 0) || (len < 0) || (start + len > ba->header.size))
4974 exceptions_throw_arrayindexoutofboundsexception();
4976 MCOPY(&ba->data[start], buf, s1, len);
4980 void _Jv_JNI_SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start,
4981 jsize len, jchar *buf)
4985 STATISTICS(jniinvokation());
4987 ca = (java_chararray *) array;
4989 if ((start < 0) || (len < 0) || (start + len > ca->header.size))
4990 exceptions_throw_arrayindexoutofboundsexception();
4992 MCOPY(&ca->data[start], buf, u2, len);
4996 void _Jv_JNI_SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
4997 jsize len, jshort *buf)
4999 java_shortarray *sa;
5001 STATISTICS(jniinvokation());
5003 sa = (java_shortarray *) array;
5005 if ((start < 0) || (len < 0) || (start + len > sa->header.size))
5006 exceptions_throw_arrayindexoutofboundsexception();
5008 MCOPY(&sa->data[start], buf, s2, len);
5012 void _Jv_JNI_SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start,
5013 jsize len, jint *buf)
5017 STATISTICS(jniinvokation());
5019 ia = (java_intarray *) array;
5021 if ((start < 0) || (len < 0) || (start + len > ia->header.size))
5022 exceptions_throw_arrayindexoutofboundsexception();
5024 MCOPY(&ia->data[start], buf, s4, len);
5028 void _Jv_JNI_SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start,
5029 jsize len, jlong *buf)
5033 STATISTICS(jniinvokation());
5035 la = (java_longarray *) array;
5037 if ((start < 0) || (len < 0) || (start + len > la->header.size))
5038 exceptions_throw_arrayindexoutofboundsexception();
5040 MCOPY(&la->data[start], buf, s8, len);
5044 void _Jv_JNI_SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
5045 jsize len, jfloat *buf)
5047 java_floatarray *fa;
5049 STATISTICS(jniinvokation());
5051 fa = (java_floatarray *) array;
5053 if ((start < 0) || (len < 0) || (start + len > fa->header.size))
5054 exceptions_throw_arrayindexoutofboundsexception();
5056 MCOPY(&fa->data[start], buf, float, len);
5060 void _Jv_JNI_SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
5061 jsize len, jdouble *buf)
5063 java_doublearray *da;
5065 STATISTICS(jniinvokation());
5067 da = (java_doublearray *) array;
5069 if ((start < 0) || (len < 0) || (start + len > da->header.size))
5070 exceptions_throw_arrayindexoutofboundsexception();
5072 MCOPY(&da->data[start], buf, double, len);
5076 /* Registering Native Methods *************************************************/
5078 /* RegisterNatives *************************************************************
5080 Registers native methods with the class specified by the clazz
5081 argument. The methods parameter specifies an array of
5082 JNINativeMethod structures that contain the names, signatures, and
5083 function pointers of the native methods. The nMethods parameter
5084 specifies the number of native methods in the array.
5086 *******************************************************************************/
5088 jint _Jv_JNI_RegisterNatives(JNIEnv *env, jclass clazz,
5089 const JNINativeMethod *methods, jint nMethods)
5091 STATISTICS(jniinvokation());
5093 log_text("JNI-Call: RegisterNatives: IMPLEMENT ME!!!");
5094 /* XXX: if implemented this needs a call to jvmti_NativeMethodBind
5095 if (jvmti) jvmti_NativeMethodBind(method, address, new_address_ptr);
5102 /* UnregisterNatives ***********************************************************
5104 Unregisters native methods of a class. The class goes back to the
5105 state before it was linked or registered with its native method
5108 This function should not be used in normal native code. Instead, it
5109 provides special programs a way to reload and relink native
5112 *******************************************************************************/
5114 jint _Jv_JNI_UnregisterNatives(JNIEnv *env, jclass clazz)
5116 STATISTICS(jniinvokation());
5118 /* XXX TWISTI hmm, maybe we should not support that (like kaffe) */
5120 log_text("JNI-Call: UnregisterNatives: IMPLEMENT ME!!!");
5126 /* Monitor Operations *********************************************************/
5128 /* MonitorEnter ****************************************************************
5130 Enters the monitor associated with the underlying Java object
5133 *******************************************************************************/
5135 jint _Jv_JNI_MonitorEnter(JNIEnv *env, jobject obj)
5137 STATISTICS(jniinvokation());
5140 exceptions_throw_nullpointerexception();
5144 LOCK_MONITOR_ENTER(obj);
5150 /* MonitorExit *****************************************************************
5152 The current thread must be the owner of the monitor associated with
5153 the underlying Java object referred to by obj. The thread
5154 decrements the counter indicating the number of times it has
5155 entered this monitor. If the value of the counter becomes zero, the
5156 current thread releases the monitor.
5158 *******************************************************************************/
5160 jint _Jv_JNI_MonitorExit(JNIEnv *env, jobject obj)
5162 STATISTICS(jniinvokation());
5165 exceptions_throw_nullpointerexception();
5169 LOCK_MONITOR_EXIT(obj);
5175 /* JavaVM Interface ***********************************************************/
5177 /* GetJavaVM *******************************************************************
5179 Returns the Java VM interface (used in the Invocation API)
5180 associated with the current thread. The result is placed at the
5181 location pointed to by the second argument, vm.
5183 *******************************************************************************/
5185 jint _Jv_JNI_GetJavaVM(JNIEnv *env, JavaVM **vm)
5187 STATISTICS(jniinvokation());
5189 *vm = (JavaVM *) _Jv_jvm;
5195 /* GetStringRegion *************************************************************
5197 Copies len number of Unicode characters beginning at offset start
5198 to the given buffer buf.
5200 Throws StringIndexOutOfBoundsException on index overflow.
5202 *******************************************************************************/
5204 void _Jv_JNI_GetStringRegion(JNIEnv* env, jstring str, jsize start, jsize len,
5207 java_lang_String *s;
5210 STATISTICS(jniinvokation());
5212 s = (java_lang_String *) str;
5215 if ((start < 0) || (len < 0) || (start > s->count) ||
5216 (start + len > s->count)) {
5217 exceptions_throw_stringindexoutofboundsexception();
5221 MCOPY(buf, &ca->data[start], u2, len);
5225 void _Jv_JNI_GetStringUTFRegion(JNIEnv* env, jstring str, jsize start,
5226 jsize len, char *buf)
5228 STATISTICS(jniinvokation());
5230 log_text("JNI-Call: GetStringUTFRegion: IMPLEMENT ME!");
5234 /* GetPrimitiveArrayCritical ***************************************************
5236 Obtain a direct pointer to array elements.
5238 *******************************************************************************/
5240 void *_Jv_JNI_GetPrimitiveArrayCritical(JNIEnv *env, jarray array,
5246 ba = (java_bytearray *) array;
5248 /* do the same as Kaffe does */
5250 bp = _Jv_JNI_GetByteArrayElements(env, ba, isCopy);
5256 /* ReleasePrimitiveArrayCritical ***********************************************
5258 No specific documentation.
5260 *******************************************************************************/
5262 void _Jv_JNI_ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array,
5263 void *carray, jint mode)
5265 STATISTICS(jniinvokation());
5267 /* do the same as Kaffe does */
5269 _Jv_JNI_ReleaseByteArrayElements(env, (jbyteArray) array, (jbyte *) carray,
5274 /* GetStringCritical ***********************************************************
5276 The semantics of these two functions are similar to the existing
5277 Get/ReleaseStringChars functions.
5279 *******************************************************************************/
5281 const jchar *_Jv_JNI_GetStringCritical(JNIEnv *env, jstring string,
5284 STATISTICS(jniinvokation());
5286 return _Jv_JNI_GetStringChars(env, string, isCopy);
5290 void _Jv_JNI_ReleaseStringCritical(JNIEnv *env, jstring string,
5291 const jchar *cstring)
5293 STATISTICS(jniinvokation());
5295 _Jv_JNI_ReleaseStringChars(env, string, cstring);
5299 jweak _Jv_JNI_NewWeakGlobalRef(JNIEnv* env, jobject obj)
5301 STATISTICS(jniinvokation());
5303 log_text("JNI-Call: NewWeakGlobalRef: IMPLEMENT ME!");
5309 void _Jv_JNI_DeleteWeakGlobalRef(JNIEnv* env, jweak ref)
5311 STATISTICS(jniinvokation());
5313 log_text("JNI-Call: DeleteWeakGlobalRef: IMPLEMENT ME");
5317 /* NewGlobalRef ****************************************************************
5319 Creates a new global reference to the object referred to by the obj
5322 *******************************************************************************/
5324 jobject _Jv_JNI_NewGlobalRef(JNIEnv* env, jobject obj)
5326 hashtable_global_ref_entry *gre;
5327 u4 key; /* hashkey */
5328 u4 slot; /* slot in hashtable */
5330 STATISTICS(jniinvokation());
5332 LOCK_MONITOR_ENTER(hashtable_global_ref->header);
5334 /* normally addresses are aligned to 4, 8 or 16 bytes */
5336 key = ((u4) (ptrint) obj) >> 4; /* align to 16-byte boundaries */
5337 slot = key & (hashtable_global_ref->size - 1);
5338 gre = hashtable_global_ref->ptr[slot];
5340 /* search external hash chain for the entry */
5343 if (gre->o == obj) {
5344 /* global object found, increment the reference */
5348 LOCK_MONITOR_EXIT(hashtable_global_ref->header);
5353 gre = gre->hashlink; /* next element in external chain */
5356 /* global ref not found, create a new one */
5358 gre = NEW(hashtable_global_ref_entry);
5363 /* insert entry into hashtable */
5365 gre->hashlink = hashtable_global_ref->ptr[slot];
5367 hashtable_global_ref->ptr[slot] = gre;
5369 /* update number of hashtable-entries */
5371 hashtable_global_ref->entries++;
5373 LOCK_MONITOR_EXIT(hashtable_global_ref->header);
5379 /* DeleteGlobalRef *************************************************************
5381 Deletes the global reference pointed to by globalRef.
5383 *******************************************************************************/
5385 void _Jv_JNI_DeleteGlobalRef(JNIEnv* env, jobject globalRef)
5387 hashtable_global_ref_entry *gre;
5388 hashtable_global_ref_entry *prevgre;
5389 u4 key; /* hashkey */
5390 u4 slot; /* slot in hashtable */
5392 STATISTICS(jniinvokation());
5394 LOCK_MONITOR_ENTER(hashtable_global_ref->header);
5396 /* normally addresses are aligned to 4, 8 or 16 bytes */
5398 key = ((u4) (ptrint) globalRef) >> 4; /* align to 16-byte boundaries */
5399 slot = key & (hashtable_global_ref->size - 1);
5400 gre = hashtable_global_ref->ptr[slot];
5402 /* initialize prevgre */
5406 /* search external hash chain for the entry */
5409 if (gre->o == globalRef) {
5410 /* global object found, decrement the reference count */
5414 /* if reference count is 0, remove the entry */
5416 if (gre->refs == 0) {
5417 /* special handling if it's the first in the chain */
5419 if (prevgre == NULL)
5420 hashtable_global_ref->ptr[slot] = gre->hashlink;
5422 prevgre->hashlink = gre->hashlink;
5424 FREE(gre, hashtable_global_ref_entry);
5427 LOCK_MONITOR_EXIT(hashtable_global_ref->header);
5432 prevgre = gre; /* save current pointer for removal */
5433 gre = gre->hashlink; /* next element in external chain */
5436 log_println("JNI-DeleteGlobalRef: global reference not found");
5438 LOCK_MONITOR_EXIT(hashtable_global_ref->header);
5442 /* ExceptionCheck **************************************************************
5444 Returns JNI_TRUE when there is a pending exception; otherwise,
5447 *******************************************************************************/
5449 jboolean _Jv_JNI_ExceptionCheck(JNIEnv *env)
5451 java_objectheader *o;
5453 STATISTICS(jniinvokation());
5455 o = exceptions_get_exception();
5457 return (o != NULL) ? JNI_TRUE : JNI_FALSE;
5461 /* New JNI 1.4 functions ******************************************************/
5463 /* NewDirectByteBuffer *********************************************************
5465 Allocates and returns a direct java.nio.ByteBuffer referring to the
5466 block of memory starting at the memory address address and
5467 extending capacity bytes.
5469 *******************************************************************************/
5471 jobject _Jv_JNI_NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
5473 #if defined(ENABLE_JAVASE)
5474 java_objectheader *nbuf;
5475 # if SIZEOF_VOID_P == 8
5476 gnu_classpath_Pointer64 *paddress;
5478 gnu_classpath_Pointer32 *paddress;
5481 STATISTICS(jniinvokation());
5483 /* alocate a gnu.classpath.Pointer{32,64} object */
5485 # if SIZEOF_VOID_P == 8
5486 if (!(paddress = (gnu_classpath_Pointer64 *)
5487 builtin_new(class_gnu_classpath_Pointer64)))
5489 if (!(paddress = (gnu_classpath_Pointer32 *)
5490 builtin_new(class_gnu_classpath_Pointer32)))
5494 /* fill gnu.classpath.Pointer{32,64} with address */
5496 paddress->data = (ptrint) address;
5498 /* create a java.nio.DirectByteBufferImpl$ReadWrite object */
5500 nbuf = (*env)->NewObject(env, class_java_nio_DirectByteBufferImpl_ReadWrite,
5501 (jmethodID) dbbirw_init, NULL, paddress,
5502 (jint) capacity, (jint) capacity, (jint) 0);
5504 /* add local reference and return the value */
5506 return _Jv_JNI_NewLocalRef(env, nbuf);
5508 vm_abort("_Jv_JNI_NewDirectByteBuffer: not implemented in this configuration");
5510 /* keep compiler happy */
5517 /* GetDirectBufferAddress ******************************************************
5519 Fetches and returns the starting address of the memory region
5520 referenced by the given direct java.nio.Buffer.
5522 *******************************************************************************/
5524 void *_Jv_JNI_GetDirectBufferAddress(JNIEnv *env, jobject buf)
5526 #if defined(ENABLE_JAVASE)
5527 java_nio_DirectByteBufferImpl *nbuf;
5528 # if SIZEOF_VOID_P == 8
5529 gnu_classpath_Pointer64 *address;
5531 gnu_classpath_Pointer32 *address;
5534 STATISTICS(jniinvokation());
5536 if (!builtin_instanceof(buf, class_java_nio_Buffer))
5539 nbuf = (java_nio_DirectByteBufferImpl *) buf;
5541 # if SIZEOF_VOID_P == 8
5542 address = (gnu_classpath_Pointer64 *) nbuf->address;
5544 address = (gnu_classpath_Pointer32 *) nbuf->address;
5547 if (address == NULL)
5550 return (void *) address->data;
5552 vm_abort("_Jv_JNI_GetDirectBufferAddress: not implemented in this configuration");
5554 /* keep compiler happy */
5561 /* GetDirectBufferCapacity *****************************************************
5563 Fetches and returns the capacity in bytes of the memory region
5564 referenced by the given direct java.nio.Buffer.
5566 *******************************************************************************/
5568 jlong _Jv_JNI_GetDirectBufferCapacity(JNIEnv* env, jobject buf)
5570 #if defined(ENABLE_JAVASE)
5571 java_nio_Buffer *nbuf;
5573 STATISTICS(jniinvokation());
5575 if (!builtin_instanceof(buf, class_java_nio_DirectByteBufferImpl))
5578 nbuf = (java_nio_Buffer *) buf;
5580 return (jlong) nbuf->cap;
5582 vm_abort("_Jv_JNI_GetDirectBufferCapacity: not implemented in this configuration");
5584 /* keep compiler happy */
5591 /* DestroyJavaVM ***************************************************************
5593 Unloads a Java VM and reclaims its resources. Only the main thread
5594 can unload the VM. The system waits until the main thread is only
5595 remaining user thread before it destroys the VM.
5597 *******************************************************************************/
5599 jint _Jv_JNI_DestroyJavaVM(JavaVM *vm)
5603 STATISTICS(jniinvokation());
5605 status = vm_destroy(vm);
5611 /* AttachCurrentThread *********************************************************
5613 Attaches the current thread to a Java VM. Returns a JNI interface
5614 pointer in the JNIEnv argument.
5616 Trying to attach a thread that is already attached is a no-op.
5618 A native thread cannot be attached simultaneously to two Java VMs.
5620 When a thread is attached to the VM, the context class loader is
5621 the bootstrap loader.
5623 *******************************************************************************/
5625 static s4 jni_attach_current_thread(void **p_env, void *thr_args, bool isdaemon)
5627 JavaVMAttachArgs *vm_aargs;
5629 #if defined(ENABLE_THREADS)
5630 if (threads_get_current_threadobject() == NULL) {
5631 vm_aargs = (JavaVMAttachArgs *) thr_args;
5633 if (vm_aargs != NULL) {
5634 if ((vm_aargs->version != JNI_VERSION_1_2) &&
5635 (vm_aargs->version != JNI_VERSION_1_4))
5636 return JNI_EVERSION;
5639 if (!threads_attach_current_thread(vm_aargs, false))
5642 if (!jni_init_localref_table())
5653 jint _Jv_JNI_AttachCurrentThread(JavaVM *vm, void **p_env, void *thr_args)
5655 STATISTICS(jniinvokation());
5657 return jni_attach_current_thread(p_env, thr_args, false);
5661 /* DetachCurrentThread *********************************************************
5663 Detaches the current thread from a Java VM. All Java monitors held
5664 by this thread are released. All Java threads waiting for this
5665 thread to die are notified.
5667 In JDK 1.1, the main thread cannot be detached from the VM. It must
5668 call DestroyJavaVM to unload the entire VM.
5670 In the JDK, the main thread can be detached from the VM.
5672 The main thread, which is the thread that created the Java VM,
5673 cannot be detached from the VM. Instead, the main thread must call
5674 JNI_DestroyJavaVM() to unload the entire VM.
5676 *******************************************************************************/
5678 jint _Jv_JNI_DetachCurrentThread(JavaVM *vm)
5680 #if defined(ENABLE_THREADS)
5681 threadobject *thread;
5683 STATISTICS(jniinvokation());
5685 thread = threads_get_current_threadobject();
5690 if (!threads_detach_thread(thread))
5698 /* GetEnv **********************************************************************
5700 If the current thread is not attached to the VM, sets *env to NULL,
5701 and returns JNI_EDETACHED. If the specified version is not
5702 supported, sets *env to NULL, and returns JNI_EVERSION. Otherwise,
5703 sets *env to the appropriate interface, and returns JNI_OK.
5705 *******************************************************************************/
5707 jint _Jv_JNI_GetEnv(JavaVM *vm, void **env, jint version)
5709 STATISTICS(jniinvokation());
5711 #if defined(ENABLE_THREADS)
5712 if (threads_get_current_threadobject() == NULL) {
5715 return JNI_EDETACHED;
5719 /* check the JNI version */
5722 case JNI_VERSION_1_1:
5723 case JNI_VERSION_1_2:
5724 case JNI_VERSION_1_4:
5732 #if defined(ENABLE_JVMTI)
5733 if ((version & JVMTI_VERSION_MASK_INTERFACE_TYPE)
5734 == JVMTI_VERSION_INTERFACE_JVMTI) {
5736 *env = (void *) jvmti_new_environment();
5745 return JNI_EVERSION;
5749 /* AttachCurrentThreadAsDaemon *************************************************
5751 Same semantics as AttachCurrentThread, but the newly-created
5752 java.lang.Thread instance is a daemon.
5754 If the thread has already been attached via either
5755 AttachCurrentThread or AttachCurrentThreadAsDaemon, this routine
5756 simply sets the value pointed to by penv to the JNIEnv of the
5757 current thread. In this case neither AttachCurrentThread nor this
5758 routine have any effect on the daemon status of the thread.
5760 *******************************************************************************/
5762 jint _Jv_JNI_AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *args)
5764 STATISTICS(jniinvokation());
5766 return jni_attach_current_thread(penv, args, true);
5770 /* JNI invocation table *******************************************************/
5772 const struct JNIInvokeInterface _Jv_JNIInvokeInterface = {
5777 _Jv_JNI_DestroyJavaVM,
5778 _Jv_JNI_AttachCurrentThread,
5779 _Jv_JNI_DetachCurrentThread,
5781 _Jv_JNI_AttachCurrentThreadAsDaemon
5785 /* JNI function table *********************************************************/
5787 struct JNINativeInterface _Jv_JNINativeInterface = {
5794 _Jv_JNI_DefineClass,
5796 _Jv_JNI_FromReflectedMethod,
5797 _Jv_JNI_FromReflectedField,
5798 _Jv_JNI_ToReflectedMethod,
5799 _Jv_JNI_GetSuperclass,
5800 _Jv_JNI_IsAssignableFrom,
5801 _Jv_JNI_ToReflectedField,
5805 _Jv_JNI_ExceptionOccurred,
5806 _Jv_JNI_ExceptionDescribe,
5807 _Jv_JNI_ExceptionClear,
5809 _Jv_JNI_PushLocalFrame,
5810 _Jv_JNI_PopLocalFrame,
5812 _Jv_JNI_NewGlobalRef,
5813 _Jv_JNI_DeleteGlobalRef,
5814 _Jv_JNI_DeleteLocalRef,
5815 _Jv_JNI_IsSameObject,
5816 _Jv_JNI_NewLocalRef,
5817 _Jv_JNI_EnsureLocalCapacity,
5819 _Jv_JNI_AllocObject,
5824 _Jv_JNI_GetObjectClass,
5825 _Jv_JNI_IsInstanceOf,
5827 _Jv_JNI_GetMethodID,
5829 _Jv_JNI_CallObjectMethod,
5830 _Jv_JNI_CallObjectMethodV,
5831 _Jv_JNI_CallObjectMethodA,
5832 _Jv_JNI_CallBooleanMethod,
5833 _Jv_JNI_CallBooleanMethodV,
5834 _Jv_JNI_CallBooleanMethodA,
5835 _Jv_JNI_CallByteMethod,
5836 _Jv_JNI_CallByteMethodV,
5837 _Jv_JNI_CallByteMethodA,
5838 _Jv_JNI_CallCharMethod,
5839 _Jv_JNI_CallCharMethodV,
5840 _Jv_JNI_CallCharMethodA,
5841 _Jv_JNI_CallShortMethod,
5842 _Jv_JNI_CallShortMethodV,
5843 _Jv_JNI_CallShortMethodA,
5844 _Jv_JNI_CallIntMethod,
5845 _Jv_JNI_CallIntMethodV,
5846 _Jv_JNI_CallIntMethodA,
5847 _Jv_JNI_CallLongMethod,
5848 _Jv_JNI_CallLongMethodV,
5849 _Jv_JNI_CallLongMethodA,
5850 _Jv_JNI_CallFloatMethod,
5851 _Jv_JNI_CallFloatMethodV,
5852 _Jv_JNI_CallFloatMethodA,
5853 _Jv_JNI_CallDoubleMethod,
5854 _Jv_JNI_CallDoubleMethodV,
5855 _Jv_JNI_CallDoubleMethodA,
5856 _Jv_JNI_CallVoidMethod,
5857 _Jv_JNI_CallVoidMethodV,
5858 _Jv_JNI_CallVoidMethodA,
5860 _Jv_JNI_CallNonvirtualObjectMethod,
5861 _Jv_JNI_CallNonvirtualObjectMethodV,
5862 _Jv_JNI_CallNonvirtualObjectMethodA,
5863 _Jv_JNI_CallNonvirtualBooleanMethod,
5864 _Jv_JNI_CallNonvirtualBooleanMethodV,
5865 _Jv_JNI_CallNonvirtualBooleanMethodA,
5866 _Jv_JNI_CallNonvirtualByteMethod,
5867 _Jv_JNI_CallNonvirtualByteMethodV,
5868 _Jv_JNI_CallNonvirtualByteMethodA,
5869 _Jv_JNI_CallNonvirtualCharMethod,
5870 _Jv_JNI_CallNonvirtualCharMethodV,
5871 _Jv_JNI_CallNonvirtualCharMethodA,
5872 _Jv_JNI_CallNonvirtualShortMethod,
5873 _Jv_JNI_CallNonvirtualShortMethodV,
5874 _Jv_JNI_CallNonvirtualShortMethodA,
5875 _Jv_JNI_CallNonvirtualIntMethod,
5876 _Jv_JNI_CallNonvirtualIntMethodV,
5877 _Jv_JNI_CallNonvirtualIntMethodA,
5878 _Jv_JNI_CallNonvirtualLongMethod,
5879 _Jv_JNI_CallNonvirtualLongMethodV,
5880 _Jv_JNI_CallNonvirtualLongMethodA,
5881 _Jv_JNI_CallNonvirtualFloatMethod,
5882 _Jv_JNI_CallNonvirtualFloatMethodV,
5883 _Jv_JNI_CallNonvirtualFloatMethodA,
5884 _Jv_JNI_CallNonvirtualDoubleMethod,
5885 _Jv_JNI_CallNonvirtualDoubleMethodV,
5886 _Jv_JNI_CallNonvirtualDoubleMethodA,
5887 _Jv_JNI_CallNonvirtualVoidMethod,
5888 _Jv_JNI_CallNonvirtualVoidMethodV,
5889 _Jv_JNI_CallNonvirtualVoidMethodA,
5893 _Jv_JNI_GetObjectField,
5894 _Jv_JNI_GetBooleanField,
5895 _Jv_JNI_GetByteField,
5896 _Jv_JNI_GetCharField,
5897 _Jv_JNI_GetShortField,
5898 _Jv_JNI_GetIntField,
5899 _Jv_JNI_GetLongField,
5900 _Jv_JNI_GetFloatField,
5901 _Jv_JNI_GetDoubleField,
5902 _Jv_JNI_SetObjectField,
5903 _Jv_JNI_SetBooleanField,
5904 _Jv_JNI_SetByteField,
5905 _Jv_JNI_SetCharField,
5906 _Jv_JNI_SetShortField,
5907 _Jv_JNI_SetIntField,
5908 _Jv_JNI_SetLongField,
5909 _Jv_JNI_SetFloatField,
5910 _Jv_JNI_SetDoubleField,
5912 _Jv_JNI_GetStaticMethodID,
5914 _Jv_JNI_CallStaticObjectMethod,
5915 _Jv_JNI_CallStaticObjectMethodV,
5916 _Jv_JNI_CallStaticObjectMethodA,
5917 _Jv_JNI_CallStaticBooleanMethod,
5918 _Jv_JNI_CallStaticBooleanMethodV,
5919 _Jv_JNI_CallStaticBooleanMethodA,
5920 _Jv_JNI_CallStaticByteMethod,
5921 _Jv_JNI_CallStaticByteMethodV,
5922 _Jv_JNI_CallStaticByteMethodA,
5923 _Jv_JNI_CallStaticCharMethod,
5924 _Jv_JNI_CallStaticCharMethodV,
5925 _Jv_JNI_CallStaticCharMethodA,
5926 _Jv_JNI_CallStaticShortMethod,
5927 _Jv_JNI_CallStaticShortMethodV,
5928 _Jv_JNI_CallStaticShortMethodA,
5929 _Jv_JNI_CallStaticIntMethod,
5930 _Jv_JNI_CallStaticIntMethodV,
5931 _Jv_JNI_CallStaticIntMethodA,
5932 _Jv_JNI_CallStaticLongMethod,
5933 _Jv_JNI_CallStaticLongMethodV,
5934 _Jv_JNI_CallStaticLongMethodA,
5935 _Jv_JNI_CallStaticFloatMethod,
5936 _Jv_JNI_CallStaticFloatMethodV,
5937 _Jv_JNI_CallStaticFloatMethodA,
5938 _Jv_JNI_CallStaticDoubleMethod,
5939 _Jv_JNI_CallStaticDoubleMethodV,
5940 _Jv_JNI_CallStaticDoubleMethodA,
5941 _Jv_JNI_CallStaticVoidMethod,
5942 _Jv_JNI_CallStaticVoidMethodV,
5943 _Jv_JNI_CallStaticVoidMethodA,
5945 _Jv_JNI_GetStaticFieldID,
5947 _Jv_JNI_GetStaticObjectField,
5948 _Jv_JNI_GetStaticBooleanField,
5949 _Jv_JNI_GetStaticByteField,
5950 _Jv_JNI_GetStaticCharField,
5951 _Jv_JNI_GetStaticShortField,
5952 _Jv_JNI_GetStaticIntField,
5953 _Jv_JNI_GetStaticLongField,
5954 _Jv_JNI_GetStaticFloatField,
5955 _Jv_JNI_GetStaticDoubleField,
5956 _Jv_JNI_SetStaticObjectField,
5957 _Jv_JNI_SetStaticBooleanField,
5958 _Jv_JNI_SetStaticByteField,
5959 _Jv_JNI_SetStaticCharField,
5960 _Jv_JNI_SetStaticShortField,
5961 _Jv_JNI_SetStaticIntField,
5962 _Jv_JNI_SetStaticLongField,
5963 _Jv_JNI_SetStaticFloatField,
5964 _Jv_JNI_SetStaticDoubleField,
5967 _Jv_JNI_GetStringLength,
5968 _Jv_JNI_GetStringChars,
5969 _Jv_JNI_ReleaseStringChars,
5971 _Jv_JNI_NewStringUTF,
5972 _Jv_JNI_GetStringUTFLength,
5973 _Jv_JNI_GetStringUTFChars,
5974 _Jv_JNI_ReleaseStringUTFChars,
5976 _Jv_JNI_GetArrayLength,
5978 _Jv_JNI_NewObjectArray,
5979 _Jv_JNI_GetObjectArrayElement,
5980 _Jv_JNI_SetObjectArrayElement,
5982 _Jv_JNI_NewBooleanArray,
5983 _Jv_JNI_NewByteArray,
5984 _Jv_JNI_NewCharArray,
5985 _Jv_JNI_NewShortArray,
5986 _Jv_JNI_NewIntArray,
5987 _Jv_JNI_NewLongArray,
5988 _Jv_JNI_NewFloatArray,
5989 _Jv_JNI_NewDoubleArray,
5991 _Jv_JNI_GetBooleanArrayElements,
5992 _Jv_JNI_GetByteArrayElements,
5993 _Jv_JNI_GetCharArrayElements,
5994 _Jv_JNI_GetShortArrayElements,
5995 _Jv_JNI_GetIntArrayElements,
5996 _Jv_JNI_GetLongArrayElements,
5997 _Jv_JNI_GetFloatArrayElements,
5998 _Jv_JNI_GetDoubleArrayElements,
6000 _Jv_JNI_ReleaseBooleanArrayElements,
6001 _Jv_JNI_ReleaseByteArrayElements,
6002 _Jv_JNI_ReleaseCharArrayElements,
6003 _Jv_JNI_ReleaseShortArrayElements,
6004 _Jv_JNI_ReleaseIntArrayElements,
6005 _Jv_JNI_ReleaseLongArrayElements,
6006 _Jv_JNI_ReleaseFloatArrayElements,
6007 _Jv_JNI_ReleaseDoubleArrayElements,
6009 _Jv_JNI_GetBooleanArrayRegion,
6010 _Jv_JNI_GetByteArrayRegion,
6011 _Jv_JNI_GetCharArrayRegion,
6012 _Jv_JNI_GetShortArrayRegion,
6013 _Jv_JNI_GetIntArrayRegion,
6014 _Jv_JNI_GetLongArrayRegion,
6015 _Jv_JNI_GetFloatArrayRegion,
6016 _Jv_JNI_GetDoubleArrayRegion,
6017 _Jv_JNI_SetBooleanArrayRegion,
6018 _Jv_JNI_SetByteArrayRegion,
6019 _Jv_JNI_SetCharArrayRegion,
6020 _Jv_JNI_SetShortArrayRegion,
6021 _Jv_JNI_SetIntArrayRegion,
6022 _Jv_JNI_SetLongArrayRegion,
6023 _Jv_JNI_SetFloatArrayRegion,
6024 _Jv_JNI_SetDoubleArrayRegion,
6026 _Jv_JNI_RegisterNatives,
6027 _Jv_JNI_UnregisterNatives,
6029 _Jv_JNI_MonitorEnter,
6030 _Jv_JNI_MonitorExit,
6034 /* new JNI 1.2 functions */
6036 _Jv_JNI_GetStringRegion,
6037 _Jv_JNI_GetStringUTFRegion,
6039 _Jv_JNI_GetPrimitiveArrayCritical,
6040 _Jv_JNI_ReleasePrimitiveArrayCritical,
6042 _Jv_JNI_GetStringCritical,
6043 _Jv_JNI_ReleaseStringCritical,
6045 _Jv_JNI_NewWeakGlobalRef,
6046 _Jv_JNI_DeleteWeakGlobalRef,
6048 _Jv_JNI_ExceptionCheck,
6050 /* new JNI 1.4 functions */
6052 _Jv_JNI_NewDirectByteBuffer,
6053 _Jv_JNI_GetDirectBufferAddress,
6054 _Jv_JNI_GetDirectBufferCapacity
6058 /* Invocation API Functions ***************************************************/
6060 /* JNI_GetDefaultJavaVMInitArgs ************************************************
6062 Returns a default configuration for the Java VM.
6064 *******************************************************************************/
6066 jint JNI_GetDefaultJavaVMInitArgs(void *vm_args)
6068 JavaVMInitArgs *_vm_args;
6070 _vm_args = (JavaVMInitArgs *) vm_args;
6072 /* GNU classpath currently supports JNI 1.2 */
6074 switch (_vm_args->version) {
6075 case JNI_VERSION_1_1:
6076 _vm_args->version = JNI_VERSION_1_1;
6079 case JNI_VERSION_1_2:
6080 case JNI_VERSION_1_4:
6081 _vm_args->ignoreUnrecognized = JNI_FALSE;
6082 _vm_args->options = NULL;
6083 _vm_args->nOptions = 0;
6094 /* JNI_GetCreatedJavaVMs *******************************************************
6096 Returns all Java VMs that have been created. Pointers to VMs are written in
6097 the buffer vmBuf in the order they are created. At most bufLen number of
6098 entries will be written. The total number of created VMs is returned in
6101 *******************************************************************************/
6103 jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
6105 log_text("JNI_GetCreatedJavaVMs: IMPLEMENT ME!!!");
6111 /* JNI_CreateJavaVM ************************************************************
6113 Loads and initializes a Java VM. The current thread becomes the main thread.
6114 Sets the env argument to the JNI interface pointer of the main thread.
6116 *******************************************************************************/
6118 jint JNI_CreateJavaVM(JavaVM **p_vm, void **p_env, void *vm_args)
6120 /* actually create the JVM */
6122 if (!vm_createjvm(p_vm, p_env, vm_args))
6130 * These are local overrides for various environment variables in Emacs.
6131 * Please do not remove this and leave it at the end of the file, where
6132 * Emacs will automagically detect them.
6133 * ---------------------------------------------------------------------
6136 * indent-tabs-mode: t
6140 * vim:noexpandtab:sw=4:ts=4: