1 /* src/native/jni.c - implementation of the Java Native Interface functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
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., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Rainhard Grafl
30 Changes: Joseph Wenninger
34 $Id: jni.c 2425 2005-04-30 16:29:15Z jowenn $
43 #include "mm/memory.h"
44 #include "native/jni.h"
45 #include "native/native.h"
46 #include "native/include/java_lang_Object.h"
47 #include "native/include/java_lang_Byte.h"
48 #include "native/include/java_lang_Character.h"
49 #include "native/include/java_lang_Short.h"
50 #include "native/include/java_lang_Integer.h"
51 #include "native/include/java_lang_Boolean.h"
52 #include "native/include/java_lang_Long.h"
53 #include "native/include/java_lang_Float.h"
54 #include "native/include/java_lang_Double.h"
55 #include "native/include/java_lang_Throwable.h"
56 #include "native/include/java_lang_reflect_Method.h"
57 #include "native/include/java_lang_reflect_Field.h"
59 #include "native/include/java_lang_Class.h" /* for java_lang_VMClass.h */
60 #include "native/include/java_lang_VMClass.h"
61 #include "native/include/java_lang_VMClassLoader.h"
63 #if defined(USE_THREADS)
64 # if defined(NATIVE_THREADS)
65 # include "threads/native/threads.h"
67 # include "threads/green/threads.h"
71 #include "toolbox/logging.h"
72 #include "vm/builtin.h"
73 #include "vm/exceptions.h"
74 #include "vm/global.h"
75 #include "vm/initialize.h"
76 #include "vm/loader.h"
77 #include "vm/options.h"
78 #include "vm/resolve.h"
79 #include "vm/statistics.h"
80 #include "vm/stringlocal.h"
81 #include "vm/tables.h"
82 #include "vm/jit/asmpart.h"
83 #include "vm/jit/jit.h"
84 #include "vm/statistics.h"
86 /* XXX TWISTI hack: define it extern so they can be found in this file */
87 extern const struct JNIInvokeInterface JNI_JavaVMTable;
88 extern struct JNINativeInterface JNI_JNIEnvTable;
90 /* pointers to VM and the environment needed by GetJavaVM and GetEnv */
91 static JavaVM ptr_jvm = (JavaVM) &JNI_JavaVMTable;
92 static void* ptr_env = (void*) &JNI_JNIEnvTable;
95 #define PTR_TO_ITEM(ptr) ((u8)(size_t)(ptr))
97 /* global reference table */
98 static jobject *global_ref_table;
99 static bool initrunning=false;
101 /* jmethodID and jclass caching variables for NewGlobalRef and DeleteGlobalRef*/
102 static jmethodID getmid = NULL;
103 static jmethodID putmid = NULL;
104 static jclass intclass = NULL;
105 static jmethodID intvalue = NULL;
106 static jmethodID newint = NULL;
107 static jclass ihmclass = NULL;
108 static jmethodID removemid = NULL;
110 #define JWCLINITDEBUG(x)
113 /********************* accessing instance-fields **********************************/
115 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
116 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
117 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
119 static void fill_callblock(void *obj, methoddesc *descr, jni_callblock blk[], va_list data, int rettype)
127 /* the this pointer */
128 blk[0].itemtype = TYPE_ADR;
129 blk[0].item = PTR_TO_ITEM(obj);
135 paramtype = descr->paramtypes;
136 for (i=0; i<descr->paramcount; ++i,++cnt,++paramtype) {
137 switch (paramtype->decltype) {
138 /* primitive types */
139 case PRIMITIVETYPE_BYTE:
140 case PRIMITIVETYPE_CHAR:
141 case PRIMITIVETYPE_SHORT:
142 case PRIMITIVETYPE_BOOLEAN:
143 blk[cnt].itemtype = TYPE_INT;
144 blk[cnt].item = (u8) va_arg(data, int);
147 case PRIMITIVETYPE_INT:
148 blk[cnt].itemtype = TYPE_INT;
149 dummy = va_arg(data, u4);
150 /*printf("fill_callblock: pos:%d, value:%d\n",cnt,dummy);*/
151 blk[cnt].item = (u8) dummy;
154 case PRIMITIVETYPE_LONG:
155 blk[cnt].itemtype = TYPE_LNG;
156 blk[cnt].item = (u8) va_arg(data, jlong);
159 case PRIMITIVETYPE_FLOAT:
160 blk[cnt].itemtype = TYPE_FLT;
161 *((jfloat *) (&blk[cnt].item)) = (jfloat) va_arg(data, jdouble);
164 case PRIMITIVETYPE_DOUBLE:
165 blk[cnt].itemtype = TYPE_DBL;
166 *((jdouble *) (&blk[cnt].item)) = (jdouble) va_arg(data, jdouble);
170 blk[cnt].itemtype = TYPE_ADR;
171 blk[cnt].item = PTR_TO_ITEM(va_arg(data, void*));
176 /*the standard doesn't say anything about return value checking, but it appears to be usefull*/
177 if (rettype != descr->returntype.decltype)
178 log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
181 /* XXX it could be considered if we should do typechecking here in the future */
182 static bool fill_callblock_objA(void *obj, methoddesc *descr, jni_callblock blk[], java_objectarray* params,
190 /* determine number of parameters */
193 blk[0].itemtype = TYPE_ADR;
194 blk[0].item = PTR_TO_ITEM(obj);
200 paramtype = descr->paramtypes;
201 for (cnts=0; cnts < descr->paramcount; ++cnts,++cnt,++paramtype) {
202 switch (paramtype->type) {
203 /* primitive types */
209 param = params->data[cnts];
213 /* internally used data type */
214 blk[cnt].itemtype = paramtype->type;
216 /* convert the value according to its declared type */
217 switch (paramtype->decltype) {
218 case PRIMITIVETYPE_BOOLEAN:
219 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
220 blk[cnt].item = (u8) ((java_lang_Boolean *) param)->value;
224 case PRIMITIVETYPE_BYTE:
225 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
226 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
230 case PRIMITIVETYPE_CHAR:
231 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
232 blk[cnt].item = (u8) ((java_lang_Character *) param)->value;
236 case PRIMITIVETYPE_SHORT:
237 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
238 blk[cnt].item = (u8) ((java_lang_Short *) param)->value;
239 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
240 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
244 case PRIMITIVETYPE_INT:
245 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
246 blk[cnt].item = (u8) ((java_lang_Integer *) param)->value;
247 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_SHORT].class_wrap)
248 blk[cnt].item = (u8) ((java_lang_Short *) param)->value;
249 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
250 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
254 case PRIMITIVETYPE_LONG:
255 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
256 blk[cnt].item = (u8) ((java_lang_Long *) param)->value;
257 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_INT].class_wrap)
258 blk[cnt].item = (u8) ((java_lang_Integer *) param)->value;
259 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_SHORT].class_wrap)
260 blk[cnt].item = (u8) ((java_lang_Short *) param)->value;
261 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
262 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
266 case PRIMITIVETYPE_FLOAT:
267 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
268 *((jfloat *) (&blk[cnt].item)) = (jfloat) ((java_lang_Float *) param)->value;
272 case PRIMITIVETYPE_DOUBLE:
273 if (param->vftbl->class == primitivetype_table[paramtype->decltype].class_wrap)
274 *((jdouble *) (&blk[cnt].item)) = (jdouble) ((java_lang_Float *) param)->value;
275 else if (param->vftbl->class == primitivetype_table[PRIMITIVETYPE_FLOAT].class_wrap)
276 *((jfloat *) (&blk[cnt].item)) = (jfloat) ((java_lang_Float *) param)->value;
282 } /* end declared type switch */
289 if (!resolve_class_from_typedesc(paramtype,true,&cls))
290 return false; /* exception */
291 if (params->data[cnts] != 0) {
292 if (paramtype->arraydim > 0) {
293 if (!builtin_arrayinstanceof(params->data[cnts], cls->vftbl))
297 if (!builtin_instanceof(params->data[cnts], cls))
301 blk[cnt].itemtype = TYPE_ADR;
302 blk[cnt].item = PTR_TO_ITEM(params->data[cnts]);
308 } /* end param type switch */
310 } /* end param loop */
313 *rettype = descr->returntype.decltype;
317 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
322 static jmethodID get_virtual(jobject obj,jmethodID methodID) {
323 if (obj->vftbl->class==methodID->class) return methodID;
324 return class_resolvemethod (obj->vftbl->class, methodID->name, methodID->descriptor);
328 static jmethodID get_nonvirtual(jclass clazz,jmethodID methodID) {
329 if (clazz==methodID->class) return methodID;
330 /*class_resolvemethod -> classfindmethod? (JOWENN)*/
331 return class_resolvemethod (clazz, methodID->name, methodID->descriptor);
335 static jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
344 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
348 argcount = methodID->parseddesc->paramcount;
350 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
351 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
352 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
356 if (obj && !builtin_instanceof(obj, methodID->class)) {
357 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
364 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
365 log_text("Too many arguments. CallObjectMethod does not support that");
370 blk = MNEW(jni_callblock, /*4 */argcount+2);
372 fill_callblock(obj, methodID->parseddesc, blk, args, TYPE_ADR);
373 /* printf("parameter: obj: %p",blk[0].item); */
374 STATS(jnicallXmethodnvokation();)
375 ret = asm_calljavafunction2(methodID,
377 (argcount + 1) * sizeof(jni_callblock),
379 MFREE(blk, jni_callblock, argcount + 1);
380 /* printf("(CallObjectMethodV)-->%p\n",ret); */
387 core function for integer class methods (bool, byte, short, integer)
388 This is basically needed for i386
390 static jint callIntegerMethod(jobject obj, jmethodID methodID, int retType, va_list args)
396 STATS(jniinvokation();)
399 log_text("JNI-Call: CallObjectMethodV");
400 utf_display(methodID->name);
401 utf_display(methodID->descriptor);
402 printf("\nParmaeter count: %d\n",argcount);
403 utf_display(obj->vftbl->class->name);
407 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
411 argcount = methodID->parseddesc->paramcount;
413 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
414 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
415 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
419 if (obj && !builtin_instanceof(obj, methodID->class)) {
420 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
426 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
427 log_text("Too many arguments. CallIntegerMethod does not support that");
432 blk = MNEW(jni_callblock, /*4 */ argcount+2);
434 fill_callblock(obj, methodID->parseddesc, blk, args, retType);
436 /* printf("parameter: obj: %p",blk[0].item); */
437 STATS(jnicallXmethodnvokation();)
438 ret = asm_calljavafunction2int(methodID,
440 (argcount + 1) * sizeof(jni_callblock),
443 MFREE(blk, jni_callblock, argcount + 1);
444 /* printf("(CallObjectMethodV)-->%p\n",ret); */
450 /*core function for long class functions*/
451 static jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
457 STATS(jniinvokation();)
460 log_text("JNI-Call: CallObjectMethodV");
461 utf_display(methodID->name);
462 utf_display(methodID->descriptor);
463 printf("\nParmaeter count: %d\n",argcount);
464 utf_display(obj->vftbl->class->name);
468 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
472 argcount = methodID->parseddesc->paramcount;
474 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
475 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
476 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
480 if (obj && !builtin_instanceof(obj,methodID->class)) {
481 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
487 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
488 log_text("Too many arguments. CallObjectMethod does not support that");
493 blk = MNEW(jni_callblock,/* 4 */argcount+2);
495 fill_callblock(obj, methodID->parseddesc, blk, args, TYPE_LNG);
497 /* printf("parameter: obj: %p",blk[0].item); */
498 STATS(jnicallXmethodnvokation();)
499 ret = asm_calljavafunction2long(methodID,
501 (argcount + 1) * sizeof(jni_callblock),
504 MFREE(blk, jni_callblock, argcount + 1);
505 /* printf("(CallObjectMethodV)-->%p\n",ret); */
511 /*core function for float class methods (float,double)*/
512 static jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,int retType)
514 int argcount = methodID->parseddesc->paramcount;
518 STATS(jniinvokation();)
521 log_text("JNI-Call: CallObjectMethodV");
522 utf_display(methodID->name);
523 utf_display(methodID->descriptor);
524 printf("\nParmaeter count: %d\n",argcount);
525 utf_display(obj->vftbl->class->name);
531 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
532 log_text("Too many arguments. CallObjectMethod does not support that");
537 blk = MNEW(jni_callblock, /*4 */ argcount+2);
539 fill_callblock(obj, methodID->parseddesc, blk, args, retType);
541 /* printf("parameter: obj: %p",blk[0].item); */
542 STATS(jnicallXmethodnvokation();)
543 ret = asm_calljavafunction2double(methodID,
545 (argcount + 1) * sizeof(jni_callblock),
548 MFREE(blk, jni_callblock, argcount + 1);
549 /* printf("(CallObjectMethodV)-->%p\n",ret); */
555 /*************************** function: jclass_findfield ****************************
557 searches for field with specified name and type in a 'classinfo'-structur
558 if no such field is found NULL is returned
560 ************************************************************************************/
562 static fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
565 STATS(jniinvokation();)
567 /* printf(" FieldCount: %d\n",c->fieldscount);
568 utf_display(c->name); */
569 for (i = 0; i < c->fieldscount; i++) {
570 /* utf_display(c->fields[i].name);
572 utf_display(c->fields[i].descriptor);
574 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
575 return &(c->fields[i]);
578 if (c->super.cls) return jclass_findfield(c->super.cls,name,desc);
584 /* GetVersion ******************************************************************
586 Returns the major version number in the higher 16 bits and the
587 minor version number in the lower 16 bits.
589 *******************************************************************************/
591 jint GetVersion(JNIEnv *env)
593 /* GNU classpath currently supports JNI 1.2 */
594 STATS(jniinvokation();)
595 return JNI_VERSION_1_2;
599 /* Class Operations ***********************************************************/
601 /* DefineClass *****************************************************************
603 Loads a class from a buffer of raw class data. The buffer
604 containing the raw class data is not referenced by the VM after the
605 DefineClass call returns, and it may be discarded if desired.
607 *******************************************************************************/
609 jclass DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize bufLen)
612 STATS(jniinvokation();)
614 c = (jclass) Java_java_lang_VMClassLoader_defineClass(env,
616 (java_lang_ClassLoader *) loader,
617 javastring_new_char(name),
618 (java_bytearray *) buf,
627 /* FindClass *******************************************************************
629 This function loads a locally-defined class. It searches the
630 directories and zip files specified by the CLASSPATH environment
631 variable for the class with the specified name.
633 *******************************************************************************/
635 jclass FindClass(JNIEnv *env, const char *name)
638 STATS(jniinvokation();)
640 if (!load_class_bootstrap(utf_new_char_classname((char *) name),&c) || !link_class(c)) {
644 use_class_as_object(c);
650 /*******************************************************************************
652 converts java.lang.reflect.Method or
653 java.lang.reflect.Constructor object to a method ID
655 *******************************************************************************/
657 jmethodID FromReflectedMethod(JNIEnv* env, jobject method)
659 struct methodinfo *mi;
660 java_lang_reflect_Method *rm;
663 rm=(java_lang_reflect_Method*) method;
665 c= (classinfo *) (rm->declaringClass);
666 STATS(jniinvokation();)
668 if (rm->slot < 0 || rm->slot >= c->methodscount) {
669 /*this usually means a severe internal cacao error or somebody
670 tempered around with the reflected method*/
671 panic("error illegal slot for method in class(FromReflectedMethod)");
673 mi = &(c->methods[rm->slot]);
678 /* GetSuperclass ***************************************************************
680 If clazz represents any class other than the class Object, then
681 this function returns the object that represents the superclass of
682 the class specified by clazz.
684 *******************************************************************************/
686 jclass GetSuperclass(JNIEnv *env, jclass sub)
689 STATS(jniinvokation();)
691 c = ((classinfo *) sub)->super.cls;
696 use_class_as_object(c);
702 /* IsAssignableFrom ************************************************************
704 Determines whether an object of sub can be safely cast to sup.
706 *******************************************************************************/
708 jboolean IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
710 STATS(jniinvokation();)
711 return Java_java_lang_VMClass_isAssignableFrom(env,
713 (java_lang_Class *) sup,
714 (java_lang_Class *) sub);
718 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
720 jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
722 log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!!!");
723 STATS(jniinvokation();)
728 /* Throw ***********************************************************************
730 Causes a java.lang.Throwable object to be thrown.
732 *******************************************************************************/
734 jint Throw(JNIEnv *env, jthrowable obj)
736 *exceptionptr = (java_objectheader *) obj;
737 STATS(jniinvokation();)
743 /* ThrowNew ********************************************************************
745 Constructs an exception object from the specified class with the
746 message specified by message and causes that exception to be
749 *******************************************************************************/
751 jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
753 java_lang_Throwable *o;
755 STATS(jniinvokation();)
757 s = (java_lang_String *) javastring_new_char(msg);
759 /* instantiate exception object */
761 o = (java_lang_Throwable *) native_new_and_init_string((classinfo *) clazz,
767 *exceptionptr = (java_objectheader *) o;
773 /* ExceptionOccurred ***********************************************************
775 Determines if an exception is being thrown. The exception stays
776 being thrown until either the native code calls ExceptionClear(),
777 or the Java code handles the exception.
779 *******************************************************************************/
781 jthrowable ExceptionOccurred(JNIEnv *env)
783 STATS(jniinvokation();)
784 return (jthrowable) *exceptionptr;
788 /* ExceptionDescribe ***********************************************************
790 Prints an exception and a backtrace of the stack to a system
791 error-reporting channel, such as stderr. This is a convenience
792 routine provided for debugging.
794 *******************************************************************************/
796 void ExceptionDescribe(JNIEnv *env)
798 java_objectheader *e;
800 STATS(jniinvokation();)
805 /* clear exception, because we are calling jit code again */
807 *exceptionptr = NULL;
809 /* get printStackTrace method from exception class */
811 m = class_resolveclassmethod(e->vftbl->class,
818 /* XXX what should we do? */
821 /* print the stacktrace */
823 asm_calljavafunction(m, e, NULL, NULL, NULL);
828 /* ExceptionClear **************************************************************
830 Clears any exception that is currently being thrown. If no
831 exception is currently being thrown, this routine has no effect.
833 *******************************************************************************/
835 void ExceptionClear(JNIEnv *env)
837 STATS(jniinvokation();)
838 *exceptionptr = NULL;
842 /* FatalError ******************************************************************
844 Raises a fatal error and does not expect the VM to recover. This
845 function does not return.
847 *******************************************************************************/
849 void FatalError(JNIEnv *env, const char *msg)
851 STATS(jniinvokation();)
852 throw_cacao_exception_exit(string_java_lang_InternalError, msg);
856 /******************* creates a new local reference frame **************************/
858 jint PushLocalFrame(JNIEnv* env, jint capacity)
860 log_text("JNI-Call: PushLocalFrame: IMPLEMENT ME!");
861 STATS(jniinvokation();)
866 /**************** Pops off the current local reference frame **********************/
868 jobject PopLocalFrame(JNIEnv* env, jobject result)
870 log_text("JNI-Call: PopLocalFrame: IMPLEMENT ME!");
871 STATS(jniinvokation();)
877 /* DeleteLocalRef **************************************************************
879 Deletes the local reference pointed to by localRef.
881 *******************************************************************************/
883 void DeleteLocalRef(JNIEnv *env, jobject localRef)
885 log_text("JNI-Call: DeleteLocalRef: IMPLEMENT ME!");
886 STATS(jniinvokation();)
891 /* IsSameObject ****************************************************************
893 Tests whether two references refer to the same Java object.
895 *******************************************************************************/
897 jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
899 STATS(jniinvokation();)
900 return (ref1 == ref2);
904 /* NewLocalRef *****************************************************************
906 Creates a new local reference that refers to the same object as ref.
908 *******************************************************************************/
910 jobject NewLocalRef(JNIEnv *env, jobject ref)
912 log_text("JNI-Call: NewLocalRef: IMPLEMENT ME!");
913 STATS(jniinvokation();)
917 /***********************************************************************************
919 Ensures that at least a given number of local references can
920 be created in the current thread
922 **********************************************************************************/
924 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
926 STATS(jniinvokation();)
927 return 0; /* return 0 on success */
931 /* AllocObject *****************************************************************
933 Allocates a new Java object without invoking any of the
934 constructors for the object. Returns a reference to the object.
936 *******************************************************************************/
938 jobject AllocObject(JNIEnv *env, jclass clazz)
940 java_objectheader *o;
941 STATS(jniinvokation();)
943 if ((clazz->flags & ACC_INTERFACE) || (clazz->flags & ACC_ABSTRACT)) {
945 new_exception_utfmessage(string_java_lang_InstantiationException,
950 o = builtin_new(clazz);
956 /* NewObject *******************************************************************
958 Constructs a new Java object. The method ID indicates which
959 constructor method to invoke. This ID must be obtained by calling
960 GetMethodID() with <init> as the method name and void (V) as the
963 *******************************************************************************/
965 jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
967 java_objectheader *o;
969 int argcount=methodID->parseddesc->paramcount;
972 STATS(jniinvokation();)
976 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
977 log_text("Too many arguments. NewObject does not support that");
984 o = builtin_new(clazz);
989 va_start(vaargs, methodID);
990 for (i = 0; i < argcount; i++) {
991 args[i] = va_arg(vaargs, void*);
995 /* call constructor */
997 asm_calljavafunction(methodID, o, args[0], args[1], args[2]);
1003 /***********************************************************************************
1005 Constructs a new Java object
1006 arguments that are to be passed to the constructor are placed in va_list args
1008 ***********************************************************************************/
1010 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
1012 log_text("JNI-Call: NewObjectV");
1013 STATS(jniinvokation();)
1019 /***********************************************************************************
1021 Constructs a new Java object
1022 arguments that are to be passed to the constructor are placed in
1023 args array of jvalues
1025 ***********************************************************************************/
1027 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
1029 log_text("JNI-Call: NewObjectA");
1030 STATS(jniinvokation();)
1036 /* GetObjectClass **************************************************************
1038 Returns the class of an object.
1040 *******************************************************************************/
1042 jclass GetObjectClass(JNIEnv *env, jobject obj)
1045 STATS(jniinvokation();)
1047 if (!obj || !obj->vftbl)
1050 c = obj->vftbl->class;
1051 use_class_as_object(c);
1056 /* IsInstanceOf ****************************************************************
1058 Tests whether an object is an instance of a class.
1060 *******************************************************************************/
1062 jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
1064 STATS(jniinvokation();)
1066 return Java_java_lang_VMClass_isInstance(env,
1068 (java_lang_Class *) clazz,
1069 (java_lang_Object *) obj);
1073 /***************** converts a java.lang.reflect.Field to a field ID ***************/
1075 jfieldID FromReflectedField(JNIEnv* env, jobject field)
1077 java_lang_reflect_Field *f;
1079 jfieldID fid; /* the JNI-fieldid of the wrapping object */
1080 STATS(jniinvokation();)
1081 /*log_text("JNI-Call: FromReflectedField");*/
1083 f=(java_lang_reflect_Field *)field;
1085 c=(classinfo*)(f->declaringClass);
1086 if ( (f->slot<0) || (f->slot>c->fieldscount)) {
1087 /*this usually means a severe internal cacao error or somebody
1088 tempered around with the reflected method*/
1089 panic("error illegal slot for field in class(FromReflectedField)");
1091 fid=&(c->fields[f->slot]);
1096 /**********************************************************************************
1098 converts a method ID to a java.lang.reflect.Method or
1099 java.lang.reflect.Constructor object
1101 **********************************************************************************/
1103 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
1105 log_text("JNI-Call: ToReflectedMethod");
1106 STATS(jniinvokation();)
1112 /* GetMethodID *****************************************************************
1114 returns the method ID for an instance method
1116 *******************************************************************************/
1118 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
1121 STATS(jniinvokation();)
1123 m = class_resolvemethod(clazz,
1124 utf_new_char((char *) name),
1125 utf_new_char((char *) sig));
1127 if (!m || (m->flags & ACC_STATIC)) {
1129 new_exception_message(string_java_lang_NoSuchMethodError, name);
1138 /******************** JNI-functions for calling instance methods ******************/
1140 jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1144 STATS(jniinvokation();)
1146 /* log_text("JNI-Call: CallObjectMethod");*/
1148 va_start(vaargs, methodID);
1149 ret = callObjectMethod(obj, methodID, vaargs);
1156 jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1158 STATS(jniinvokation();)
1159 return callObjectMethod(obj,methodID,args);
1163 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1165 log_text("JNI-Call: CallObjectMethodA");
1166 STATS(jniinvokation();)
1174 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1178 STATS(jniinvokation();)
1180 /* log_text("JNI-Call: CallBooleanMethod");*/
1182 va_start(vaargs,methodID);
1183 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BOOLEAN,vaargs);
1189 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1191 STATS(jniinvokation();)
1193 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BOOLEAN,args);
1197 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1199 STATS(jniinvokation();)
1200 log_text("JNI-Call: CallBooleanMethodA");
1205 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1209 STATS(jniinvokation();)
1211 /* log_text("JNI-Call: CallVyteMethod");*/
1213 va_start(vaargs,methodID);
1214 ret = callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BYTE,vaargs);
1220 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1222 /* log_text("JNI-Call: CallByteMethodV");*/
1223 STATS(jniinvokation();)
1225 return callIntegerMethod(obj,methodID,PRIMITIVETYPE_BYTE,args);
1229 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1231 log_text("JNI-Call: CallByteMethodA");
1232 STATS(jniinvokation();)
1238 jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1242 STATS(jniinvokation();)
1244 /* log_text("JNI-Call: CallCharMethod");*/
1246 va_start(vaargs,methodID);
1247 ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_CHAR, vaargs);
1254 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1256 STATS(jniinvokation();)
1258 /* log_text("JNI-Call: CallCharMethodV");*/
1259 return callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_CHAR,args);
1263 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1265 STATS(jniinvokation();)
1267 log_text("JNI-Call: CallCharMethodA");
1273 jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1277 STATS(jniinvokation();)
1279 /* log_text("JNI-Call: CallShortMethod");*/
1281 va_start(vaargs, methodID);
1282 ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_SHORT, vaargs);
1289 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1291 STATS(jniinvokation();)
1292 return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_SHORT, args);
1296 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1298 STATS(jniinvokation();)
1299 log_text("JNI-Call: CallShortMethodA");
1306 jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1310 STATS(jniinvokation();)
1312 va_start(vaargs,methodID);
1313 ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, vaargs);
1320 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1322 STATS(jniinvokation();)
1323 return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, args);
1327 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1329 STATS(jniinvokation();)
1330 log_text("JNI-Call: CallIntMethodA");
1337 jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1341 STATS(jniinvokation();)
1343 va_start(vaargs,methodID);
1344 ret = callLongMethod(obj,get_virtual(obj, methodID),vaargs);
1351 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1353 STATS(jniinvokation();)
1354 return callLongMethod(obj,get_virtual(obj, methodID),args);
1358 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1360 STATS(jniinvokation();)
1361 log_text("JNI-Call: CallLongMethodA");
1368 jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1373 STATS(jniinvokation();)
1374 /* log_text("JNI-Call: CallFloatMethod");*/
1376 va_start(vaargs,methodID);
1377 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, PRIMITIVETYPE_FLOAT);
1384 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1386 STATS(jniinvokation();)
1387 log_text("JNI-Call: CallFloatMethodV");
1388 return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_FLOAT);
1392 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1394 STATS(jniinvokation();)
1395 log_text("JNI-Call: CallFloatMethodA");
1402 jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1406 STATS(jniinvokation();)
1408 /* log_text("JNI-Call: CallDoubleMethod");*/
1410 va_start(vaargs,methodID);
1411 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, PRIMITIVETYPE_DOUBLE);
1418 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1420 STATS(jniinvokation();)
1421 log_text("JNI-Call: CallDoubleMethodV");
1422 return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_DOUBLE);
1426 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1428 STATS(jniinvokation();)
1429 log_text("JNI-Call: CallDoubleMethodA");
1435 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1438 STATS(jniinvokation();)
1440 va_start(vaargs,methodID);
1441 (void) callIntegerMethod(obj, get_virtual(obj, methodID),TYPE_VOID, vaargs);
1446 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1448 log_text("JNI-Call: CallVoidMethodV");
1449 STATS(jniinvokation();)
1450 (void)callIntegerMethod(obj,get_virtual(obj,methodID),TYPE_VOID,args);
1454 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1456 STATS(jniinvokation();)
1457 log_text("JNI-Call: CallVoidMethodA");
1462 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1464 STATS(jniinvokation();)
1465 log_text("JNI-Call: CallNonvirtualObjectMethod");
1471 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1473 STATS(jniinvokation();)
1474 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1480 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1482 STATS(jniinvokation();)
1483 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1490 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1494 STATS(jniinvokation();)
1496 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1498 va_start(vaargs,methodID);
1499 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,vaargs);
1506 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1508 STATS(jniinvokation();)
1509 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1510 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,args);
1514 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1516 STATS(jniinvokation();)
1517 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1524 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1529 STATS(jniinvokation();)
1530 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1532 va_start(vaargs,methodID);
1533 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,vaargs);
1539 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1541 STATS(jniinvokation();)
1542 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1543 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,args);
1548 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1550 STATS(jniinvokation();)
1551 log_text("JNI-Call: CallNonvirtualByteMethodA");
1558 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1563 STATS(jniinvokation();)
1564 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1566 va_start(vaargs,methodID);
1567 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,vaargs);
1573 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1575 STATS(jniinvokation();)
1576 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1577 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,args);
1581 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1583 STATS(jniinvokation();)
1584 log_text("JNI-Call: CallNonvirtualCharMethodA");
1591 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1595 STATS(jniinvokation();)
1597 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1599 va_start(vaargs,methodID);
1600 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,vaargs);
1606 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1608 STATS(jniinvokation();)
1609 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1610 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,args);
1614 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1616 STATS(jniinvokation();)
1617 log_text("JNI-Call: CallNonvirtualShortMethodA");
1624 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1629 STATS(jniinvokation();)
1631 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1633 va_start(vaargs,methodID);
1634 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,vaargs);
1640 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1642 STATS(jniinvokation();)
1643 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1644 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,args);
1648 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1650 STATS(jniinvokation();)
1651 log_text("JNI-Call: CallNonvirtualIntMethodA");
1658 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1660 STATS(jniinvokation();)
1661 log_text("JNI-Call: CallNonvirtualLongMethod");
1667 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1669 STATS(jniinvokation();)
1670 log_text("JNI-Call: CallNonvirtualLongMethodV");
1676 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1678 STATS(jniinvokation();)
1679 log_text("JNI-Call: CallNonvirtualLongMethodA");
1686 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1690 STATS(jniinvokation();)
1692 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1695 va_start(vaargs,methodID);
1696 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_FLOAT);
1703 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1705 STATS(jniinvokation();)
1706 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1707 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_FLOAT);
1711 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1713 STATS(jniinvokation();)
1714 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1721 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1725 STATS(jniinvokation();)
1726 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1728 va_start(vaargs,methodID);
1729 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_DOUBLE);
1736 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1738 STATS(jniinvokation();)
1739 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1740 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_DOUBLE);
1744 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1746 STATS(jniinvokation();)
1747 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1754 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1757 STATS(jniinvokation();)
1759 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1761 va_start(vaargs,methodID);
1762 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,vaargs);
1768 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1770 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1771 STATS(jniinvokation();)
1773 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,args);
1778 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1780 STATS(jniinvokation();)
1781 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1784 /************************* JNI-functions for accessing fields ************************/
1786 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1789 STATS(jniinvokation();)
1791 /* log_text("========================= searching for:");
1794 f = jclass_findfield(clazz,
1795 utf_new_char ((char*) name),
1796 utf_new_char ((char*) sig)
1800 /*utf_display(clazz->name);
1803 *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);
1808 /*************************** retrieve fieldid, abort on error ************************/
1810 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
1812 jfieldID id = GetFieldID(env, clazz, name, sig);
1813 STATS(jniinvokation();)
1817 utf_display(clazz->name);
1818 log_text("\nfield:");
1823 panic("setfield_critical failed");
1828 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1831 jobject dbg,dretval,*dpretval;
1832 long int dli1, dli2, dli3;
1834 printf("GetObjectField(1): thread: %s obj: %p name: %s desc: %s \n",GetStringUTFChars(env,
1835 ((threadobject *) THREADOBJECT)->o
1837 ,obj,((fieldinfo*)fieldID)->name->text,(fieldID->descriptor)->text);
1839 dbg = getField(obj,jobject,fieldID);
1840 dli1 = (long int) obj;
1841 dli2 = (long int) fieldID->offset;
1843 dpretval = (jobject*) dli3;
1844 dretval = *dpretval;
1849 tmp = FindClass(env, "java/lang/Object");
1850 mid = GetMethodID(env,tmp,"toString","()Ljava/lang/String;");
1851 jstr = CallObjectMethod(env,dbg,mid);*/
1853 /* printf("GetObjectField(2): retval %p (obj: %#lx + offset: %#lx = %#lx (jobject*) %p (jobject) %p\n"
1854 ,dbg, dli1, dli2, dli3,dpretval, dretval);*/
1858 STATS(jniinvokation();)
1860 return getField(obj,jobject,fieldID);
1863 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1865 STATS(jniinvokation();)
1866 return getField(obj,jboolean,fieldID);
1870 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1872 STATS(jniinvokation();)
1873 return getField(obj,jbyte,fieldID);
1877 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1879 STATS(jniinvokation();)
1880 return getField(obj,jchar,fieldID);
1884 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1886 STATS(jniinvokation();)
1887 return getField(obj,jshort,fieldID);
1891 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1893 STATS(jniinvokation();)
1894 return getField(obj,jint,fieldID);
1898 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1900 STATS(jniinvokation();)
1901 return getField(obj,jlong,fieldID);
1905 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1907 STATS(jniinvokation();)
1908 return getField(obj,jfloat,fieldID);
1912 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1914 STATS(jniinvokation();)
1915 return getField(obj,jdouble,fieldID);
1918 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1920 STATS(jniinvokation();)
1921 setField(obj,jobject,fieldID,val);
1925 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1927 STATS(jniinvokation();)
1928 setField(obj,jboolean,fieldID,val);
1932 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1934 STATS(jniinvokation();)
1935 setField(obj,jbyte,fieldID,val);
1939 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1941 STATS(jniinvokation();)
1942 setField(obj,jchar,fieldID,val);
1946 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
1948 STATS(jniinvokation();)
1949 setField(obj,jshort,fieldID,val);
1953 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
1955 STATS(jniinvokation();)
1956 setField(obj,jint,fieldID,val);
1960 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
1962 STATS(jniinvokation();)
1963 setField(obj,jlong,fieldID,val);
1967 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
1969 STATS(jniinvokation();)
1970 setField(obj,jfloat,fieldID,val);
1974 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
1976 STATS(jniinvokation();)
1977 setField(obj,jdouble,fieldID,val);
1981 /**************** JNI-functions for calling static methods **********************/
1983 jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
1986 STATS(jniinvokation();)
1988 m = class_resolvemethod(clazz,
1989 utf_new_char((char *) name),
1990 utf_new_char((char *) sig));
1992 if (!m || !(m->flags & ACC_STATIC)) {
1994 new_exception_message(string_java_lang_NoSuchMethodError, name);
2003 jobject CallStaticObjectMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2007 STATS(jniinvokation();)
2009 /* log_text("JNI-Call: CallStaticObjectMethod");*/
2011 va_start(vaargs, methodID);
2012 ret = callObjectMethod(0, methodID, vaargs);
2019 jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2021 STATS(jniinvokation();)
2022 /* log_text("JNI-Call: CallStaticObjectMethodV"); */
2024 return callObjectMethod(0,methodID,args);
2028 jobject CallStaticObjectMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2030 STATS(jniinvokation();)
2031 log_text("JNI-Call: CallStaticObjectMethodA");
2037 jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2041 STATS(jniinvokation();)
2043 va_start(vaargs, methodID);
2044 ret = (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, vaargs);
2051 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2053 STATS(jniinvokation();)
2054 return (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, args);
2058 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2060 STATS(jniinvokation();)
2061 log_text("JNI-Call: CallStaticBooleanMethodA");
2067 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2071 STATS(jniinvokation();)
2073 /* log_text("JNI-Call: CallStaticByteMethod");*/
2075 va_start(vaargs, methodID);
2076 ret = (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, vaargs);
2083 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2085 STATS(jniinvokation();)
2086 return (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, args);
2090 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2092 STATS(jniinvokation();)
2093 log_text("JNI-Call: CallStaticByteMethodA");
2099 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2103 STATS(jniinvokation();)
2105 /* log_text("JNI-Call: CallStaticByteMethod");*/
2107 va_start(vaargs, methodID);
2108 ret = (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, vaargs);
2115 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2117 STATS(jniinvokation();)
2118 return (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, args);
2122 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2124 STATS(jniinvokation();)
2125 log_text("JNI-Call: CallStaticCharMethodA");
2132 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2136 STATS(jniinvokation();)
2138 /* log_text("JNI-Call: CallStaticByteMethod");*/
2140 va_start(vaargs, methodID);
2141 ret = (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, vaargs);
2148 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2150 STATS(jniinvokation();)
2151 /*log_text("JNI-Call: CallStaticShortMethodV");*/
2152 return (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, args);
2156 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2158 STATS(jniinvokation();)
2159 log_text("JNI-Call: CallStaticShortMethodA");
2166 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2170 STATS(jniinvokation();)
2172 /* log_text("JNI-Call: CallStaticIntMethod");*/
2174 va_start(vaargs, methodID);
2175 ret = callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, vaargs);
2182 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2184 STATS(jniinvokation();)
2185 log_text("JNI-Call: CallStaticIntMethodV");
2187 return callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, args);
2191 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2193 STATS(jniinvokation();)
2194 log_text("JNI-Call: CallStaticIntMethodA");
2201 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2205 STATS(jniinvokation();)
2207 /* log_text("JNI-Call: CallStaticLongMethod");*/
2209 va_start(vaargs, methodID);
2210 ret = callLongMethod(0, methodID, vaargs);
2217 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2219 STATS(jniinvokation();)
2220 log_text("JNI-Call: CallStaticLongMethodV");
2222 return callLongMethod(0,methodID,args);
2226 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2228 STATS(jniinvokation();)
2229 log_text("JNI-Call: CallStaticLongMethodA");
2236 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2240 STATS(jniinvokation();)
2242 /* log_text("JNI-Call: CallStaticLongMethod");*/
2244 va_start(vaargs, methodID);
2245 ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_FLOAT);
2252 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2254 STATS(jniinvokation();)
2256 return callFloatMethod(0, methodID, args, PRIMITIVETYPE_FLOAT);
2261 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2263 STATS(jniinvokation();)
2264 log_text("JNI-Call: CallStaticFloatMethodA");
2271 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2275 STATS(jniinvokation();)
2277 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
2279 va_start(vaargs,methodID);
2280 ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_DOUBLE);
2287 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2289 STATS(jniinvokation();)
2290 log_text("JNI-Call: CallStaticDoubleMethodV");
2292 return callFloatMethod(0, methodID, args, PRIMITIVETYPE_DOUBLE);
2296 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2298 STATS(jniinvokation();)
2299 log_text("JNI-Call: CallStaticDoubleMethodA");
2305 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
2308 STATS(jniinvokation();)
2310 va_start(vaargs, methodID);
2311 (void) callIntegerMethod(0, methodID, TYPE_VOID, vaargs);
2316 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
2318 log_text("JNI-Call: CallStaticVoidMethodV");
2319 STATS(jniinvokation();)
2320 (void)callIntegerMethod(0, methodID, TYPE_VOID, args);
2324 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
2326 STATS(jniinvokation();)
2327 log_text("JNI-Call: CallStaticVoidMethodA");
2331 /* Accessing Static Fields ****************************************************/
2333 /* GetStaticFieldID ************************************************************
2335 Returns the field ID for a static field of a class. The field is
2336 specified by its name and signature. The GetStatic<type>Field and
2337 SetStatic<type>Field families of accessor functions use field IDs
2338 to retrieve static fields.
2340 *******************************************************************************/
2342 jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
2345 STATS(jniinvokation();)
2347 f = jclass_findfield(clazz,
2348 utf_new_char((char *) name),
2349 utf_new_char((char *) sig));
2352 *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);
2358 /* GetStatic<type>Field ********************************************************
2360 This family of accessor routines returns the value of a static
2363 *******************************************************************************/
2365 jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2367 STATS(jniinvokation();)
2368 JWCLINITDEBUG(printf("GetStaticObjectField: calling initialize_class %s\n",clazz->name->text);)
2369 if (!initialize_class(clazz))
2372 return fieldID->value.a;
2376 jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2378 STATS(jniinvokation();)
2379 JWCLINITDEBUG(printf("GetStaticBooleanField: calling initialize_class %s\n",clazz->name->text);)
2381 if (!initialize_class(clazz))
2384 return fieldID->value.i;
2388 jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2390 STATS(jniinvokation();)
2391 JWCLINITDEBUG(printf("GetStaticByteField: calling initialize_class %s\n",clazz->name->text);)
2393 if (!initialize_class(clazz))
2396 return fieldID->value.i;
2400 jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2402 STATS(jniinvokation();)
2403 JWCLINITDEBUG(printf("GetStaticCharField: calling initialize_class %s\n",clazz->name->text);)
2405 if (!initialize_class(clazz))
2408 return fieldID->value.i;
2412 jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2414 STATS(jniinvokation();)
2415 JWCLINITDEBUG(printf("GetStaticShorttField: calling initialize_class %s\n",clazz->name->text);)
2416 if (!initialize_class(clazz))
2419 return fieldID->value.i;
2423 jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2425 STATS(jniinvokation();)
2426 JWCLINITDEBUG(printf("GetStaticIntField: calling initialize_class %s\n",clazz->name->text);)
2427 if (!initialize_class(clazz))
2430 return fieldID->value.i;
2434 jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2436 STATS(jniinvokation();)
2437 JWCLINITDEBUG(printf("GetStaticLongField: calling initialize_class %s\n",clazz->name->text);)
2438 if (!initialize_class(clazz))
2441 return fieldID->value.l;
2445 jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2447 STATS(jniinvokation();)
2448 JWCLINITDEBUG(printf("GetStaticFloatField: calling initialize_class %s\n",clazz->name->text);)
2449 if (!initialize_class(clazz))
2452 return fieldID->value.f;
2456 jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2458 STATS(jniinvokation();)
2459 JWCLINITDEBUG(printf("GetStaticDoubleField: calling initialize_class %s\n",clazz->name->text);)
2460 if (!initialize_class(clazz))
2463 return fieldID->value.d;
2467 /* SetStatic<type>Field *******************************************************
2469 This family of accessor routines sets the value of a static field
2472 *******************************************************************************/
2474 void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
2476 STATS(jniinvokation();)
2477 JWCLINITDEBUG(printf("SetStaticObjectField: calling initialize_class %s\n",clazz->name->text);)
2478 if (!initialize_class(clazz))
2481 fieldID->value.a = value;
2485 void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
2487 STATS(jniinvokation();)
2488 JWCLINITDEBUG(printf("SetStaticBooleanField: calling initialize_class %s\n",clazz->name->text);)
2489 if (!initialize_class(clazz))
2492 fieldID->value.i = value;
2496 void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
2498 STATS(jniinvokation();)
2499 JWCLINITDEBUG(printf("SetStaticByteField: calling initialize_class %s\n",clazz->name->text);)
2500 if (!initialize_class(clazz))
2503 fieldID->value.i = value;
2507 void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
2509 STATS(jniinvokation();)
2510 JWCLINITDEBUG(printf("SetStaticCharField: calling initialize_class %s\n",clazz->name->text);)
2511 if (!initialize_class(clazz))
2514 fieldID->value.i = value;
2518 void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
2520 STATS(jniinvokation();)
2521 JWCLINITDEBUG(printf("SetStaticShortField: calling initialize_class %s\n",clazz->name->text);)
2522 if (!initialize_class(clazz))
2525 fieldID->value.i = value;
2529 void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
2531 STATS(jniinvokation();)
2532 JWCLINITDEBUG(printf("SetStaticIntField: calling initialize_class %s\n",clazz->name->text);)
2533 if (!initialize_class(clazz))
2536 fieldID->value.i = value;
2540 void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
2542 STATS(jniinvokation();)
2543 JWCLINITDEBUG(printf("SetStaticLongField: calling initialize_class %s\n",clazz->name->text);)
2544 if (!initialize_class(clazz))
2547 fieldID->value.l = value;
2551 void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
2553 STATS(jniinvokation();)
2554 JWCLINITDEBUG(printf("SetStaticFloatField: calling initialize_class %s\n",clazz->name->text);)
2555 if (!initialize_class(clazz))
2558 fieldID->value.f = value;
2562 void SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
2564 STATS(jniinvokation();)
2565 JWCLINITDEBUG(printf("SetStaticDoubleField: calling initialize_class %s\n",clazz->name->text);)
2566 if (!initialize_class(clazz))
2569 fieldID->value.d = value;
2573 /* NewString *******************************************************************
2575 Create new java.lang.String object from an array of Unicode
2578 *******************************************************************************/
2580 jstring NewString(JNIEnv *env, const jchar *buf, jsize len)
2582 java_lang_String *s;
2585 STATS(jniinvokation();)
2587 s = (java_lang_String *) builtin_new(class_java_lang_String);
2588 a = builtin_newarray_char(len);
2590 /* javastring or characterarray could not be created */
2595 for (i = 0; i < len; i++)
2596 a->data[i] = buf[i];
2606 static char emptyString[]="";
2607 static jchar emptyStringJ[]={0,0};
2609 /******************* returns the length of a Java string ***************************/
2611 jsize GetStringLength (JNIEnv *env, jstring str)
2613 return ((java_lang_String*) str)->count;
2617 /******************** convertes javastring to u2-array ****************************/
2619 u2 *javastring_tou2 (jstring so)
2621 java_lang_String *s = (java_lang_String*) so;
2625 STATS(jniinvokation();)
2627 if (!s) return NULL;
2630 if (!a) return NULL;
2632 /* allocate memory */
2633 stringbuffer = MNEW( u2 , s->count + 1 );
2636 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
2638 /* terminate string */
2639 stringbuffer[i] = '\0';
2641 return stringbuffer;
2644 /********* returns a pointer to an array of Unicode characters of the string *******/
2646 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
2648 jchar *jc=javastring_tou2(str);
2649 STATS(jniinvokation();)
2652 if (isCopy) *isCopy=JNI_TRUE;
2655 if (isCopy) *isCopy=JNI_TRUE;
2656 return emptyStringJ;
2659 /**************** native code no longer needs access to chars **********************/
2661 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
2663 STATS(jniinvokation();)
2664 if (chars==emptyStringJ) return;
2665 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
2669 /* NewStringUTF ****************************************************************
2671 Constructs a new java.lang.String object from an array of UTF-8 characters.
2673 *******************************************************************************/
2675 jstring NewStringUTF(JNIEnv *env, const char *bytes)
2677 STATS(jniinvokation();)
2678 return (jstring) javastring_new(utf_new_char(bytes));
2682 /****************** returns the utf8 length in bytes of a string *******************/
2684 jsize GetStringUTFLength (JNIEnv *env, jstring string)
2686 java_lang_String *s = (java_lang_String*) string;
2687 STATS(jniinvokation();)
2689 return (jsize) u2_utflength(s->value->data, s->count);
2693 /************ converts a Javastring to an array of UTF-8 characters ****************/
2695 const char* GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
2698 STATS(jniinvokation();)
2700 u = javastring_toutf((java_lang_String *) string, false);
2703 *isCopy = JNI_FALSE;
2713 /***************** native code no longer needs access to utf ***********************/
2715 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2717 STATS(jniinvokation();)
2719 /*we don't release utf chars right now, perhaps that should be done later. Since there is always one reference
2720 the garbage collector will never get them*/
2722 log_text("JNI-Call: ReleaseStringUTFChars");
2723 utf_display(utf_new_char(chars));
2727 /************************** array operations ***************************************/
2729 jsize GetArrayLength(JNIEnv *env, jarray array)
2731 STATS(jniinvokation();)
2737 /* NewObjectArray **************************************************************
2739 Constructs a new array holding objects in class elementClass. All
2740 elements are initially set to initialElement.
2742 *******************************************************************************/
2744 jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement)
2746 java_objectarray *oa;
2748 STATS(jniinvokation();)
2751 *exceptionptr = new_negativearraysizeexception();
2755 oa = builtin_anewarray(length, elementClass);
2760 /* set all elements to initialElement */
2762 for (i = 0; i < length; i++)
2763 oa->data[i] = initialElement;
2769 jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
2772 STATS(jniinvokation();)
2774 if (index < array->header.size)
2775 j = array->data[index];
2777 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2783 void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject val)
2785 STATS(jniinvokation();)
2786 if (index >= array->header.size)
2787 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2790 /* check if the class of value is a subclass of the element class of the array */
2791 if (!builtin_canstore((java_objectarray *) array, (java_objectheader *) val))
2792 *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
2795 array->data[index] = val;
2801 jbooleanArray NewBooleanArray(JNIEnv *env, jsize len)
2803 java_booleanarray *j;
2804 STATS(jniinvokation();)
2807 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2811 j = builtin_newarray_boolean(len);
2817 jbyteArray NewByteArray(JNIEnv *env, jsize len)
2820 STATS(jniinvokation();)
2823 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2827 j = builtin_newarray_byte(len);
2833 jcharArray NewCharArray(JNIEnv *env, jsize len)
2836 STATS(jniinvokation();)
2839 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2843 j = builtin_newarray_char(len);
2849 jshortArray NewShortArray(JNIEnv *env, jsize len)
2852 STATS(jniinvokation();)
2855 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2859 j = builtin_newarray_short(len);
2865 jintArray NewIntArray(JNIEnv *env, jsize len)
2868 STATS(jniinvokation();)
2871 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2875 j = builtin_newarray_int(len);
2881 jlongArray NewLongArray(JNIEnv *env, jsize len)
2884 STATS(jniinvokation();)
2887 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2891 j = builtin_newarray_long(len);
2897 jfloatArray NewFloatArray(JNIEnv *env, jsize len)
2900 STATS(jniinvokation();)
2903 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2907 j = builtin_newarray_float(len);
2913 jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
2915 java_doublearray *j;
2916 STATS(jniinvokation();)
2919 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2923 j = builtin_newarray_double(len);
2929 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2931 STATS(jniinvokation();)
2932 if (isCopy) *isCopy = JNI_FALSE;
2937 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2939 STATS(jniinvokation();)
2940 if (isCopy) *isCopy = JNI_FALSE;
2945 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
2947 STATS(jniinvokation();)
2948 if (isCopy) *isCopy = JNI_FALSE;
2953 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
2955 STATS(jniinvokation();)
2956 if (isCopy) *isCopy = JNI_FALSE;
2961 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
2963 STATS(jniinvokation();)
2964 if (isCopy) *isCopy = JNI_FALSE;
2969 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
2971 STATS(jniinvokation();)
2972 if (isCopy) *isCopy = JNI_FALSE;
2977 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
2979 STATS(jniinvokation();)
2980 if (isCopy) *isCopy = JNI_FALSE;
2985 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
2987 STATS(jniinvokation();)
2988 if (isCopy) *isCopy = JNI_FALSE;
2994 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
2996 STATS(jniinvokation();)
3001 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
3003 STATS(jniinvokation();)
3008 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
3014 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
3016 STATS(jniinvokation();)
3021 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
3023 STATS(jniinvokation();)
3028 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
3030 STATS(jniinvokation();)
3035 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
3037 STATS(jniinvokation();)
3042 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
3044 STATS(jniinvokation();)
3049 void GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
3051 STATS(jniinvokation();)
3052 if (start < 0 || len < 0 || start + len > array->header.size)
3053 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3056 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3060 void GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
3062 STATS(jniinvokation();)
3063 if (start < 0 || len < 0 || start + len > array->header.size)
3064 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3067 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3071 void GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
3073 STATS(jniinvokation();)
3074 if (start < 0 || len < 0 || start + len > array->header.size)
3075 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3078 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3082 void GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
3084 STATS(jniinvokation();)
3085 if (start < 0 || len < 0 || start + len > array->header.size)
3086 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3089 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3093 void GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
3095 STATS(jniinvokation();)
3096 if (start < 0 || len < 0 || start + len > array->header.size)
3097 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3100 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3104 void GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
3106 STATS(jniinvokation();)
3107 if (start < 0 || len < 0 || start + len > array->header.size)
3108 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3111 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3115 void GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
3117 STATS(jniinvokation();)
3118 if (start < 0 || len < 0 || start + len > array->header.size)
3119 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3122 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3126 void GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
3128 STATS(jniinvokation();)
3129 if (start < 0 || len < 0 || start+len>array->header.size)
3130 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3133 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3137 void SetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
3139 STATS(jniinvokation();)
3140 if (start < 0 || len < 0 || start + len > array->header.size)
3141 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3144 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3148 void SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
3150 STATS(jniinvokation();)
3151 if (start < 0 || len < 0 || start + len > array->header.size)
3152 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3155 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3159 void SetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
3161 STATS(jniinvokation();)
3162 if (start < 0 || len < 0 || start + len > array->header.size)
3163 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3166 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3171 void SetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
3173 STATS(jniinvokation();)
3174 if (start < 0 || len < 0 || start + len > array->header.size)
3175 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3178 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3182 void SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
3184 STATS(jniinvokation();)
3185 if (start < 0 || len < 0 || start + len > array->header.size)
3186 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3189 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3194 void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
3196 STATS(jniinvokation();)
3197 if (start < 0 || len < 0 || start + len > array->header.size)
3198 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3201 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3206 void SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
3208 STATS(jniinvokation();)
3209 if (start < 0 || len < 0 || start + len > array->header.size)
3210 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3213 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3218 void SetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
3220 STATS(jniinvokation();)
3221 if (start < 0 || len < 0 || start + len > array->header.size)
3222 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3225 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3229 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
3231 STATS(jniinvokation();)
3232 log_text("JNI-Call: RegisterNatives");
3237 jint UnregisterNatives (JNIEnv* env, jclass clazz)
3239 STATS(jniinvokation();)
3240 log_text("JNI-Call: UnregisterNatives");
3245 /* Monitor Operations *********************************************************/
3247 /* MonitorEnter ****************************************************************
3249 Enters the monitor associated with the underlying Java object
3252 *******************************************************************************/
3254 jint MonitorEnter(JNIEnv *env, jobject obj)
3256 STATS(jniinvokation();)
3258 *exceptionptr = new_nullpointerexception();
3262 #if defined(USE_THREADS)
3263 builtin_monitorenter(obj);
3270 /* MonitorExit *****************************************************************
3272 The current thread must be the owner of the monitor associated with
3273 the underlying Java object referred to by obj. The thread
3274 decrements the counter indicating the number of times it has
3275 entered this monitor. If the value of the counter becomes zero, the
3276 current thread releases the monitor.
3278 *******************************************************************************/
3280 jint MonitorExit(JNIEnv *env, jobject obj)
3282 STATS(jniinvokation();)
3284 *exceptionptr = new_nullpointerexception();
3288 #if defined(USE_THREADS)
3289 builtin_monitorexit(obj);
3296 /* JavaVM Interface ***********************************************************/
3298 /* GetJavaVM *******************************************************************
3300 Returns the Java VM interface (used in the Invocation API)
3301 associated with the current thread. The result is placed at the
3302 location pointed to by the second argument, vm.
3304 *******************************************************************************/
3306 jint GetJavaVM(JNIEnv *env, JavaVM **vm)
3308 STATS(jniinvokation();)
3315 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
3317 STATS(jniinvokation();)
3318 log_text("JNI-Call: GetStringRegion");
3322 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
3324 STATS(jniinvokation();)
3325 log_text("JNI-Call: GetStringUTFRegion");
3329 /************** obtain direct pointer to array elements ***********************/
3331 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
3333 STATS(jniinvokation();)
3334 java_objectheader *s = (java_objectheader*) array;
3335 arraydescriptor *desc = s->vftbl->arraydesc;
3337 if (!desc) return NULL;
3339 return ((u1*)s) + desc->dataoffset;
3343 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
3345 STATS(jniinvokation();)
3346 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
3351 /**** returns a pointer to an array of Unicode characters of the string *******/
3353 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
3355 STATS(jniinvokation();)
3356 log_text("JNI-Call: GetStringCritical");
3358 return GetStringChars(env,string,isCopy);
3361 /*********** native code no longer needs access to chars **********************/
3363 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
3365 STATS(jniinvokation();)
3366 log_text("JNI-Call: ReleaseStringCritical");
3368 ReleaseStringChars(env,string,cstring);
3372 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
3374 STATS(jniinvokation();)
3375 log_text("JNI-Call: NewWeakGlobalRef");
3381 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
3383 STATS(jniinvokation();)
3384 log_text("JNI-Call: DeleteWeakGlobalRef");
3390 /** Creates a new global reference to the object referred to by the obj argument **/
3392 jobject NewGlobalRef(JNIEnv* env, jobject lobj)
3397 STATS(jniinvokation();)
3399 MonitorEnter(env, *global_ref_table);
3401 refcount = CallObjectMethod(env, *global_ref_table, getmid, lobj);
3402 val = (refcount == NULL) ? 0 : CallIntMethod(env, refcount, intvalue);
3403 newval = NewObject(env, intclass, newint, val + 1);
3405 if (newval != NULL) {
3406 CallObjectMethod(env, *global_ref_table, putmid, lobj, newval);
3407 MonitorExit(env, *global_ref_table);
3411 log_text("JNI-NewGlobalRef: unable to create new java.lang.Integer");
3412 MonitorExit(env, *global_ref_table);
3417 /************* Deletes the global reference pointed to by globalRef **************/
3419 void DeleteGlobalRef(JNIEnv* env, jobject gref)
3423 STATS(jniinvokation();)
3425 MonitorEnter(env, *global_ref_table);
3426 refcount = CallObjectMethod(env, *global_ref_table, getmid, gref);
3428 if (refcount == NULL) {
3429 log_text("JNI-DeleteGlobalRef: unable to find global reference");
3433 val = CallIntMethod(env, refcount, intvalue);
3437 CallObjectMethod(env, *global_ref_table, removemid,refcount);
3440 jobject newval = NewObject(env, intclass, newint, val);
3442 if (newval != NULL) {
3443 CallObjectMethod(env,*global_ref_table, putmid,newval);
3446 log_text("JNI-DeleteGlobalRef: unable to create new java.lang.Integer");
3450 MonitorExit(env,*global_ref_table);
3454 /* ExceptionCheck **************************************************************
3456 Returns JNI_TRUE when there is a pending exception; otherwise,
3459 *******************************************************************************/
3461 jboolean ExceptionCheck(JNIEnv *env)
3463 STATS(jniinvokation();)
3464 return *exceptionptr ? JNI_TRUE : JNI_FALSE;
3468 /* New JNI 1.4 functions ******************************************************/
3470 /* NewDirectByteBuffer *********************************************************
3472 Allocates and returns a direct java.nio.ByteBuffer referring to the block of
3473 memory starting at the memory address address and extending capacity bytes.
3475 *******************************************************************************/
3477 jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
3479 STATS(jniinvokation();)
3480 log_text("NewDirectByteBuffer: IMPLEMENT ME!");
3486 /* GetDirectBufferAddress ******************************************************
3488 Fetches and returns the starting address of the memory region referenced by
3489 the given direct java.nio.Buffer.
3491 *******************************************************************************/
3493 void *GetDirectBufferAddress(JNIEnv *env, jobject buf)
3495 STATS(jniinvokation();)
3496 log_text("GetDirectBufferAddress: IMPLEMENT ME!");
3502 /* GetDirectBufferCapacity *****************************************************
3504 Fetches and returns the capacity in bytes of the memory region referenced by
3505 the given direct java.nio.Buffer.
3507 *******************************************************************************/
3509 jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf)
3511 STATS(jniinvokation();)
3512 log_text("GetDirectBufferCapacity: IMPLEMENT ME!");
3518 jint DestroyJavaVM(JavaVM *vm)
3520 STATS(jniinvokation();)
3521 log_text("DestroyJavaVM called");
3527 jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
3529 STATS(jniinvokation();)
3530 log_text("AttachCurrentThread called");
3532 #if !defined(HAVE___THREAD)
3533 /* cacao_thread_attach();*/
3535 #error "No idea how to implement that. Perhaps Stefan knows"
3543 jint DetachCurrentThread(JavaVM *vm)
3545 STATS(jniinvokation();)
3546 log_text("DetachCurrentThread called");
3552 jint GetEnv(JavaVM *vm, void **env, jint version)
3554 STATS(jniinvokation();)
3555 if ((version != JNI_VERSION_1_1) && (version != JNI_VERSION_1_2) &&
3556 (version != JNI_VERSION_1_4)) {
3558 return JNI_EVERSION;
3562 TODO: If the current thread is not attached to the VM...
3565 return JNI_EDETACHED;
3575 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
3577 STATS(jniinvokation();)
3578 log_text("AttachCurrentThreadAsDaemon called");
3583 /************* JNI Initialization ****************************************************/
3585 jobject jni_init1(JNIEnv* env, jobject lobj) {
3586 #if defined(USE_THREADS)
3587 while (initrunning) {yieldThread();} /* wait until init is done */
3589 if (global_ref_table == NULL) {
3592 #if defined(USE_THREADS)
3594 /* wait until jni_init is done */
3595 MonitorEnter(env, *global_ref_table) ;
3596 MonitorExit(env, *global_ref_table);
3599 return NewGlobalRef(env, lobj);
3601 void jni_init2(JNIEnv* env, jobject gref) {
3602 log_text("DeleteGlobalref called before NewGlobalref");
3603 #if defined(USE_THREADS)
3604 while (initrunning) {yieldThread();} /* wait until init is done */
3606 if (global_ref_table == NULL) {
3609 #if defined(USE_THREADS)
3611 /* wait until jni_init is done */
3612 MonitorEnter(env, *global_ref_table) ;
3613 MonitorExit(env, *global_ref_table);
3616 DeleteGlobalRef(env, gref);
3623 log_text("JNI-Init: initialize global_ref_table");
3624 /* initalize global reference table */
3625 ihmclass = FindClass(NULL, "java/util/IdentityHashMap");
3627 if (ihmclass == NULL) {
3628 log_text("JNI-Init: unable to find java.util.IdentityHashMap");
3631 mid = GetMethodID(NULL, ihmclass, "<init>","()V");
3633 log_text("JNI-Init: unable to find constructor in java.util.IdentityHashMap");
3636 global_ref_table = (jobject*)heap_allocate(sizeof(jobject),true,NULL);
3638 *global_ref_table = NewObject(NULL,ihmclass,mid);
3640 if (*global_ref_table == NULL) {
3641 log_text("JNI-Init: unable to create new global_ref_table");
3644 initrunning = false;
3646 getmid = GetMethodID(NULL, ihmclass, "get","(Ljava/lang/Object;)Ljava/lang/Object;");
3648 log_text("JNI-Init: unable to find method \"get\" in java.util.IdentityHashMap");
3651 getmid = GetMethodID(NULL ,ihmclass, "get","(Ljava/lang/Object;)Ljava/lang/Object;");
3652 if (getmid == NULL) {
3653 log_text("JNI-Init: unable to find method \"get\" in java.util.IdentityHashMap");
3656 putmid = GetMethodID(NULL, ihmclass, "put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
3657 if (putmid == NULL) {
3658 log_text("JNI-Init: unable to find method \"put\" in java.util.IdentityHashMap");
3661 intclass = FindClass(NULL, "java/lang/Integer");
3662 if (intclass == NULL) {
3663 log_text("JNI-Init: unable to find java.lang.Integer");
3666 newint = GetMethodID(NULL, intclass, "<init>","(I)V");
3667 if (newint == NULL) {
3668 log_text("JNI-Init: unable to find constructor in java.lang.Integer");
3671 intvalue = GetMethodID(NULL, intclass, "intValue","()I");
3672 if (intvalue == NULL) {
3673 log_text("JNI-Init: unable to find method \"intValue\" in java.lang.Integer");
3676 removemid = GetMethodID(NULL, ihmclass, "remove","(Ljava/lang/Object;)Ljava/lang/Object;");
3677 if (removemid == NULL) {
3678 log_text("JNI-DeleteGlobalRef: unable to find method \"remove\" in java.lang.Object");
3681 /* set NewGlobalRef, DeleteGlobalRef envTable entry to real implementation */
3683 JNI_JNIEnvTable.NewGlobalRef = &NewGlobalRef;
3684 JNI_JNIEnvTable.DeleteGlobalRef = &DeleteGlobalRef;
3688 /* JNI invocation table *******************************************************/
3690 const struct JNIInvokeInterface JNI_JavaVMTable = {
3696 AttachCurrentThread,
3697 DetachCurrentThread,
3699 AttachCurrentThreadAsDaemon
3703 /* JNI function table *********************************************************/
3705 struct JNINativeInterface JNI_JNIEnvTable = {
3714 &FromReflectedMethod,
3715 &FromReflectedField,
3730 &jni_init1, /* &NewGlobalRef, initialize Global_Ref_Table*/
3731 &jni_init2, /* &DeleteGlobalRef,*/
3735 &EnsureLocalCapacity,
3751 &CallBooleanMethodV,
3752 &CallBooleanMethodA,
3778 &CallNonvirtualObjectMethod,
3779 &CallNonvirtualObjectMethodV,
3780 &CallNonvirtualObjectMethodA,
3781 &CallNonvirtualBooleanMethod,
3782 &CallNonvirtualBooleanMethodV,
3783 &CallNonvirtualBooleanMethodA,
3784 &CallNonvirtualByteMethod,
3785 &CallNonvirtualByteMethodV,
3786 &CallNonvirtualByteMethodA,
3787 &CallNonvirtualCharMethod,
3788 &CallNonvirtualCharMethodV,
3789 &CallNonvirtualCharMethodA,
3790 &CallNonvirtualShortMethod,
3791 &CallNonvirtualShortMethodV,
3792 &CallNonvirtualShortMethodA,
3793 &CallNonvirtualIntMethod,
3794 &CallNonvirtualIntMethodV,
3795 &CallNonvirtualIntMethodA,
3796 &CallNonvirtualLongMethod,
3797 &CallNonvirtualLongMethodV,
3798 &CallNonvirtualLongMethodA,
3799 &CallNonvirtualFloatMethod,
3800 &CallNonvirtualFloatMethodV,
3801 &CallNonvirtualFloatMethodA,
3802 &CallNonvirtualDoubleMethod,
3803 &CallNonvirtualDoubleMethodV,
3804 &CallNonvirtualDoubleMethodA,
3805 &CallNonvirtualVoidMethod,
3806 &CallNonvirtualVoidMethodV,
3807 &CallNonvirtualVoidMethodA,
3832 &CallStaticObjectMethod,
3833 &CallStaticObjectMethodV,
3834 &CallStaticObjectMethodA,
3835 &CallStaticBooleanMethod,
3836 &CallStaticBooleanMethodV,
3837 &CallStaticBooleanMethodA,
3838 &CallStaticByteMethod,
3839 &CallStaticByteMethodV,
3840 &CallStaticByteMethodA,
3841 &CallStaticCharMethod,
3842 &CallStaticCharMethodV,
3843 &CallStaticCharMethodA,
3844 &CallStaticShortMethod,
3845 &CallStaticShortMethodV,
3846 &CallStaticShortMethodA,
3847 &CallStaticIntMethod,
3848 &CallStaticIntMethodV,
3849 &CallStaticIntMethodA,
3850 &CallStaticLongMethod,
3851 &CallStaticLongMethodV,
3852 &CallStaticLongMethodA,
3853 &CallStaticFloatMethod,
3854 &CallStaticFloatMethodV,
3855 &CallStaticFloatMethodA,
3856 &CallStaticDoubleMethod,
3857 &CallStaticDoubleMethodV,
3858 &CallStaticDoubleMethodA,
3859 &CallStaticVoidMethod,
3860 &CallStaticVoidMethodV,
3861 &CallStaticVoidMethodA,
3865 &GetStaticObjectField,
3866 &GetStaticBooleanField,
3867 &GetStaticByteField,
3868 &GetStaticCharField,
3869 &GetStaticShortField,
3871 &GetStaticLongField,
3872 &GetStaticFloatField,
3873 &GetStaticDoubleField,
3874 &SetStaticObjectField,
3875 &SetStaticBooleanField,
3876 &SetStaticByteField,
3877 &SetStaticCharField,
3878 &SetStaticShortField,
3880 &SetStaticLongField,
3881 &SetStaticFloatField,
3882 &SetStaticDoubleField,
3887 &ReleaseStringChars,
3890 &GetStringUTFLength,
3892 &ReleaseStringUTFChars,
3897 &GetObjectArrayElement,
3898 &SetObjectArrayElement,
3909 &GetBooleanArrayElements,
3910 &GetByteArrayElements,
3911 &GetCharArrayElements,
3912 &GetShortArrayElements,
3913 &GetIntArrayElements,
3914 &GetLongArrayElements,
3915 &GetFloatArrayElements,
3916 &GetDoubleArrayElements,
3918 &ReleaseBooleanArrayElements,
3919 &ReleaseByteArrayElements,
3920 &ReleaseCharArrayElements,
3921 &ReleaseShortArrayElements,
3922 &ReleaseIntArrayElements,
3923 &ReleaseLongArrayElements,
3924 &ReleaseFloatArrayElements,
3925 &ReleaseDoubleArrayElements,
3927 &GetBooleanArrayRegion,
3928 &GetByteArrayRegion,
3929 &GetCharArrayRegion,
3930 &GetShortArrayRegion,
3932 &GetLongArrayRegion,
3933 &GetFloatArrayRegion,
3934 &GetDoubleArrayRegion,
3935 &SetBooleanArrayRegion,
3936 &SetByteArrayRegion,
3937 &SetCharArrayRegion,
3938 &SetShortArrayRegion,
3940 &SetLongArrayRegion,
3941 &SetFloatArrayRegion,
3942 &SetDoubleArrayRegion,
3952 /* new JNI 1.2 functions */
3955 &GetStringUTFRegion,
3957 &GetPrimitiveArrayCritical,
3958 &ReleasePrimitiveArrayCritical,
3961 &ReleaseStringCritical,
3964 &DeleteWeakGlobalRef,
3968 /* new JNI 1.4 functions */
3970 &NewDirectByteBuffer,
3971 &GetDirectBufferAddress,
3972 &GetDirectBufferCapacity
3976 /* Invocation API Functions ***************************************************/
3978 /* JNI_GetDefaultJavaVMInitArgs ************************************************
3980 Returns a default configuration for the Java VM.
3982 *******************************************************************************/
3984 jint JNI_GetDefaultJavaVMInitArgs(void *vm_args)
3986 JDK1_1InitArgs *_vm_args = (JDK1_1InitArgs *) vm_args;
3988 /* GNU classpath currently supports JNI 1.2 */
3990 _vm_args->version = JNI_VERSION_1_2;
3996 /* JNI_GetCreatedJavaVMs *******************************************************
3998 Returns all Java VMs that have been created. Pointers to VMs are written in
3999 the buffer vmBuf in the order they are created. At most bufLen number of
4000 entries will be written. The total number of created VMs is returned in
4003 *******************************************************************************/
4005 jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
4007 log_text("JNI_GetCreatedJavaVMs: IMPLEMENT ME!!!");
4013 /* JNI_CreateJavaVM ************************************************************
4015 Loads and initializes a Java VM. The current thread becomes the main thread.
4016 Sets the env argument to the JNI interface pointer of the main thread.
4018 *******************************************************************************/
4020 jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args)
4022 *p_vm = (JavaVM *) &JNI_JavaVMTable;
4023 *p_env = (JNIEnv *) &JNI_JNIEnvTable;
4029 jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID, jobject obj, java_objectarray *params)
4036 if (methodID == 0) {
4037 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
4041 argcount = methodID->parseddesc->paramcount;
4043 /* the method is an instance method the obj has to be an instance of the
4044 class the method belongs to. For static methods the obj parameter
4046 if (!(methodID->flags & ACC_STATIC) && obj &&
4047 (!builtin_instanceof((java_objectheader *) obj, methodID->class))) {
4048 *exceptionptr = new_exception_message(string_java_lang_IllegalArgumentException,
4049 "Object parameter of wrong type in Java_java_lang_reflect_Method_invokeNative");
4056 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
4057 log_text("Too many arguments. invokeNativeHelper does not support that");
4061 if (((params==0) && (argcount != 0)) || (params && (params->header.size != argcount))) {
4062 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
4067 if (((methodID->flags & ACC_STATIC)==0) && (0==obj)) {
4069 new_exception_message(string_java_lang_NullPointerException,
4070 "Static mismatch in Java_java_lang_reflect_Method_invokeNative");
4074 if ((methodID->flags & ACC_STATIC) && (obj)) obj = 0;
4077 if ( (methodID->flags & ACC_ABSTRACT) || (methodID->class->flags & ACC_INTERFACE) ) {
4078 methodID=get_virtual(obj,methodID);
4082 blk = MNEW(jni_callblock, /*4 */argcount+2);
4084 if (!fill_callblock_objA(obj, methodID->parseddesc, blk, params,&retT))
4085 return 0; /* exception */
4089 (void) asm_calljavafunction2(methodID,
4091 (argcount + 1) * sizeof(jni_callblock),
4093 retVal = NULL; /*native_new_and_init(loader_load(utf_new_char("java/lang/Void")));*/
4096 case PRIMITIVETYPE_INT: {
4098 intVal = asm_calljavafunction2int(methodID,
4100 (argcount + 1) * sizeof(jni_callblock),
4102 retVal = builtin_new(class_java_lang_Integer);
4105 class_resolvemethod(retVal->vftbl->class,
4112 case PRIMITIVETYPE_BYTE: {
4114 intVal = asm_calljavafunction2int(methodID,
4116 (argcount + 1) * sizeof(jni_callblock),
4118 retVal = builtin_new(class_java_lang_Byte);
4121 class_resolvemethod(retVal->vftbl->class,
4128 case PRIMITIVETYPE_CHAR: {
4130 intVal = asm_calljavafunction2int(methodID,
4132 (argcount + 1) * sizeof(jni_callblock),
4134 retVal = builtin_new(class_java_lang_Character);
4137 class_resolvemethod(retVal->vftbl->class,
4144 case PRIMITIVETYPE_SHORT: {
4146 intVal = asm_calljavafunction2int(methodID,
4148 (argcount + 1) * sizeof(jni_callblock),
4150 retVal = builtin_new(class_java_lang_Short);
4153 class_resolvemethod(retVal->vftbl->class,
4160 case PRIMITIVETYPE_BOOLEAN: {
4162 intVal = asm_calljavafunction2int(methodID,
4164 (argcount + 1) * sizeof(jni_callblock),
4166 retVal = builtin_new(class_java_lang_Boolean);
4169 class_resolvemethod(retVal->vftbl->class,
4178 longVal = asm_calljavafunction2long(methodID,
4180 (argcount + 1) * sizeof(jni_callblock),
4182 retVal = builtin_new(class_java_lang_Long);
4185 class_resolvemethod(retVal->vftbl->class,
4192 case PRIMITIVETYPE_FLOAT: {
4194 floatVal = asm_calljavafunction2float(methodID,
4196 (argcount + 1) * sizeof(jni_callblock),
4198 retVal = builtin_new(class_java_lang_Float);
4201 class_resolvemethod(retVal->vftbl->class,
4208 case PRIMITIVETYPE_DOUBLE: {
4210 doubleVal = asm_calljavafunction2double(methodID,
4212 (argcount + 1) * sizeof(jni_callblock),
4214 retVal = builtin_new(class_java_lang_Double);
4217 class_resolvemethod(retVal->vftbl->class,
4225 retVal = asm_calljavafunction2(methodID,
4227 (argcount + 1) * sizeof(jni_callblock),
4232 /* if this happens the acception has already been set by fill_callblock_objA*/
4233 MFREE(blk, jni_callblock, /*4 */ argcount+2);
4234 return (jobject *) 0;
4237 MFREE(blk, jni_callblock, /* 4 */ argcount+2);
4239 if (*exceptionptr) {
4240 java_objectheader *exceptionToWrap = *exceptionptr;
4242 java_objectheader *ivte;
4244 *exceptionptr = NULL;
4245 if (load_class_bootstrap(utf_new_char("java/lang/reflect/InvocationTargetException"),
4248 ivte = builtin_new(ivtec);
4249 asm_calljavafunction(class_resolvemethod(ivtec,
4250 utf_new_char("<init>"),
4251 utf_new_char("(Ljava/lang/Throwable;)V")),
4258 if (*exceptionptr != NULL)
4259 panic("jni.c: error while creating InvocationTargetException wrapper");
4261 *exceptionptr = ivte;
4264 return (jobject *) retVal;
4271 * These are local overrides for various environment variables in Emacs.
4272 * Please do not remove this and leave it at the end of the file, where
4273 * Emacs will automagically detect them.
4274 * ---------------------------------------------------------------------
4277 * indent-tabs-mode: t