1 /* jni.c - implementation of the Java Native Interface functions
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5 M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6 P. Tomsich, J. Wenninger
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
29 Changes: Joseph Wenninger
31 $Id: jni.c 1252 2004-06-30 20:24:49Z twisti $
45 #include "statistics.h"
46 #include "threads/thread.h"
47 #include "toolbox/logging.h"
48 #include "toolbox/memory.h"
49 #include "nat/java_lang_Byte.h"
50 #include "nat/java_lang_Character.h"
51 #include "nat/java_lang_Short.h"
52 #include "nat/java_lang_Integer.h"
53 #include "nat/java_lang_Boolean.h"
54 #include "nat/java_lang_Long.h"
55 #include "nat/java_lang_Float.h"
56 #include "nat/java_lang_Double.h"
57 #include "nat/java_lang_Throwable.h"
60 #define JNI_VERSION 0x00010002
63 #define PTR_TO_ITEM(ptr) ((u8)(size_t)(ptr))
65 static utf* utf_char = 0;
66 static utf* utf_bool = 0;
67 static utf* utf_byte =0;
68 static utf* utf_short = 0;
69 static utf* utf_int = 0;
70 static utf* utf_long = 0;
71 static utf* utf_float = 0;
72 static utf* utf_double = 0;
75 /********************* accessing instance-fields **********************************/
77 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
78 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
79 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
83 u4 get_parametercount(methodinfo *m)
85 utf *descr = m->descriptor; /* method-descriptor */
86 char *utf_ptr = descr->text; /* current position in utf-text */
87 char *desc_end = utf_end(descr); /* points behind utf string */
88 u4 parametercount = 0;
93 /* determine number of parameters */
94 while (*utf_ptr != ')') {
95 get_type(&utf_ptr, desc_end, true);
99 return parametercount;
104 void fill_callblock(void *obj, utf *descr, jni_callblock blk[], va_list data, char ret)
106 char *utf__ptr = descr->text; /* current position in utf-text */
107 char **utf_ptr = &utf__ptr;
108 char *desc_end = utf_end(descr); /* points behind utf string */
114 log_text("fill_callblock");
121 /* determine number of parameters */
123 blk[0].itemtype = TYPE_ADR;
124 blk[0].item = PTR_TO_ITEM(obj);
128 while (**utf_ptr != ')') {
129 if (*utf_ptr >= desc_end)
130 panic("illegal method descriptor");
132 switch (utf_nextu2(utf_ptr)) {
133 /* primitive types */
138 blk[cnt].itemtype = TYPE_INT;
139 blk[cnt].item = (u8) va_arg(data, int);
143 blk[cnt].itemtype = TYPE_INT;
144 dummy = va_arg(data, u4);
145 /*printf("fill_callblock: pos:%d, value:%d\n",cnt,dummy);*/
146 blk[cnt].item = (u8) dummy;
150 blk[cnt].itemtype = TYPE_LNG;
151 blk[cnt].item = (u8) va_arg(data, jlong);
155 blk[cnt].itemtype = TYPE_FLT;
156 *((jfloat *) (&blk[cnt].item)) = (jfloat) va_arg(data, jdouble);
160 blk[cnt].itemtype = TYPE_DBL;
161 *((jdouble *) (&blk[cnt].item)) = (jdouble) va_arg(data, jdouble);
165 panic ("V not allowed as function parameter");
169 while (utf_nextu2(utf_ptr) != ';')
170 blk[cnt].itemtype = TYPE_ADR;
171 blk[cnt].item = PTR_TO_ITEM(va_arg(data, void*));
178 /* char *start = *utf_ptr; */
180 while ((ch = utf_nextu2(utf_ptr)) == '[')
182 while (utf_nextu2(utf_ptr) != ';') {}
185 ch = utf_nextu2(utf_ptr);
186 blk[cnt].itemtype = TYPE_ADR;
187 blk[cnt].item = PTR_TO_ITEM(va_arg(data, void*));
194 /*the standard doesn't say anything about return value checking, but it appears to be usefull*/
195 c = utf_nextu2(utf_ptr);
196 c = utf_nextu2(utf_ptr);
197 /*printf("%c %c\n",ret,c);*/
199 if (!((c == 'L') || (c == '[')))
200 log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
202 log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
206 /* XXX it could be considered if we should do typechecking here in the future */
207 char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_objectarray* params)
209 char *utf__ptr = descr->text; /* current position in utf-text */
210 char **utf_ptr = &utf__ptr;
211 char *desc_end = utf_end(descr); /* points behind utf string */
218 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
222 utf_char=utf_new_char("java/lang/Character");
223 utf_bool=utf_new_char("java/lang/Boolean");
224 utf_byte=utf_new_char("java/lang/Byte");
225 utf_short=utf_new_char("java/lang/Short");
226 utf_int=utf_new_char("java/lang/Integer");
227 utf_long=utf_new_char("java/lang/Long");
228 utf_float=utf_new_char("java/lang/Float");
229 utf_double=utf_new_char("java/lang/Double");
231 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
236 log_text("fill_callblock");
243 /* determine number of parameters */
245 blk[0].itemtype = TYPE_ADR;
246 blk[0].item = PTR_TO_ITEM(obj);
254 while (**utf_ptr != ')') {
255 if (*utf_ptr >= desc_end)
256 panic("illegal method descriptor");
258 /* primitive types */
259 switch (utf_nextu2(utf_ptr)) {
261 param = params->data[cnts];
263 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
266 if (param->vftbl->class->name == utf_byte) {
267 blk[cnt].itemtype = TYPE_INT;
268 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
271 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
277 param = params->data[cnts];
279 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
282 if (param->vftbl->class->name == utf_char) {
283 blk[cnt].itemtype = TYPE_INT;
284 blk[cnt].item = (u8) ((java_lang_Character *) param)->value;
287 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
293 param = params->data[cnts];
295 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
298 if (param->vftbl->class->name == utf_short) {
299 blk[cnt].itemtype = TYPE_INT;
300 blk[cnt].item = (u8) ((java_lang_Short *) param)->value;
303 if (param->vftbl->class->name == utf_byte) {
304 blk[cnt].itemtype = TYPE_INT;
305 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
308 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
315 param = params->data[cnts];
317 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
320 if (param->vftbl->class->name == utf_bool) {
321 blk[cnt].itemtype = TYPE_INT;
322 blk[cnt].item = (u8) ((java_lang_Boolean *) param)->value;
325 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
331 /*log_text("fill_callblock_objA: param 'I'");*/
332 param = params->data[cnts];
334 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
337 if (param->vftbl->class->name == utf_int) {
338 blk[cnt].itemtype = TYPE_INT;
339 blk[cnt].item = (u8) ((java_lang_Integer *) param)->value;
340 /*printf("INT VALUE :%d\n",((struct java_lang_Integer * )param)->value);*/
342 if (param->vftbl->class->name == utf_short) {
343 blk[cnt].itemtype = TYPE_INT;
344 blk[cnt].item = (u8) ((java_lang_Short *) param)->value;
347 if (param->vftbl->class->name == utf_byte) {
348 blk[cnt].itemtype = TYPE_INT;
349 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
352 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
360 param = params->data[cnts];
362 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
365 if (param->vftbl->class->name == utf_long) {
366 blk[cnt].itemtype = TYPE_LNG;
367 blk[cnt].item = (u8) ((java_lang_Long *) param)->value;
370 if (param->vftbl->class->name == utf_int) {
371 blk[cnt].itemtype = TYPE_LNG;
372 blk[cnt].item = (u8) ((java_lang_Integer *) param)->value;
375 if (param->vftbl->class->name == utf_short) {
376 blk[cnt].itemtype = TYPE_LNG;
377 blk[cnt].item = (u8) ((java_lang_Short *) param)->value;
380 if (param->vftbl->class->name == utf_byte) {
381 blk[cnt].itemtype = TYPE_LNG;
382 blk[cnt].item = (u8) ((java_lang_Byte *) param)->value;
384 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
394 param = params->data[cnts];
396 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
400 if (param->vftbl->class->name == utf_float) {
401 blk[cnt].itemtype = TYPE_FLT;
402 *((jfloat *) (&blk[cnt].item)) = (jfloat) ((java_lang_Float *) param)->value;
405 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
411 param = params->data[cnts];
413 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
417 if (param->vftbl->class->name == utf_double) {
418 blk[cnt].itemtype = TYPE_DBL;
419 *((jdouble *) (&blk[cnt].item)) = (jdouble) ((java_lang_Float *) param)->value;
422 if (param->vftbl->class->name == utf_float) {
423 blk[cnt].itemtype = TYPE_DBL;
424 *((jdouble *) (&blk[cnt].item)) = (jdouble) ((java_lang_Float *) param)->value;
427 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
434 panic("V not allowed as function parameter");
439 char *start = (*utf_ptr) - 1;
442 while (utf_nextu2(utf_ptr) != ';')
443 end = (*utf_ptr) + 1;
445 if (!builtin_instanceof(params->data[cnts], class_from_descriptor(start, end, 0, CLASSLOAD_LOAD))) {
446 if (params->data[cnts] != 0) {
447 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
452 blk[cnt].itemtype = TYPE_ADR;
453 blk[cnt].item = PTR_TO_ITEM(params->data[cnts]);
459 char *start = (*utf_ptr) - 1;
463 while ((ch = utf_nextu2(utf_ptr)) == '[')
465 while (utf_nextu2(utf_ptr) != ';') {}
468 end = (*utf_ptr) - 1;
469 ch = utf_nextu2(utf_ptr);
471 if (!builtin_arrayinstanceof(params->data[cnts], class_from_descriptor(start, end, 0, CLASSLOAD_LOAD)->vftbl)) {
472 *exceptionptr = new_exception("java/lang/IllegalArgumentException");
476 blk[cnt].itemtype = TYPE_ADR;
477 blk[cnt].item = PTR_TO_ITEM(params->data[cnts]);
485 c = utf_nextu2(utf_ptr);
486 c = utf_nextu2(utf_ptr);
487 return c; /*return type needed usage of the right lowlevel methods*/
504 jmethodID get_virtual(jobject obj,jmethodID methodID) {
505 if (obj->vftbl->class==methodID->class) return methodID;
506 return class_resolvemethod (obj->vftbl->class, methodID->name, methodID->descriptor);
509 jmethodID get_nonvirtual(jclass clazz,jmethodID methodID) {
510 if (clazz==methodID->class) return methodID;
511 /*class_resolvemethod -> classfindmethod? (JOWENN)*/
512 return class_resolvemethod (clazz, methodID->name, methodID->descriptor);
517 jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
524 log_text("JNI-Call: CallObjectMethodV");
525 utf_display(methodID->name);
526 utf_display(methodID->descriptor);
527 printf("\nParmaeter count: %d\n",argcount);
528 utf_display(obj->vftbl->class->name);
533 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
537 argcount = get_parametercount(methodID);
539 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
540 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
541 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
545 if (obj && !builtin_instanceof(obj, methodID->class)) {
546 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
551 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
552 log_text("Too many arguments. CallObjectMethod does not support that");
556 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
558 fill_callblock(obj, methodID->descriptor, blk, args, 'O');
560 /* printf("parameter: obj: %p",blk[0].item); */
561 ret = asm_calljavafunction2(methodID,
563 (argcount + 1) * sizeof(jni_callblock),
566 MFREE(blk, jni_callblock, argcount + 1);
567 /* printf("(CallObjectMethodV)-->%p\n",ret); */
573 core function for integer class methods (bool, byte, short, integer)
574 This is basically needed for i386
576 jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list args)
582 /* printf("%p, %c\n",retType,methodID,retType);*/
585 log_text("JNI-Call: CallObjectMethodV");
586 utf_display(methodID->name);
587 utf_display(methodID->descriptor);
588 printf("\nParmaeter count: %d\n",argcount);
589 utf_display(obj->vftbl->class->name);
593 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
597 argcount = get_parametercount(methodID);
599 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
600 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
601 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
605 if (obj && !builtin_instanceof(obj, methodID->class)) {
606 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
612 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
613 log_text("Too many arguments. CallIntegerMethod does not support that");
617 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
619 fill_callblock(obj, methodID->descriptor, blk, args, retType);
621 /* printf("parameter: obj: %p",blk[0].item); */
622 ret = (jint) asm_calljavafunction2(methodID,
624 (argcount + 1) * sizeof(jni_callblock),
627 MFREE(blk, jni_callblock, argcount + 1);
628 /* printf("(CallObjectMethodV)-->%p\n",ret); */
634 /*core function for long class functions*/
635 jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
642 log_text("JNI-Call: CallObjectMethodV");
643 utf_display(methodID->name);
644 utf_display(methodID->descriptor);
645 printf("\nParmaeter count: %d\n",argcount);
646 utf_display(obj->vftbl->class->name);
650 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
654 argcount = get_parametercount(methodID);
656 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
657 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
658 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
662 if (obj && !builtin_instanceof(obj,methodID->class)) {
663 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
669 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
670 log_text("Too many arguments. CallObjectMethod does not support that");
674 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
676 fill_callblock(obj, methodID->descriptor, blk, args, 'L');
678 /* printf("parameter: obj: %p",blk[0].item); */
679 ret = asm_calljavafunction2long(methodID,
681 (argcount + 1) * sizeof(jni_callblock),
684 MFREE(blk, jni_callblock, argcount + 1);
685 /* printf("(CallObjectMethodV)-->%p\n",ret); */
691 /*core function for float class methods (float,double)*/
692 jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,char retType)
694 int argcount = get_parametercount(methodID);
699 log_text("JNI-Call: CallObjectMethodV");
700 utf_display(methodID->name);
701 utf_display(methodID->descriptor);
702 printf("\nParmaeter count: %d\n",argcount);
703 utf_display(obj->vftbl->class->name);
708 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
709 log_text("Too many arguments. CallObjectMethod does not support that");
713 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
715 fill_callblock(obj, methodID->descriptor, blk, args, retType);
717 /* printf("parameter: obj: %p",blk[0].item); */
718 ret = asm_calljavafunction2double(methodID,
720 (argcount + 1) * sizeof(jni_callblock),
723 MFREE(blk, jni_callblock, argcount + 1);
724 /* printf("(CallObjectMethodV)-->%p\n",ret); */
730 /*************************** function: jclass_findfield ****************************
732 searches for field with specified name and type in a 'classinfo'-structur
733 if no such field is found NULL is returned
735 ************************************************************************************/
737 fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
740 /* printf(" FieldCount: %d\n",c->fieldscount);
741 utf_display(c->name); */
742 for (i = 0; i < c->fieldscount; i++) {
743 /* utf_display(c->fields[i].name);
745 utf_display(c->fields[i].descriptor);
747 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
748 return &(c->fields[i]);
751 if (c->super) return jclass_findfield(c->super,name,desc);
756 /********************* returns version of native method interface *****************/
758 jint GetVersion (JNIEnv* env)
764 /****************** loads a class from a buffer of raw class data *****************/
766 jclass DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len)
773 #if defined(USE_THREADS)
774 #if defined(NATIVE_THREADS)
784 starttime = getcputime();
786 clazz = class_new(utf_new_char((char *) name));
788 /* build a classbuffer with the given data */
789 cb = NEW(classbuffer);
792 cb->data = (u1 *) buf;
793 cb->pos = cb->data - 1;
795 class_load_intern(cb);
798 FREE(cb, classbuffer);
801 if (getloadingtime) {
802 stoptime = getcputime();
803 loadingtime += (stoptime - starttime);
806 #if defined(USE_THREADS)
807 #if defined(NATIVE_THREADS)
818 /* XXX link the class here? */
825 clazz->classloader = loader;
831 /*************** loads locally defined class with the specified name **************/
833 jclass FindClass(JNIEnv* env, const char *name)
837 c = class_new(utf_new_char_classname((char *) name));
853 /***********************************************************************************
855 converts java.lang.reflect.Method or
856 java.lang.reflect.Constructor object to a method ID
858 **********************************************************************************/
860 jmethodID FromReflectedMethod(JNIEnv* env, jobject method)
862 /* log_text("JNI-Call: FromReflectedMethod"); */
868 /*************** return superclass of the class represented by sub ****************/
870 jclass GetSuperclass(JNIEnv* env, jclass sub)
874 c = ((classinfo*) sub)->super;
878 use_class_as_object(c);
884 /*********************** check whether sub can be cast to sup ********************/
886 jboolean IsAssignableForm(JNIEnv* env, jclass sub, jclass sup)
888 return builtin_isanysubclass(sub, sup);
892 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
894 jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
896 /* log_text("JNI-Call: ToReflectedField"); */
902 /***************** throw java.lang.Throwable object ******************************/
904 jint Throw(JNIEnv* env, jthrowable obj)
906 *exceptionptr = (java_objectheader*) obj;
912 /*******************************************************************************
914 create exception object from the class clazz with the
915 specified message and cause it to be thrown
917 *******************************************************************************/
919 jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
921 java_lang_Throwable *o;
923 /* instantiate exception object */
924 o = (java_lang_Throwable *) native_new_and_init((classinfo*) clazz);
928 o->detailMessage = (java_lang_String *) javastring_new_char((char *) msg);
930 *exceptionptr = (java_objectheader *) o;
936 /************************* check if exception occured *****************************/
938 jthrowable ExceptionOccurred (JNIEnv* env)
940 return (jthrowable) *exceptionptr;
943 /********** print exception and a backtrace of the stack (for debugging) **********/
945 void ExceptionDescribe (JNIEnv* env)
947 utf_display((*exceptionptr)->vftbl->class->name);
953 /******************* clear any exception currently being thrown *******************/
955 void ExceptionClear (JNIEnv* env)
957 *exceptionptr = NULL;
961 /********** raises a fatal error and does not expect the VM to recover ************/
963 void FatalError (JNIEnv* env, const char *msg)
968 /******************* creates a new local reference frame **************************/
970 jint PushLocalFrame(JNIEnv* env, jint capacity)
977 /**************** Pops off the current local reference frame **********************/
979 jobject PopLocalFrame(JNIEnv* env, jobject result)
987 /** Creates a new global reference to the object referred to by the obj argument **/
989 jobject NewGlobalRef(JNIEnv* env, jobject lobj)
994 /************* Deletes the global reference pointed to by globalRef **************/
996 void DeleteGlobalRef (JNIEnv* env, jobject gref)
1002 /*************** Deletes the local reference pointed to by localRef ***************/
1004 void DeleteLocalRef (JNIEnv* env, jobject localRef)
1009 /********** Tests whether two references refer to the same Java object ************/
1011 jboolean IsSameObject (JNIEnv* env, jobject obj1, jobject obj2)
1013 return (obj1==obj2);
1016 /***** Creates a new local reference that refers to the same object as ref *******/
1018 jobject NewLocalRef (JNIEnv* env, jobject ref)
1023 /***********************************************************************************
1025 Ensures that at least a given number of local references can
1026 be created in the current thread
1028 **********************************************************************************/
1030 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
1032 return 0; /* return 0 on success */
1036 /********* Allocates a new Java object without invoking a constructor *************/
1038 jobject AllocObject (JNIEnv* env, jclass clazz)
1040 java_objectheader *o = builtin_new(clazz);
1045 /***********************************************************************************
1047 Constructs a new Java object
1048 arguments that are to be passed to the constructor are placed after methodID
1050 ***********************************************************************************/
1052 jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
1054 java_objectheader *o;
1056 int argcount=get_parametercount(methodID);
1060 /* log_text("JNI-Call: NewObject"); */
1063 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
1064 log_text("Too many arguments. NewObject does not support that");
1069 o = builtin_new (clazz); /* create object */
1071 if (!o) return NULL;
1073 va_start(vaargs,methodID);
1074 for (i=0;i<argcount;i++) {
1075 args[i]=va_arg(vaargs,void*);
1078 asm_calljavafunction(methodID,o,args[0],args[1],args[2]);
1084 /***********************************************************************************
1086 Constructs a new Java object
1087 arguments that are to be passed to the constructor are placed in va_list args
1089 ***********************************************************************************/
1091 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
1093 /* log_text("JNI-Call: NewObjectV"); */
1099 /***********************************************************************************
1101 Constructs a new Java object
1102 arguments that are to be passed to the constructor are placed in
1103 args array of jvalues
1105 ***********************************************************************************/
1107 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
1109 /* log_text("JNI-Call: NewObjectA"); */
1115 /************************ returns the class of an object **************************/
1117 jclass GetObjectClass(JNIEnv* env, jobject obj)
1119 classinfo *c = obj->vftbl->class;
1121 use_class_as_object(c);
1127 /************* tests whether an object is an instance of a class ******************/
1129 jboolean IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz)
1131 return builtin_instanceof(obj,clazz);
1135 /***************** converts a java.lang.reflect.Field to a field ID ***************/
1137 jfieldID FromReflectedField(JNIEnv* env, jobject field)
1139 log_text("JNI-Call: FromReflectedField");
1145 /**********************************************************************************
1147 converts a method ID to a java.lang.reflect.Method or
1148 java.lang.reflect.Constructor object
1150 **********************************************************************************/
1152 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
1154 log_text("JNI-Call: ToReflectedMethod");
1160 /**************** returns the method ID for an instance method ********************/
1162 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
1166 m = class_resolvemethod (
1168 utf_new_char ((char*) name),
1169 utf_new_char ((char*) sig)
1172 if (!m) *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
1173 else if (m->flags & ACC_STATIC) {
1175 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
1181 /******************** JNI-functions for calling instance methods ******************/
1183 jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1188 /* log_text("JNI-Call: CallObjectMethod");*/
1190 va_start(vaargs, methodID);
1191 ret = callObjectMethod(obj, methodID, vaargs);
1198 jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1200 return callObjectMethod(obj,methodID,args);
1204 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1206 log_text("JNI-Call: CallObjectMethodA");
1214 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1219 /* log_text("JNI-Call: CallBooleanMethod");*/
1221 va_start(vaargs,methodID);
1222 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',vaargs);
1228 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1230 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',args);
1234 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1236 log_text("JNI-Call: CallBooleanMethodA");
1241 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1246 /* log_text("JNI-Call: CallVyteMethod");*/
1248 va_start(vaargs,methodID);
1249 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'B',vaargs);
1255 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1257 /* log_text("JNI-Call: CallByteMethodV");*/
1258 return callIntegerMethod(obj,methodID,'B',args);
1262 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1264 log_text("JNI-Call: CallByteMethodA");
1270 jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1275 /* log_text("JNI-Call: CallCharMethod");*/
1277 va_start(vaargs,methodID);
1278 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'C', vaargs);
1285 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1287 /* log_text("JNI-Call: CallCharMethodV");*/
1288 return callIntegerMethod(obj,get_virtual(obj,methodID),'C',args);
1292 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1294 log_text("JNI-Call: CallCharMethodA");
1300 jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1305 /* log_text("JNI-Call: CallShortMethod");*/
1307 va_start(vaargs, methodID);
1308 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'S', vaargs);
1315 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1317 return callIntegerMethod(obj, get_virtual(obj, methodID), 'S', args);
1321 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1323 log_text("JNI-Call: CallShortMethodA");
1330 jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1335 va_start(vaargs,methodID);
1336 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'I', vaargs);
1343 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1345 return callIntegerMethod(obj, get_virtual(obj, methodID), 'I', args);
1349 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1351 log_text("JNI-Call: CallIntMethodA");
1358 jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1360 log_text("JNI-Call: CallLongMethod");
1366 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1368 log_text("JNI-Call: CallLongMethodV");
1374 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1376 log_text("JNI-Call: CallLongMethodA");
1383 jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1388 /* log_text("JNI-Call: CallFloatMethod");*/
1390 va_start(vaargs,methodID);
1391 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'F');
1398 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1400 log_text("JNI-Call: CallFloatMethodV");
1401 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'F');
1405 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1407 log_text("JNI-Call: CallFloatMethodA");
1414 jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1419 /* log_text("JNI-Call: CallDoubleMethod");*/
1421 va_start(vaargs,methodID);
1422 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'D');
1429 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1431 log_text("JNI-Call: CallDoubleMethodV");
1432 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'D');
1436 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1438 log_text("JNI-Call: CallDoubleMethodA");
1444 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1448 /* log_text("JNI-Call: CallVoidMethod");*/
1450 va_start(vaargs,methodID);
1451 (void) callIntegerMethod(obj, get_virtual(obj, methodID), 'V', vaargs);
1456 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1458 log_text("JNI-Call: CallVoidMethodV");
1459 (void)callIntegerMethod(obj,get_virtual(obj,methodID),'V',args);
1463 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1465 log_text("JNI-Call: CallVoidMethodA");
1470 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1472 log_text("JNI-Call: CallNonvirtualObjectMethod");
1478 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1480 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1486 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1488 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1495 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1500 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1502 va_start(vaargs,methodID);
1503 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',vaargs);
1510 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1512 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1513 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',args);
1517 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1519 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1526 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1531 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1533 va_start(vaargs,methodID);
1534 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',vaargs);
1540 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1542 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1543 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',args);
1548 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1550 log_text("JNI-Call: CallNonvirtualByteMethodA");
1557 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1562 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1564 va_start(vaargs,methodID);
1565 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',vaargs);
1571 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1573 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1574 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',args);
1578 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1580 log_text("JNI-Call: CallNonvirtualCharMethodA");
1587 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1592 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1594 va_start(vaargs,methodID);
1595 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',vaargs);
1601 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1603 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1604 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',args);
1608 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1610 log_text("JNI-Call: CallNonvirtualShortMethodA");
1617 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1623 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1625 va_start(vaargs,methodID);
1626 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',vaargs);
1632 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1634 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1635 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',args);
1639 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1641 log_text("JNI-Call: CallNonvirtualIntMethodA");
1648 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1650 log_text("JNI-Call: CallNonvirtualLongMethod");
1656 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1658 log_text("JNI-Call: CallNonvirtualLongMethodV");
1664 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1666 log_text("JNI-Call: CallNonvirtualLongMethodA");
1673 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1678 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1681 va_start(vaargs,methodID);
1682 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'F');
1689 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1691 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1692 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'F');
1696 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1698 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1705 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1709 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1711 va_start(vaargs,methodID);
1712 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'D');
1719 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1721 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1722 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'D');
1726 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1728 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1735 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1739 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1741 va_start(vaargs,methodID);
1742 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',vaargs);
1748 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1750 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1752 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',args);
1757 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1759 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1762 /************************* JNI-functions for accessing fields ************************/
1764 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1768 /* log_text("========================= searching for:");
1771 f = jclass_findfield(clazz,
1772 utf_new_char ((char*) name),
1773 utf_new_char ((char*) sig)
1777 /* utf_display(clazz->name);
1780 *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);
1785 /*************************** retrieve fieldid, abort on error ************************/
1787 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
1789 jfieldID id = GetFieldID(env, clazz, name, sig);
1793 utf_display(clazz->name);
1794 log_text("\nfield:");
1799 panic("setfield_critical failed");
1804 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1806 return getField(obj,jobject,fieldID);
1809 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1811 return getField(obj,jboolean,fieldID);
1815 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1817 return getField(obj,jbyte,fieldID);
1821 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1823 return getField(obj,jchar,fieldID);
1827 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1829 return getField(obj,jshort,fieldID);
1833 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1835 return getField(obj,jint,fieldID);
1839 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1841 return getField(obj,jlong,fieldID);
1845 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1847 return getField(obj,jfloat,fieldID);
1851 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1853 return getField(obj,jdouble,fieldID);
1856 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1858 setField(obj,jobject,fieldID,val);
1862 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1864 setField(obj,jboolean,fieldID,val);
1868 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1870 setField(obj,jbyte,fieldID,val);
1874 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1876 setField(obj,jchar,fieldID,val);
1880 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
1882 setField(obj,jshort,fieldID,val);
1886 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
1888 setField(obj,jint,fieldID,val);
1892 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
1894 setField(obj,jlong,fieldID,val);
1898 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
1900 setField(obj,jfloat,fieldID,val);
1904 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
1906 setField(obj,jdouble,fieldID,val);
1910 /**************** JNI-functions for calling static methods **********************/
1912 jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
1916 m = class_resolvemethod(clazz,
1917 utf_new_char((char *) name),
1918 utf_new_char((char *) sig));
1920 if (!m) *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
1921 else if (!(m->flags & ACC_STATIC)) {
1923 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
1930 jobject CallStaticObjectMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1935 /* log_text("JNI-Call: CallStaticObjectMethod");*/
1937 va_start(vaargs, methodID);
1938 ret = callObjectMethod(0, methodID, vaargs);
1945 jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1947 /* log_text("JNI-Call: CallStaticObjectMethodV"); */
1949 return callObjectMethod(0,methodID,args);
1953 jobject CallStaticObjectMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1955 log_text("JNI-Call: CallStaticObjectMethodA");
1961 jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1966 va_start(vaargs, methodID);
1967 ret = (jboolean) callIntegerMethod(0, methodID, 'Z', vaargs);
1974 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1976 return (jboolean) callIntegerMethod(0, methodID, 'Z', args);
1980 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1982 log_text("JNI-Call: CallStaticBooleanMethodA");
1988 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1993 /* log_text("JNI-Call: CallStaticByteMethod");*/
1995 va_start(vaargs, methodID);
1996 ret = (jbyte) callIntegerMethod(0, methodID, 'B', vaargs);
2003 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2005 return (jbyte) callIntegerMethod(0, methodID, 'B', args);
2009 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2011 log_text("JNI-Call: CallStaticByteMethodA");
2017 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2022 /* log_text("JNI-Call: CallStaticByteMethod");*/
2024 va_start(vaargs, methodID);
2025 ret = (jchar) callIntegerMethod(0, methodID, 'C', vaargs);
2032 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2034 return (jchar) callIntegerMethod(0, methodID, 'C', args);
2038 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2040 log_text("JNI-Call: CallStaticCharMethodA");
2047 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2052 /* log_text("JNI-Call: CallStaticByteMethod");*/
2054 va_start(vaargs, methodID);
2055 ret = (jshort) callIntegerMethod(0, methodID, 'S', vaargs);
2062 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2064 /*log_text("JNI-Call: CallStaticShortMethodV");*/
2065 return (jshort) callIntegerMethod(0, methodID, 'S', args);
2069 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2071 log_text("JNI-Call: CallStaticShortMethodA");
2078 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2083 /* log_text("JNI-Call: CallStaticIntMethod");*/
2085 va_start(vaargs, methodID);
2086 ret = callIntegerMethod(0, methodID, 'I', vaargs);
2093 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2095 log_text("JNI-Call: CallStaticIntMethodV");
2097 return callIntegerMethod(0, methodID, 'I', args);
2101 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2103 log_text("JNI-Call: CallStaticIntMethodA");
2110 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2115 /* log_text("JNI-Call: CallStaticLongMethod");*/
2117 va_start(vaargs, methodID);
2118 ret = callLongMethod(0, methodID, vaargs);
2125 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2127 log_text("JNI-Call: CallStaticLongMethodV");
2129 return callLongMethod(0,methodID,args);
2133 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2135 log_text("JNI-Call: CallStaticLongMethodA");
2142 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2147 /* log_text("JNI-Call: CallStaticLongMethod");*/
2149 va_start(vaargs, methodID);
2150 ret = callFloatMethod(0, methodID, vaargs, 'F');
2157 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2160 return callFloatMethod(0, methodID, args, 'F');
2165 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2167 log_text("JNI-Call: CallStaticFloatMethodA");
2174 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2179 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
2181 va_start(vaargs,methodID);
2182 ret = callFloatMethod(0, methodID, vaargs, 'D');
2189 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2191 log_text("JNI-Call: CallStaticDoubleMethodV");
2193 return callFloatMethod(0, methodID, args, 'D');
2197 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2199 log_text("JNI-Call: CallStaticDoubleMethodA");
2205 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
2209 /* log_text("JNI-Call: CallStaticVoidMethod");*/
2211 va_start(vaargs, methodID);
2212 (void) callIntegerMethod(0, methodID, 'V', vaargs);
2217 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
2219 log_text("JNI-Call: CallStaticVoidMethodV");
2220 (void)callIntegerMethod(0, methodID, 'V', args);
2224 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
2226 log_text("JNI-Call: CallStaticVoidMethodA");
2230 /****************** JNI-functions for accessing static fields ********************/
2232 jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
2236 f = jclass_findfield(clazz,
2237 utf_new_char ((char*) name),
2238 utf_new_char ((char*) sig)
2241 if (!f) *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);
2247 jobject GetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2250 return fieldID->value.a;
2254 jboolean GetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2257 return fieldID->value.i;
2261 jbyte GetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2264 return fieldID->value.i;
2268 jchar GetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2271 return fieldID->value.i;
2275 jshort GetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2278 return fieldID->value.i;
2282 jint GetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2285 return fieldID->value.i;
2289 jlong GetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2292 return fieldID->value.l;
2296 jfloat GetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2299 return fieldID->value.f;
2303 jdouble GetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2306 return fieldID->value.d;
2311 void SetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
2314 fieldID->value.a = value;
2318 void SetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
2321 fieldID->value.i = value;
2325 void SetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
2328 fieldID->value.i = value;
2332 void SetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
2335 fieldID->value.i = value;
2339 void SetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
2342 fieldID->value.i = value;
2346 void SetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
2349 fieldID->value.i = value;
2353 void SetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
2356 fieldID->value.l = value;
2360 void SetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
2363 fieldID->value.f = value;
2367 void SetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
2370 fieldID->value.d = value;
2374 /***** create new java.lang.String object from an array of Unicode characters ****/
2376 jstring NewString (JNIEnv *env, const jchar *buf, jsize len)
2379 java_lang_String *s;
2382 s = (java_lang_String*) builtin_new (class_java_lang_String);
2383 a = builtin_newarray_char (len);
2385 /* javastring or characterarray could not be created */
2386 if ( (!a) || (!s) ) return NULL;
2389 for (i=0; i<len; i++) a->data[i] = buf[i];
2398 static char emptyString[]="";
2399 static jchar emptyStringJ[]={0,0};
2401 /******************* returns the length of a Java string ***************************/
2403 jsize GetStringLength (JNIEnv *env, jstring str)
2405 return ((java_lang_String*) str)->count;
2409 /******************** convertes javastring to u2-array ****************************/
2411 u2 *javastring_tou2 (jstring so)
2413 java_lang_String *s = (java_lang_String*) so;
2418 if (!s) return NULL;
2421 if (!a) return NULL;
2423 /* allocate memory */
2424 stringbuffer = MNEW( u2 , s->count + 1 );
2427 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
2429 /* terminate string */
2430 stringbuffer[i] = '\0';
2432 return stringbuffer;
2435 /********* returns a pointer to an array of Unicode characters of the string *******/
2437 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
2439 jchar *jc=javastring_tou2(str);
2442 if (isCopy) *isCopy=JNI_TRUE;
2445 if (isCopy) *isCopy=JNI_TRUE;
2446 return emptyStringJ;
2449 /**************** native code no longer needs access to chars **********************/
2451 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
2453 if (chars==emptyStringJ) return;
2454 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
2457 /************ create new java.lang.String object from utf8-characterarray **********/
2459 jstring NewStringUTF (JNIEnv *env, const char *utf)
2461 /* log_text("NewStringUTF called");*/
2462 return (jstring) javastring_new(utf_new_char((char *) utf));
2465 /****************** returns the utf8 length in bytes of a string *******************/
2467 jsize GetStringUTFLength (JNIEnv *env, jstring string)
2469 java_lang_String *s = (java_lang_String*) string;
2471 return (jsize) u2_utflength(s->value->data, s->count);
2475 /************ converts a Javastring to an array of UTF-8 characters ****************/
2477 const char* GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
2481 u = javastring_toutf((java_lang_String *) string, false);
2484 *isCopy = JNI_FALSE;
2494 /***************** native code no longer needs access to utf ***********************/
2496 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2498 /*we don't release utf chars right now, perhaps that should be done later. Since there is always one reference
2499 the garbage collector will never get them*/
2501 log_text("JNI-Call: ReleaseStringUTFChars");
2502 utf_display(utf_new_char(chars));
2506 /************************** array operations ***************************************/
2508 jsize GetArrayLength(JNIEnv *env, jarray array)
2514 jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
2516 java_objectarray *j;
2519 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2523 j = builtin_anewarray(len, clazz);
2529 jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
2533 if (index < array->header.size)
2534 j = array->data[index];
2536 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2542 void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject val)
2544 if (index >= array->header.size)
2545 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2548 /* check if the class of value is a subclass of the element class of the array */
2549 if (!builtin_canstore((java_objectarray *) array, (java_objectheader *) val))
2550 *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
2553 array->data[index] = val;
2559 jbooleanArray NewBooleanArray(JNIEnv *env, jsize len)
2561 java_booleanarray *j;
2564 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2568 j = builtin_newarray_boolean(len);
2574 jbyteArray NewByteArray(JNIEnv *env, jsize len)
2579 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2583 j = builtin_newarray_byte(len);
2589 jcharArray NewCharArray(JNIEnv *env, jsize len)
2594 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2598 j = builtin_newarray_char(len);
2604 jshortArray NewShortArray(JNIEnv *env, jsize len)
2609 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2613 j = builtin_newarray_short(len);
2619 jintArray NewIntArray(JNIEnv *env, jsize len)
2624 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2628 j = builtin_newarray_int(len);
2634 jlongArray NewLongArray(JNIEnv *env, jsize len)
2639 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2643 j = builtin_newarray_long(len);
2649 jfloatArray NewFloatArray(JNIEnv *env, jsize len)
2654 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2658 j = builtin_newarray_float(len);
2664 jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
2666 java_doublearray *j;
2669 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2673 j = builtin_newarray_double(len);
2679 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2681 if (isCopy) *isCopy = JNI_FALSE;
2686 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2688 if (isCopy) *isCopy = JNI_FALSE;
2693 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
2695 if (isCopy) *isCopy = JNI_FALSE;
2700 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
2702 if (isCopy) *isCopy = JNI_FALSE;
2707 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
2709 if (isCopy) *isCopy = JNI_FALSE;
2714 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
2716 if (isCopy) *isCopy = JNI_FALSE;
2721 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
2723 if (isCopy) *isCopy = JNI_FALSE;
2728 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
2730 if (isCopy) *isCopy = JNI_FALSE;
2736 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
2742 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
2748 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
2754 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
2760 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
2766 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
2772 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
2778 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
2784 void GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2786 if (start < 0 || len < 0 || start + len > array->header.size)
2787 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2790 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2794 void GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2796 if (start < 0 || len < 0 || start + len > array->header.size)
2797 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2800 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2804 void GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2806 if (start < 0 || len < 0 || start + len > array->header.size)
2807 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2810 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2814 void GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2816 if (start < 0 || len < 0 || start + len > array->header.size)
2817 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2820 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2824 void GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2826 if (start < 0 || len < 0 || start + len > array->header.size)
2827 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2830 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2834 void GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2836 if (start < 0 || len < 0 || start + len > array->header.size)
2837 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2840 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2844 void GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2846 if (start < 0 || len < 0 || start + len > array->header.size)
2847 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2850 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2854 void GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2856 if (start < 0 || len < 0 || start+len>array->header.size)
2857 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2860 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
2864 void SetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2866 if (start < 0 || len < 0 || start + len > array->header.size)
2867 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2870 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2874 void SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2876 if (start < 0 || len < 0 || start + len > array->header.size)
2877 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2880 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2884 void SetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2886 if (start < 0 || len < 0 || start + len > array->header.size)
2887 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2890 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2895 void SetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2897 if (start < 0 || len < 0 || start + len > array->header.size)
2898 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2901 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2905 void SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2907 if (start < 0 || len < 0 || start + len > array->header.size)
2908 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2911 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2916 void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2918 if (start < 0 || len < 0 || start + len > array->header.size)
2919 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2922 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2927 void SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2929 if (start < 0 || len < 0 || start + len > array->header.size)
2930 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2933 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2938 void SetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2940 if (start < 0 || len < 0 || start + len > array->header.size)
2941 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2944 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
2948 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
2950 log_text("JNI-Call: RegisterNatives");
2955 jint UnregisterNatives (JNIEnv* env, jclass clazz)
2957 log_text("JNI-Call: UnregisterNatives");
2961 /******************************* monitor operations ********************************/
2963 jint MonitorEnter (JNIEnv* env, jobject obj)
2965 builtin_monitorenter(obj);
2970 jint MonitorExit (JNIEnv* env, jobject obj)
2972 builtin_monitorexit(obj);
2977 /************************************* JavaVM interface ****************************/
2979 #error CPP mode not supported yet
2981 jint GetJavaVM (JNIEnv* env, JavaVM **vm)
2983 log_text("JNI-Call: GetJavaVM");
2987 #endif /*__cplusplus*/
2989 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
2991 log_text("JNI-Call: GetStringRegion");
2995 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
2997 log_text("JNI-Call: GetStringUTFRegion");
3001 /************** obtain direct pointer to array elements ***********************/
3003 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
3005 java_objectheader *s = (java_objectheader*) array;
3006 arraydescriptor *desc = s->vftbl->arraydesc;
3008 if (!desc) return NULL;
3010 return ((u1*)s) + desc->dataoffset;
3014 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
3016 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
3021 /**** returns a pointer to an array of Unicode characters of the string *******/
3023 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
3025 log_text("JNI-Call: GetStringCritical");
3027 return GetStringChars(env,string,isCopy);
3030 /*********** native code no longer needs access to chars **********************/
3032 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
3034 log_text("JNI-Call: ReleaseStringCritical");
3036 ReleaseStringChars(env,string,cstring);
3040 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
3042 log_text("JNI-Call: NewWeakGlobalRef");
3048 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
3050 log_text("JNI-Call: DeleteWeakGlobalRef");
3056 /******************************* check for pending exception ***********************/
3059 jboolean ExceptionCheck(JNIEnv* env)
3061 log_text("JNI-Call: ExceptionCheck");
3063 return *exceptionptr ? JNI_TRUE : JNI_FALSE;
3071 jint DestroyJavaVM(JavaVM *vm)
3073 log_text("DestroyJavaVM called");
3079 jint AttachCurrentThread(JavaVM *vm, void **par1, void *par2)
3081 log_text("AttachCurrentThread called");
3087 jint DetachCurrentThread(JavaVM *vm)
3089 log_text("DetachCurrentThread called");
3095 jint GetEnv(JavaVM *vm, void **environment, jint jniversion)
3097 *environment = &env;
3103 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
3105 log_text("AttachCurrentThreadAsDaemon called");
3111 /********************************* JNI invocation table ******************************/
3113 struct _JavaVM javaVMTable={
3118 &AttachCurrentThread,
3119 &DetachCurrentThread,
3121 &AttachCurrentThreadAsDaemon
3124 JavaVM javaVM = &javaVMTable;
3127 /********************************* JNI function table ******************************/
3129 struct JNI_Table envTable = {
3137 &FromReflectedMethod,
3138 &FromReflectedField,
3156 &EnsureLocalCapacity,
3168 &CallBooleanMethodV,
3169 &CallBooleanMethodA,
3194 &CallNonvirtualObjectMethod,
3195 &CallNonvirtualObjectMethodV,
3196 &CallNonvirtualObjectMethodA,
3197 &CallNonvirtualBooleanMethod,
3198 &CallNonvirtualBooleanMethodV,
3199 &CallNonvirtualBooleanMethodA,
3200 &CallNonvirtualByteMethod,
3201 &CallNonvirtualByteMethodV,
3202 &CallNonvirtualByteMethodA,
3203 &CallNonvirtualCharMethod,
3204 &CallNonvirtualCharMethodV,
3205 &CallNonvirtualCharMethodA,
3206 &CallNonvirtualShortMethod,
3207 &CallNonvirtualShortMethodV,
3208 &CallNonvirtualShortMethodA,
3209 &CallNonvirtualIntMethod,
3210 &CallNonvirtualIntMethodV,
3211 &CallNonvirtualIntMethodA,
3212 &CallNonvirtualLongMethod,
3213 &CallNonvirtualLongMethodV,
3214 &CallNonvirtualLongMethodA,
3215 &CallNonvirtualFloatMethod,
3216 &CallNonvirtualFloatMethodV,
3217 &CallNonvirtualFloatMethodA,
3218 &CallNonvirtualDoubleMethod,
3219 &CallNonvirtualDoubleMethodV,
3220 &CallNonvirtualDoubleMethodA,
3221 &CallNonvirtualVoidMethod,
3222 &CallNonvirtualVoidMethodV,
3223 &CallNonvirtualVoidMethodA,
3244 &CallStaticObjectMethod,
3245 &CallStaticObjectMethodV,
3246 &CallStaticObjectMethodA,
3247 &CallStaticBooleanMethod,
3248 &CallStaticBooleanMethodV,
3249 &CallStaticBooleanMethodA,
3250 &CallStaticByteMethod,
3251 &CallStaticByteMethodV,
3252 &CallStaticByteMethodA,
3253 &CallStaticCharMethod,
3254 &CallStaticCharMethodV,
3255 &CallStaticCharMethodA,
3256 &CallStaticShortMethod,
3257 &CallStaticShortMethodV,
3258 &CallStaticShortMethodA,
3259 &CallStaticIntMethod,
3260 &CallStaticIntMethodV,
3261 &CallStaticIntMethodA,
3262 &CallStaticLongMethod,
3263 &CallStaticLongMethodV,
3264 &CallStaticLongMethodA,
3265 &CallStaticFloatMethod,
3266 &CallStaticFloatMethodV,
3267 &CallStaticFloatMethodA,
3268 &CallStaticDoubleMethod,
3269 &CallStaticDoubleMethodV,
3270 &CallStaticDoubleMethodA,
3271 &CallStaticVoidMethod,
3272 &CallStaticVoidMethodV,
3273 &CallStaticVoidMethodA,
3275 &GetStaticObjectField,
3276 &GetStaticBooleanField,
3277 &GetStaticByteField,
3278 &GetStaticCharField,
3279 &GetStaticShortField,
3281 &GetStaticLongField,
3282 &GetStaticFloatField,
3283 &GetStaticDoubleField,
3284 &SetStaticObjectField,
3285 &SetStaticBooleanField,
3286 &SetStaticByteField,
3287 &SetStaticCharField,
3288 &SetStaticShortField,
3290 &SetStaticLongField,
3291 &SetStaticFloatField,
3292 &SetStaticDoubleField,
3296 &ReleaseStringChars,
3298 &GetStringUTFLength,
3300 &ReleaseStringUTFChars,
3303 &GetObjectArrayElement,
3304 &SetObjectArrayElement,
3313 &GetBooleanArrayElements,
3314 &GetByteArrayElements,
3315 &GetCharArrayElements,
3316 &GetShortArrayElements,
3317 &GetIntArrayElements,
3318 &GetLongArrayElements,
3319 &GetFloatArrayElements,
3320 &GetDoubleArrayElements,
3321 &ReleaseBooleanArrayElements,
3322 &ReleaseByteArrayElements,
3323 &ReleaseCharArrayElements,
3324 &ReleaseShortArrayElements,
3325 &ReleaseIntArrayElements,
3326 &ReleaseLongArrayElements,
3327 &ReleaseFloatArrayElements,
3328 &ReleaseDoubleArrayElements,
3329 &GetBooleanArrayRegion,
3330 &GetByteArrayRegion,
3331 &GetCharArrayRegion,
3332 &GetShortArrayRegion,
3334 &GetLongArrayRegion,
3335 &GetFloatArrayRegion,
3336 &GetDoubleArrayRegion,
3337 &SetBooleanArrayRegion,
3338 &SetByteArrayRegion,
3339 &SetCharArrayRegion,
3340 &SetShortArrayRegion,
3342 &SetLongArrayRegion,
3343 &SetFloatArrayRegion,
3344 &SetDoubleArrayRegion,
3351 &GetStringUTFRegion,
3352 &GetPrimitiveArrayCritical,
3353 &ReleasePrimitiveArrayCritical,
3355 &ReleaseStringCritical,
3357 &DeleteWeakGlobalRef,
3361 JNIEnv env = &envTable;
3364 jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID, jobject obj, java_objectarray *params)
3371 if (methodID == 0) {
3372 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
3376 argcount = get_parametercount(methodID);
3378 if (obj && (!builtin_instanceof((java_objectheader *) obj, methodID->class))) {
3379 *exceptionptr = new_exception_message(string_java_lang_IllegalArgumentException,
3380 "Object parameter of wrong type in Java_java_lang_reflect_Method_invokeNative");
3387 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
3388 log_text("Too many arguments. invokeNativeHelper does not support that");
3392 if (((!params) && (argcount != 0)) || (params && (params->header.size != argcount))) {
3393 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
3398 if (!(methodID->flags & ACC_STATIC) && (!obj)) {
3399 *exceptionptr = new_exception_message(string_java_lang_NullPointerException,
3400 "Static mismatch in Java_java_lang_reflect_Method_invokeNative");
3404 if ((methodID->flags & ACC_STATIC) && (obj)) obj = 0;
3406 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
3408 retT = fill_callblock_objA(obj, methodID->descriptor, blk, params);
3412 (void) asm_calljavafunction2(methodID,
3414 (argcount + 1) * sizeof(jni_callblock),
3416 retVal = NULL; /*native_new_and_init(loader_load(utf_new_char("java/lang/Void")));*/
3421 intVal = (s4) asm_calljavafunction2(methodID,
3423 (argcount + 1) * sizeof(jni_callblock),
3425 retVal = builtin_new(class_new(utf_new_char("java/lang/Integer")));
3428 class_resolvemethod(retVal->vftbl->class,
3429 utf_new_char("<init>"),
3430 utf_new_char("(I)V")),
3437 intVal = (s4) asm_calljavafunction2(methodID,
3439 (argcount + 1) * sizeof(jni_callblock),
3441 retVal = builtin_new(class_new(utf_new_char("java/lang/Byte")));
3444 class_resolvemethod(retVal->vftbl->class,
3445 utf_new_char("<init>"),
3446 utf_new_char("(B)V")),
3453 intVal = (s4) asm_calljavafunction2(methodID,
3455 (argcount + 1) * sizeof(jni_callblock),
3457 retVal = builtin_new(class_new(utf_new_char("java/lang/Character")));
3460 class_resolvemethod(retVal->vftbl->class,
3461 utf_new_char("<init>"),
3462 utf_new_char("(C)V")),
3469 intVal = (s4) asm_calljavafunction2(methodID,
3471 (argcount + 1) * sizeof(jni_callblock),
3473 retVal = builtin_new(class_new(utf_new_char("java/lang/Short")));
3476 class_resolvemethod(retVal->vftbl->class,
3477 utf_new_char("<init>"),
3478 utf_new_char("(S)V")),
3485 intVal = (s4) asm_calljavafunction2(methodID,
3487 (argcount + 1) * sizeof(jni_callblock),
3489 retVal = builtin_new(class_new(utf_new_char("java/lang/Boolean")));
3492 class_resolvemethod(retVal->vftbl->class,
3493 utf_new_char("<init>"),
3494 utf_new_char("(Z)V")),
3501 intVal = asm_calljavafunction2long(methodID,
3503 (argcount + 1) * sizeof(jni_callblock),
3505 retVal = builtin_new(class_new(utf_new_char("java/lang/Long")));
3508 class_resolvemethod(retVal->vftbl->class,
3509 utf_new_char("<init>"),
3510 utf_new_char("(J)V")),
3517 floatVal = asm_calljavafunction2double(methodID,
3519 (argcount + 1) * sizeof(jni_callblock),
3521 retVal = builtin_new(class_new(utf_new_char("java/lang/Float")));
3524 class_resolvemethod(retVal->vftbl->class,
3525 utf_new_char("<init>"),
3526 utf_new_char("(F)V")),
3533 floatVal = asm_calljavafunction2double(methodID,
3535 (argcount + 1) * sizeof(jni_callblock),
3537 retVal = builtin_new(class_new(utf_new_char("java/lang/Double")));
3540 class_resolvemethod(retVal->vftbl->class,
3541 utf_new_char("<init>"),
3542 utf_new_char("(D)V")),
3547 case 'L': /* fall through */
3549 retVal = asm_calljavafunction2(methodID,
3551 (argcount + 1) * sizeof(jni_callblock),
3556 /* if this happens the acception has already been set by fill_callblock_objA*/
3557 MFREE(blk, jni_callblock, 4 /*argcount+2*/);
3558 return (jobject *) 0;
3561 MFREE(blk, jni_callblock, 4 /*argcount+2*/);
3563 if (*exceptionptr) {
3564 java_objectheader *exceptionToWrap = *exceptionptr;
3566 java_objectheader *ivte;
3568 *exceptionptr = NULL;
3569 ivtec = class_new(utf_new_char("java/lang/reflect/InvocationTargetException"));
3570 ivte = builtin_new(ivtec);
3571 asm_calljavafunction(class_resolvemethod(ivtec,
3572 utf_new_char("<init>"),
3573 utf_new_char("(Ljava/lang/Throwable;)V")),
3579 if (*exceptionptr != NULL)
3580 panic("jni.c: error while creating InvocationTargetException wrapper");
3582 *exceptionptr = ivte;
3585 return (jobject *) retVal;
3590 * These are local overrides for various environment variables in Emacs.
3591 * Please do not remove this and leave it at the end of the file, where
3592 * Emacs will automagically detect them.
3593 * ---------------------------------------------------------------------
3596 * indent-tabs-mode: t