1 /********************************** jni.c *****************************************
3 implementation of the Java Native Interface functions
4 which are used in the JNI function table
6 ***********************************************************************************/
14 #include "threads/thread.h"
15 #include "nat/java_lang_Byte.h"
16 #include "nat/java_lang_Character.h"
17 #include "nat/java_lang_Short.h"
18 #include "nat/java_lang_Integer.h"
19 #include "nat/java_lang_Boolean.h"
20 #include "nat/java_lang_Long.h"
21 #include "nat/java_lang_Float.h"
22 #include "nat/java_lang_Double.h"
23 #include "nat/java_lang_Throwable.h"
26 #define JNI_VERSION 0x00010002
29 static utf* utf_char=0;
30 static utf* utf_bool=0;
31 static utf* utf_byte=0;
32 static utf* utf_short=0;
33 static utf* utf_int=0;
34 static utf* utf_long=0;
35 static utf* utf_float=0;
36 static utf* utf_double=0;
38 /********************* accessing instance-fields **********************************/
40 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
41 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
42 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
46 u4 get_parametercount(methodinfo *m)
48 utf *descr = m->descriptor; /* method-descriptor */
49 char *utf_ptr = descr->text; /* current position in utf-text */
50 char *desc_end = utf_end(descr); /* points behind utf string */
51 java_objectarray* result;
52 int parametercount = 0;
58 /* determine number of parameters */
59 while ( *utf_ptr != ')' ) {
60 get_type(&utf_ptr,desc_end,true);
64 return parametercount;
69 void fill_callblock(void *obj,utf *descr,jni_callblock blk[], va_list data, char ret) {
70 char *utf__ptr = descr->text; /* current position in utf-text */
71 char **utf_ptr = &utf__ptr;
72 char *desc_end = utf_end(descr); /* points behind utf string */
81 log_text("fill_callblock");
88 /* determine number of parameters */
90 blk[0].itemtype=TYPE_ADR;
91 blk[0].item=(u8)(u4)obj;
94 while ( **utf_ptr != ')' ) {
95 if (*utf_ptr>=desc_end)
96 panic("illegal method descriptor");
98 switch (utf_nextu2(utf_ptr)) {
104 blk[cnt].itemtype=TYPE_INT;
105 blk[cnt].item=(u8) va_arg(data,int);
108 blk[cnt].itemtype=TYPE_INT;
109 dummy=va_arg(data,u4);
110 /*printf("fill_callblock: pos:%d, value:%d\n",cnt,dummy);*/
111 blk[cnt].item=(u8)dummy;
116 blk[cnt].itemtype=TYPE_LNG;
117 blk[cnt].item=(u8)va_arg(data,jlong);
120 blk[cnt].itemtype=TYPE_FLT;
121 *((jfloat*)(&blk[cnt].item))=((jfloat)va_arg(data,jdouble));
125 blk[cnt].itemtype=TYPE_DBL;
126 *((jdouble*)(&blk[cnt].item))=(jdouble)va_arg(data,jdouble);
128 case 'V' : panic ("V not allowed as function parameter");
131 while (utf_nextu2(utf_ptr)!=';')
133 blk[cnt].itemtype=TYPE_ADR;
134 blk[cnt].item=(u8)(u4)va_arg(data,void*);
140 char *start = *utf_ptr;
142 while ((ch = utf_nextu2(utf_ptr))=='[')
144 while (utf_nextu2(utf_ptr)!=';') {}
147 ch=utf_nextu2(utf_ptr);
148 blk[cnt].itemtype=TYPE_ADR;
149 blk[cnt].item=(u8)(u4)va_arg(data,void*);
156 /*the standard doesn't say anything about return value checking, but it appears to be usefull*/
157 c=utf_nextu2(utf_ptr);
158 c=utf_nextu2(utf_ptr);
159 /*printf("%c %c\n",ret,c);*/
161 if (!((c=='L') || (c=='['))) log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
162 } else if (ret != c) log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
166 /* XXX it could be considered if we should do typechecking here in the future */
167 char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_objectarray* params)
169 char *utf__ptr = descr->text; /* current position in utf-text */
170 char **utf_ptr = &utf__ptr;
171 char *desc_end = utf_end(descr); /* points behind utf string */
182 utf_char=utf_new_char("java/lang/Character");
183 utf_bool=utf_new_char("java/lang/Boolean");
184 utf_byte=utf_new_char("java/lang/Byte");
185 utf_short=utf_new_char("java/lang/Short");
186 utf_int=utf_new_char("java/lang/Integer");
187 utf_long=utf_new_char("java/lang/Long");
188 utf_float=utf_new_char("java/lang/Float");
189 utf_double=utf_new_char("java/lang/Double");
194 log_text("fill_callblock");
201 /* determine number of parameters */
203 blk[0].itemtype = TYPE_ADR;
204 blk[0].item = (u8)(u4)obj;
212 while (**utf_ptr != ')') {
213 if (*utf_ptr >= desc_end)
214 panic("illegal method descriptor");
216 /* primitive types */
217 switch (utf_nextu2(utf_ptr)) {
219 param=params->data[cnts];
220 if (param->vftbl->class->name==utf_byte) {
221 blk[cnt].itemtype=TYPE_INT;
222 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
224 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
229 param=params->data[cnts];
230 if (param->vftbl->class->name==utf_char) {
231 blk[cnt].itemtype=TYPE_INT;
232 blk[cnt].item = (u8) ((struct java_lang_Character * )param)->value;
234 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
240 param=params->data[cnts];
241 if (param->vftbl->class->name==utf_short) {
242 blk[cnt].itemtype=TYPE_INT;
243 blk[cnt].item = (u8) ((struct java_lang_Short* )param)->value;
245 if (param->vftbl->class->name==utf_byte) {
246 blk[cnt].itemtype=TYPE_INT;
247 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
249 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
256 param=params->data[cnts];
257 if (param->vftbl->class->name==utf_bool) {
258 blk[cnt].itemtype=TYPE_INT;
259 blk[cnt].item = (u8) ((struct java_lang_Boolean * )param)->value;
261 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
267 log_text("fill_callblock_objA: param 'I'");
268 param=params->data[cnts];
269 if (param->vftbl->class->name==utf_int) {
270 blk[cnt].itemtype=TYPE_INT;
271 blk[cnt].item = (u8) ((struct java_lang_Integer * )param)->value;
272 /*printf("INT VALUE :%d\n",((struct java_lang_Integer * )param)->value);*/
274 if (param->vftbl->class->name==utf_short) {
275 blk[cnt].itemtype=TYPE_INT;
276 blk[cnt].item = (u8) ((struct java_lang_Short* )param)->value;
278 if (param->vftbl->class->name==utf_byte) {
279 blk[cnt].itemtype=TYPE_INT;
280 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
283 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
290 param=params->data[cnts];
291 if (param->vftbl->class->name==utf_long) {
292 blk[cnt].itemtype=TYPE_LNG;
293 blk[cnt].item = (u8) ((struct java_lang_Long * )param)->value;
295 if (param->vftbl->class->name==utf_int) {
296 blk[cnt].itemtype=TYPE_LNG;
297 blk[cnt].item = (u8) ((struct java_lang_Integer * )param)->value;
299 if (param->vftbl->class->name==utf_short) {
300 blk[cnt].itemtype=TYPE_LNG;
301 blk[cnt].item = (u8) ((struct java_lang_Short* )param)->value;
303 if (param->vftbl->class->name==utf_byte) {
304 blk[cnt].itemtype=TYPE_LNG;
305 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
307 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
317 param=params->data[cnts];
318 if (param->vftbl->class->name==utf_float) {
319 blk[cnt].itemtype=TYPE_FLT;
320 *((jfloat*)(&blk[cnt].item))=(jfloat) ((struct java_lang_Float*)param)->value;
322 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
327 param=params->data[cnts];
328 if (param->vftbl->class->name==utf_double) {
329 blk[cnt].itemtype=TYPE_DBL;
330 *((jdouble*)(&blk[cnt].item))=(jdouble) ((struct java_lang_Float*)param)->value;
332 if (param->vftbl->class->name==utf_float) {
333 blk[cnt].itemtype=TYPE_DBL;
334 *((jdouble*)(&blk[cnt].item))=(jdouble) ((struct java_lang_Float*)param)->value;
336 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
342 panic("V not allowed as function parameter");
346 char *start=(*utf_ptr)-1;
349 while (utf_nextu2(utf_ptr) != ';')
351 if (!builtin_instanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD))) {
352 if (params->data[cnts]!=0) {
353 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
357 blk[cnt].itemtype = TYPE_ADR;
358 blk[cnt].item= (u8)(u4) (params->data[cnts]);
364 char *start=(*utf_ptr)-1;
368 while ((ch = utf_nextu2(utf_ptr)) == '[')
370 while (utf_nextu2(utf_ptr) != ';') {}
373 ch = utf_nextu2(utf_ptr);
374 if (!builtin_arrayinstanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD))) {
375 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
380 blk[cnt].itemtype = TYPE_ADR;
381 blk[cnt].item = (u8)(u4) (params->data[cnts]);
389 c = utf_nextu2(utf_ptr);
390 c = utf_nextu2(utf_ptr);
391 return c; /*return type needed usage of the right lowlevel methods*/
408 jmethodID get_virtual(jobject obj,jmethodID methodID) {
409 if (obj->vftbl->class==methodID->class) return methodID;
410 return class_resolvemethod (obj->vftbl->class, methodID->name, methodID->descriptor);
413 jmethodID get_nonvirtual(jclass clazz,jmethodID methodID) {
414 if (clazz==methodID->class) return methodID;
415 return class_resolvemethod (clazz, methodID->name, methodID->descriptor);
420 jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
427 log_text("JNI-Call: CallObjectMethodV");
428 utf_display(methodID->name);
429 utf_display(methodID->descriptor);
430 printf("\nParmaeter count: %d\n",argcount);
431 utf_display(obj->vftbl->class->name);
436 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
439 argcount=get_parametercount(methodID);
441 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
442 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
443 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
447 if (obj && (! builtin_instanceof(obj,methodID->class))) {
448 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
453 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
454 log_text("Too many arguments. CallObjectMethod does not support that");
458 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
460 fill_callblock(obj,methodID->descriptor,blk,args,'O');
462 /* printf("parameter: obj: %p",blk[0].item); */
463 ret=asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
464 MFREE(blk,jni_callblock,argcount+1);
465 /* printf("(CallObjectMethodV)-->%p\n",ret); */
471 core function for integer class methods (bool, byte, short, integer)
472 This is basically needed for i386
474 jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list args)
480 /* printf("%p, %c\n",retType,methodID,retType);*/
483 log_text("JNI-Call: CallObjectMethodV");
484 utf_display(methodID->name);
485 utf_display(methodID->descriptor);
486 printf("\nParmaeter count: %d\n",argcount);
487 utf_display(obj->vftbl->class->name);
491 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
495 argcount = get_parametercount(methodID);
497 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
498 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
499 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
503 if (obj && (! builtin_instanceof(obj,methodID->class))) {
504 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
510 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
511 log_text("Too many arguments. CallObjectMethod does not support that");
515 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
517 fill_callblock(obj, methodID->descriptor, blk, args, retType);
519 /* printf("parameter: obj: %p",blk[0].item); */
520 ret = (jint) asm_calljavafunction2(methodID,
522 (argcount + 1) * sizeof(jni_callblock),
525 MFREE(blk, jni_callblock, argcount + 1);
526 /* printf("(CallObjectMethodV)-->%p\n",ret); */
532 /*core function for long class functions*/
533 jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
540 log_text("JNI-Call: CallObjectMethodV");
541 utf_display(methodID->name);
542 utf_display(methodID->descriptor);
543 printf("\nParmaeter count: %d\n",argcount);
544 utf_display(obj->vftbl->class->name);
548 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
551 argcount=get_parametercount(methodID);
553 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
554 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
555 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
559 if (obj && (! builtin_instanceof(obj,methodID->class))) {
560 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
566 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
567 log_text("Too many arguments. CallObjectMethod does not support that");
571 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
573 fill_callblock(obj,methodID->descriptor,blk,args,'L');
575 /* printf("parameter: obj: %p",blk[0].item); */
576 ret=asm_calljavafunction2long(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
577 MFREE(blk,jni_callblock,argcount+1);
578 /* printf("(CallObjectMethodV)-->%p\n",ret); */
584 /*core function for float class methods (float,double)*/
585 jdouble callFloatMethod (jobject obj, jmethodID methodID, va_list args,char retType)
587 int argcount=get_parametercount(methodID);
592 log_text("JNI-Call: CallObjectMethodV");
593 utf_display(methodID->name);
594 utf_display(methodID->descriptor);
595 printf("\nParmaeter count: %d\n",argcount);
596 utf_display(obj->vftbl->class->name);
600 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
601 log_text("Too many arguments. CallObjectMethod does not support that");
605 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
607 fill_callblock(obj,methodID->descriptor,blk,args,retType);
609 /* printf("parameter: obj: %p",blk[0].item); */
610 ret=asm_calljavafunction2double(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
611 MFREE(blk,jni_callblock,argcount+1);
612 /* printf("(CallObjectMethodV)-->%p\n",ret); */
618 /*************************** function: jclass_findfield ****************************
620 searches for field with specified name and type in a 'classinfo'-structur
621 if no such field is found NULL is returned
623 ************************************************************************************/
625 fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
628 /* printf(" FieldCount: %d\n",c->fieldscount);
629 utf_display(c->name); */
630 for (i = 0; i < c->fieldscount; i++) {
631 /* utf_display(c->fields[i].name);
633 utf_display(c->fields[i].descriptor);
635 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
636 return &(c->fields[i]);
639 if (c->super) return jclass_findfield(c->super,name,desc);
644 /********************* returns version of native method interface *****************/
646 jint GetVersion (JNIEnv* env)
651 /****************** loads a class from a buffer of raw class data *****************/
653 jclass DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len)
657 /* change suck-mode, so subsequent class_load will read from memory-buffer */
658 classload_buffer( (u1*) buf,len);
660 clazz = loader_load(utf_new_char ((char *) name));
662 /* restore old suck-mode */
663 classload_buffer(NULL,0);
669 /*************** loads locally defined class with the specified name **************/
671 jclass FindClass (JNIEnv* env, const char *name)
675 /* if (strcmp(name,"[B")==0) {
676 c = loader_load(utf_new_char("The_Array_Class"));
679 c = loader_load(utf_new_char_classname ((char *) name));
681 if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
687 /***********************************************************************************
689 converts java.lang.reflect.Method or
690 java.lang.reflect.Constructor object to a method ID
692 **********************************************************************************/
694 jmethodID FromReflectedMethod(JNIEnv* env, jobject method)
696 /* log_text("JNI-Call: FromReflectedMethod"); */
702 /*************** return superclass of the class represented by sub ****************/
704 jclass GetSuperclass(JNIEnv* env, jclass sub)
708 c = ((classinfo*) sub)->super;
712 use_class_as_object(c);
718 /*********************** check whether sub can be cast to sup ********************/
720 jboolean IsAssignableForm(JNIEnv* env, jclass sub, jclass sup)
722 return builtin_isanysubclass(sub, sup);
726 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
728 jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
730 /* log_text("JNI-Call: ToReflectedField"); */
736 /***************** throw java.lang.Throwable object ******************************/
738 jint Throw(JNIEnv* env, jthrowable obj)
740 exceptionptr = (java_objectheader*) obj;
746 /***********************************************************************************
748 create exception object from the class clazz with the
749 specified message and cause it to be thrown
751 **********************************************************************************/
754 jint ThrowNew (JNIEnv* env, jclass clazz, const char *msg)
756 java_lang_Throwable *o;
758 /* instantiate exception object */
759 o = (java_lang_Throwable *) native_new_and_init ((classinfo*) clazz);
763 o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
765 exceptionptr = (java_objectheader*) o;
769 /************************* check if exception occured *****************************/
771 jthrowable ExceptionOccurred (JNIEnv* env)
773 return (jthrowable) exceptionptr;
776 /********** print exception and a backtrace of the stack (for debugging) **********/
778 void ExceptionDescribe (JNIEnv* env)
780 utf_display(exceptionptr->vftbl->class->name);
786 /******************* clear any exception currently being thrown *******************/
788 void ExceptionClear (JNIEnv* env)
794 /********** raises a fatal error and does not expect the VM to recover ************/
796 void FatalError (JNIEnv* env, const char *msg)
801 /******************* creates a new local reference frame **************************/
803 jint PushLocalFrame(JNIEnv* env, jint capacity)
810 /**************** Pops off the current local reference frame **********************/
812 jobject PopLocalFrame(JNIEnv* env, jobject result)
820 /** Creates a new global reference to the object referred to by the obj argument **/
822 jobject NewGlobalRef(JNIEnv* env, jobject lobj)
824 heap_addreference((void**) &lobj);
829 /************* Deletes the global reference pointed to by globalRef **************/
831 void DeleteGlobalRef (JNIEnv* env, jobject gref)
837 /*************** Deletes the local reference pointed to by localRef ***************/
839 void DeleteLocalRef (JNIEnv* env, jobject localRef)
844 /********** Tests whether two references refer to the same Java object ************/
846 jboolean IsSameObject (JNIEnv* env, jobject obj1, jobject obj2)
851 /***** Creates a new local reference that refers to the same object as ref *******/
853 jobject NewLocalRef (JNIEnv* env, jobject ref)
858 /***********************************************************************************
860 Ensures that at least a given number of local references can
861 be created in the current thread
863 **********************************************************************************/
865 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
867 return 0; /* return 0 on success */
871 /********* Allocates a new Java object without invoking a constructor *************/
873 jobject AllocObject (JNIEnv* env, jclass clazz)
875 java_objectheader *o = builtin_new(clazz);
880 /***********************************************************************************
882 Constructs a new Java object
883 arguments that are to be passed to the constructor are placed after methodID
885 ***********************************************************************************/
887 jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
889 java_objectheader *o;
891 int argcount=get_parametercount(methodID);
895 /* log_text("JNI-Call: NewObject"); */
898 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
899 log_text("Too many arguments. NewObject does not support that");
904 o = builtin_new (clazz); /* create object */
908 va_start(vaargs,methodID);
909 for (i=0;i<argcount;i++) {
910 args[i]=va_arg(vaargs,void*);
913 exceptionptr=asm_calljavamethod(methodID,o,args[0],args[1],args[2]);
919 /***********************************************************************************
921 Constructs a new Java object
922 arguments that are to be passed to the constructor are placed in va_list args
924 ***********************************************************************************/
926 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
928 /* log_text("JNI-Call: NewObjectV"); */
934 /***********************************************************************************
936 Constructs a new Java object
937 arguments that are to be passed to the constructor are placed in
938 args array of jvalues
940 ***********************************************************************************/
942 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
944 /* log_text("JNI-Call: NewObjectA"); */
950 /************************ returns the class of an object **************************/
952 jclass GetObjectClass(JNIEnv* env, jobject obj)
954 classinfo *c = obj->vftbl->class;
955 use_class_as_object(c);
961 /************* tests whether an object is an instance of a class ******************/
963 jboolean IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz)
965 return builtin_instanceof(obj,clazz);
969 /***************** converts a java.lang.reflect.Field to a field ID ***************/
971 jfieldID FromReflectedField(JNIEnv* env, jobject field)
973 log_text("JNI-Call: FromReflectedField");
979 /**********************************************************************************
981 converts a method ID to a java.lang.reflect.Method or
982 java.lang.reflect.Constructor object
984 **********************************************************************************/
986 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
988 log_text("JNI-Call: ToReflectedMethod");
994 /**************** returns the method ID for an instance method ********************/
996 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
1000 m = class_resolvemethod (
1002 utf_new_char ((char*) name),
1003 utf_new_char ((char*) sig)
1006 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1012 /******************** JNI-functions for calling instance methods ******************/
1014 jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1019 /* log_text("JNI-Call: CallObjectMethod");*/
1021 va_start(vaargs, methodID);
1022 ret = callObjectMethod(obj, methodID, vaargs);
1029 jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1031 return callObjectMethod(obj,methodID,args);
1035 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1037 log_text("JNI-Call: CallObjectMethodA");
1045 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1050 /* log_text("JNI-Call: CallBooleanMethod");*/
1052 va_start(vaargs,methodID);
1053 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',vaargs);
1059 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1061 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',args);
1065 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1067 log_text("JNI-Call: CallBooleanMethodA");
1072 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1077 /* log_text("JNI-Call: CallVyteMethod");*/
1079 va_start(vaargs,methodID);
1080 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'B',vaargs);
1086 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1088 /* log_text("JNI-Call: CallByteMethodV");*/
1089 return callIntegerMethod(obj,methodID,'B',args);
1093 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1095 log_text("JNI-Call: CallByteMethodA");
1101 jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1106 /* log_text("JNI-Call: CallCharMethod");*/
1108 va_start(vaargs,methodID);
1109 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'C', vaargs);
1116 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1118 /* log_text("JNI-Call: CallCharMethodV");*/
1119 return callIntegerMethod(obj,get_virtual(obj,methodID),'C',args);
1123 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1125 log_text("JNI-Call: CallCharMethodA");
1131 jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1136 /* log_text("JNI-Call: CallShortMethod");*/
1138 va_start(vaargs, methodID);
1139 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'S', vaargs);
1146 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1148 return callIntegerMethod(obj, get_virtual(obj, methodID), 'S', args);
1152 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1154 log_text("JNI-Call: CallShortMethodA");
1161 jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1166 va_start(vaargs,methodID);
1167 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'I', vaargs);
1174 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1176 return callIntegerMethod(obj, get_virtual(obj, methodID), 'I', args);
1180 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1182 log_text("JNI-Call: CallIntMethodA");
1189 jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1191 log_text("JNI-Call: CallLongMethod");
1197 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1199 log_text("JNI-Call: CallLongMethodV");
1205 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1207 log_text("JNI-Call: CallLongMethodA");
1214 jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1219 /* log_text("JNI-Call: CallFloatMethod");*/
1221 va_start(vaargs,methodID);
1222 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'F');
1229 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1231 log_text("JNI-Call: CallFloatMethodV");
1232 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'F');
1236 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1238 log_text("JNI-Call: CallFloatMethodA");
1245 jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1250 /* log_text("JNI-Call: CallDoubleMethod");*/
1252 va_start(vaargs,methodID);
1253 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'D');
1260 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1262 log_text("JNI-Call: CallDoubleMethodV");
1263 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'D');
1267 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1269 log_text("JNI-Call: CallDoubleMethodA");
1275 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1279 /* log_text("JNI-Call: CallVoidMethod");*/
1281 va_start(vaargs,methodID);
1282 (void) callIntegerMethod(obj, get_virtual(obj, methodID), 'V', vaargs);
1287 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1289 log_text("JNI-Call: CallVoidMethodV");
1290 (void)callIntegerMethod(obj,get_virtual(obj,methodID),'V',args);
1294 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1296 log_text("JNI-Call: CallVoidMethodA");
1301 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1303 log_text("JNI-Call: CallNonvirtualObjectMethod");
1309 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1311 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1317 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1319 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1326 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1331 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1333 va_start(vaargs,methodID);
1334 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',vaargs);
1341 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1343 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1344 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',args);
1348 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1350 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1357 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1362 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1364 va_start(vaargs,methodID);
1365 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',vaargs);
1371 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1373 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1374 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',args);
1379 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1381 log_text("JNI-Call: CallNonvirtualByteMethodA");
1388 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1393 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1395 va_start(vaargs,methodID);
1396 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',vaargs);
1402 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1404 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1405 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',args);
1409 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1411 log_text("JNI-Call: CallNonvirtualCharMethodA");
1418 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1423 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1425 va_start(vaargs,methodID);
1426 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',vaargs);
1432 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1434 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1435 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',args);
1439 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1441 log_text("JNI-Call: CallNonvirtualShortMethodA");
1448 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1454 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1456 va_start(vaargs,methodID);
1457 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',vaargs);
1463 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1465 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1466 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',args);
1470 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1472 log_text("JNI-Call: CallNonvirtualIntMethodA");
1479 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1481 log_text("JNI-Call: CallNonvirtualLongMethod");
1487 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1489 log_text("JNI-Call: CallNonvirtualLongMethodV");
1495 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1497 log_text("JNI-Call: CallNonvirtualLongMethodA");
1504 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1509 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1512 va_start(vaargs,methodID);
1513 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'F');
1520 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1522 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1523 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'F');
1527 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1529 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1536 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1540 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1542 va_start(vaargs,methodID);
1543 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'D');
1550 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1552 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1553 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'D');
1557 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1559 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1566 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1570 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1572 va_start(vaargs,methodID);
1573 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',vaargs);
1579 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1581 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1583 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',args);
1588 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1590 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1593 /************************* JNI-functions for accessing fields ************************/
1595 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1599 /* log_text("========================= searching for:");
1602 f = jclass_findfield(clazz,
1603 utf_new_char ((char*) name),
1604 utf_new_char ((char*) sig)
1608 /* utf_display(clazz->name);
1611 exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1616 /*************************** retrieve fieldid, abort on error ************************/
1618 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
1620 jfieldID id = GetFieldID(env, clazz, name, sig);
1624 utf_display(clazz->name);
1625 log_text("\nfield:");
1630 panic("setfield_critical failed");
1635 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1637 return getField(obj,jobject,fieldID);
1640 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1642 return getField(obj,jboolean,fieldID);
1646 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1648 return getField(obj,jbyte,fieldID);
1652 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1654 return getField(obj,jchar,fieldID);
1658 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1660 return getField(obj,jshort,fieldID);
1664 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1666 return getField(obj,jint,fieldID);
1670 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1672 return getField(obj,jlong,fieldID);
1676 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1678 return getField(obj,jfloat,fieldID);
1682 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1684 return getField(obj,jdouble,fieldID);
1687 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1689 setField(obj,jobject,fieldID,val);
1693 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1695 setField(obj,jboolean,fieldID,val);
1699 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1701 setField(obj,jbyte,fieldID,val);
1705 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1707 setField(obj,jchar,fieldID,val);
1711 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
1713 setField(obj,jshort,fieldID,val);
1717 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
1719 setField(obj,jint,fieldID,val);
1723 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
1725 setField(obj,jlong,fieldID,val);
1729 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
1731 setField(obj,jfloat,fieldID,val);
1735 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
1737 setField(obj,jdouble,fieldID,val);
1740 /**************** JNI-functions for calling static methods **********************/
1742 jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1746 m = class_resolvemethod (
1748 utf_new_char ((char*) name),
1749 utf_new_char ((char*) sig)
1752 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1757 jobject CallStaticObjectMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1759 log_text("JNI-Call: CallStaticObjectMethod");
1765 jobject CallStaticObjectMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1767 log_text("JNI-Call: CallStaticObjectMethodV");
1773 jobject CallStaticObjectMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1775 log_text("JNI-Call: CallStaticObjectMethodA");
1781 jboolean CallStaticBooleanMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1786 /* log_text("JNI-Call: CallStaticBooleanMethod");*/
1788 va_start(vaargs,methodID);
1789 ret = (jboolean)callIntegerMethod(0,methodID,'Z',vaargs);
1796 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1798 return (jboolean) callIntegerMethod(0, methodID, 'Z', args);
1801 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1803 log_text("JNI-Call: CallStaticBooleanMethodA");
1809 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1814 /* log_text("JNI-Call: CallStaticByteMethod");*/
1816 va_start(vaargs, methodID);
1817 ret = (jbyte) callIntegerMethod(0, methodID, 'B', vaargs);
1824 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1826 return (jbyte) callIntegerMethod(0, methodID, 'B', args);
1830 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1832 log_text("JNI-Call: CallStaticByteMethodA");
1838 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1843 /* log_text("JNI-Call: CallStaticByteMethod");*/
1845 va_start(vaargs, methodID);
1846 ret = (jchar) callIntegerMethod(0, methodID, 'C', vaargs);
1853 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1855 return (jchar) callIntegerMethod(0, methodID, 'C', args);
1859 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1861 log_text("JNI-Call: CallStaticCharMethodA");
1868 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1873 /* log_text("JNI-Call: CallStaticByteMethod");*/
1875 va_start(vaargs,methodID);
1876 ret = (jshort) callIntegerMethod(0, methodID, 'S', vaargs);
1883 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1885 /*log_text("JNI-Call: CallStaticShortMethodV");*/
1886 return (jshort) callIntegerMethod(0, methodID, 'S', args);
1890 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1892 log_text("JNI-Call: CallStaticShortMethodA");
1899 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1904 /* log_text("JNI-Call: CallStaticIntMethod");*/
1906 va_start(vaargs, methodID);
1907 ret = callIntegerMethod(0, methodID, 'I', vaargs);
1914 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1916 log_text("JNI-Call: CallStaticIntMethodV");
1918 return callIntegerMethod(0, methodID, 'I', args);
1922 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1924 log_text("JNI-Call: CallStaticIntMethodA");
1931 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1936 /* log_text("JNI-Call: CallStaticLongMethod");*/
1938 va_start(vaargs, methodID);
1939 ret = callLongMethod(0, methodID, vaargs);
1946 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1948 log_text("JNI-Call: CallStaticLongMethodV");
1950 return callLongMethod(0,methodID,args);
1954 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1956 log_text("JNI-Call: CallStaticLongMethodA");
1963 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1968 /* log_text("JNI-Call: CallStaticLongMethod");*/
1970 va_start(vaargs, methodID);
1971 ret = callFloatMethod(0, methodID, vaargs, 'F');
1978 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1981 return callFloatMethod(0, methodID, args, 'F');
1986 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1988 log_text("JNI-Call: CallStaticFloatMethodA");
1995 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2000 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
2002 va_start(vaargs,methodID);
2003 ret = callFloatMethod(0, methodID, vaargs, 'D');
2010 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2012 log_text("JNI-Call: CallStaticDoubleMethodV");
2014 return callFloatMethod(0, methodID, args, 'D');
2018 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2020 log_text("JNI-Call: CallStaticDoubleMethodA");
2026 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
2030 /* log_text("JNI-Call: CallStaticVoidMethod");*/
2032 va_start(vaargs, methodID);
2033 (void) callIntegerMethod(0, methodID, 'V', vaargs);
2038 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
2040 log_text("JNI-Call: CallStaticVoidMethodV");
2041 (void)callIntegerMethod(0, methodID, 'V', args);
2045 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
2047 log_text("JNI-Call: CallStaticVoidMethodA");
2051 /****************** JNI-functions for accessing static fields ********************/
2053 jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
2057 f = jclass_findfield(clazz,
2058 utf_new_char ((char*) name),
2059 utf_new_char ((char*) sig)
2062 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
2068 jobject GetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2071 return fieldID->value.a;
2075 jboolean GetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2078 return fieldID->value.i;
2082 jbyte GetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2085 return fieldID->value.i;
2089 jchar GetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2092 return fieldID->value.i;
2096 jshort GetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2099 return fieldID->value.i;
2103 jint GetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2106 return fieldID->value.i;
2110 jlong GetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2113 return fieldID->value.l;
2117 jfloat GetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2120 return fieldID->value.f;
2124 jdouble GetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2127 return fieldID->value.d;
2132 void SetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
2135 fieldID->value.a = value;
2139 void SetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
2142 fieldID->value.i = value;
2146 void SetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
2149 fieldID->value.i = value;
2153 void SetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
2156 fieldID->value.i = value;
2160 void SetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
2163 fieldID->value.i = value;
2167 void SetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
2170 fieldID->value.i = value;
2174 void SetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
2177 fieldID->value.l = value;
2181 void SetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
2184 fieldID->value.f = value;
2188 void SetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
2191 fieldID->value.d = value;
2195 /***** create new java.lang.String object from an array of Unicode characters ****/
2197 jstring NewString (JNIEnv *env, const jchar *buf, jsize len)
2200 java_lang_String *s;
2203 s = (java_lang_String*) builtin_new (class_java_lang_String);
2204 a = builtin_newarray_char (len);
2206 /* javastring or characterarray could not be created */
2207 if ( (!a) || (!s) ) return NULL;
2210 for (i=0; i<len; i++) a->data[i] = buf[i];
2219 static char emptyString[]="";
2220 static jchar emptyStringJ[]={0,0};
2222 /******************* returns the length of a Java string ***************************/
2224 jsize GetStringLength (JNIEnv *env, jstring str)
2226 return ((java_lang_String*) str)->count;
2230 /******************** convertes javastring to u2-array ****************************/
2232 u2 *javastring_tou2 (jstring so)
2234 java_lang_String *s = (java_lang_String*) so;
2239 if (!s) return NULL;
2242 if (!a) return NULL;
2244 /* allocate memory */
2245 stringbuffer = MNEW( u2 , s->count + 1 );
2248 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
2250 /* terminate string */
2251 stringbuffer[i] = '\0';
2253 return stringbuffer;
2256 /********* returns a pointer to an array of Unicode characters of the string *******/
2258 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
2260 jchar *jc=javastring_tou2(str);
2263 if (isCopy) *isCopy=JNI_TRUE;
2266 if (isCopy) *isCopy=JNI_TRUE;
2267 return emptyStringJ;
2270 /**************** native code no longer needs access to chars **********************/
2272 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
2274 if (chars==emptyStringJ) return;
2275 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
2278 /************ create new java.lang.String object from utf8-characterarray **********/
2280 jstring NewStringUTF (JNIEnv *env, const char *utf)
2282 /* log_text("NewStringUTF called");*/
2283 return javastring_new(utf_new_char(utf));
2286 /****************** returns the utf8 length in bytes of a string *******************/
2288 jsize GetStringUTFLength (JNIEnv *env, jstring string)
2290 java_lang_String *s = (java_lang_String*) string;
2292 return (jsize) u2_utflength(s->value->data, s->count);
2295 /************ converts a Javastring to an array of UTF-8 characters ****************/
2297 const char* GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy)
2300 if (verbose) log_text("GetStringUTFChars:");
2302 u=javastring_toutf((java_lang_String*) string,false);
2303 if (isCopy) *isCopy=JNI_FALSE;
2311 /***************** native code no longer needs access to utf ***********************/
2313 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2315 /*we don't release utf chars right now, perhaps that should be done later. Since there is always one reference
2316 the garbage collector will never get them*/
2318 log_text("JNI-Call: ReleaseStringUTFChars");
2319 utf_display(utf_new_char(chars));
2323 /************************** array operations ***************************************/
2325 jsize GetArrayLength (JNIEnv *env, jarray array)
2330 jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
2333 exceptionptr=proto_java_lang_NegativeArraySizeException;
2336 java_objectarray *j = builtin_anewarray (len, clazz);
2337 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2341 jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
2345 if (index<array->header.size)
2346 j = array->data[index];
2348 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2353 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
2355 if (index>=array->header.size)
2356 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2359 /* check if the class of value is a subclass of the element class of the array */
2361 if (!builtin_canstore((java_objectarray*)array,(java_objectheader*)val))
2362 exceptionptr = proto_java_lang_ArrayStoreException;
2364 array->data[index] = val;
2370 jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
2373 exceptionptr=proto_java_lang_NegativeArraySizeException;
2376 java_booleanarray *j = builtin_newarray_boolean(len);
2377 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2382 jbyteArray NewByteArray (JNIEnv *env, jsize len)
2385 exceptionptr=proto_java_lang_NegativeArraySizeException;
2388 java_bytearray *j = builtin_newarray_byte(len);
2389 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2394 jcharArray NewCharArray (JNIEnv *env, jsize len)
2397 exceptionptr=proto_java_lang_NegativeArraySizeException;
2400 java_chararray *j = builtin_newarray_char(len);
2401 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2406 jshortArray NewShortArray (JNIEnv *env, jsize len)
2409 exceptionptr=proto_java_lang_NegativeArraySizeException;
2412 java_shortarray *j = builtin_newarray_short(len);
2413 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2418 jintArray NewIntArray (JNIEnv *env, jsize len)
2421 exceptionptr=proto_java_lang_NegativeArraySizeException;
2424 java_intarray *j = builtin_newarray_int(len);
2425 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2430 jlongArray NewLongArray (JNIEnv *env, jsize len)
2433 exceptionptr=proto_java_lang_NegativeArraySizeException;
2436 java_longarray *j = builtin_newarray_long(len);
2437 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2442 jfloatArray NewFloatArray (JNIEnv *env, jsize len)
2445 exceptionptr=proto_java_lang_NegativeArraySizeException;
2448 java_floatarray *j = builtin_newarray_float(len);
2449 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2454 jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
2457 exceptionptr=proto_java_lang_NegativeArraySizeException;
2460 java_doublearray *j = builtin_newarray_double(len);
2461 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2466 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2468 if (isCopy) *isCopy = JNI_FALSE;
2473 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2475 if (isCopy) *isCopy = JNI_FALSE;
2480 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
2482 if (isCopy) *isCopy = JNI_FALSE;
2487 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
2489 if (isCopy) *isCopy = JNI_FALSE;
2494 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
2496 if (isCopy) *isCopy = JNI_FALSE;
2501 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
2503 if (isCopy) *isCopy = JNI_FALSE;
2508 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
2510 if (isCopy) *isCopy = JNI_FALSE;
2515 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
2517 if (isCopy) *isCopy = JNI_FALSE;
2523 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
2529 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
2535 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
2541 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
2547 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
2553 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
2559 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
2565 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
2570 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2572 if (start<0 || len<0 || start+len>array->header.size)
2573 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2575 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2579 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2581 if (start<0 || len<0 || start+len>array->header.size)
2582 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2584 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2588 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2590 if (start<0 || len<0 || start+len>array->header.size)
2591 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2593 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2597 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2599 if (start<0 || len<0 || start+len>array->header.size)
2600 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2602 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2606 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2608 if (start<0 || len<0 || start+len>array->header.size)
2609 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2611 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2615 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2617 if (start<0 || len<0 || start+len>array->header.size)
2618 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2620 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2624 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2626 if (start<0 || len<0 || start+len>array->header.size)
2627 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2629 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2633 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2635 if (start<0 || len<0 || start+len>array->header.size)
2636 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2638 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2642 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2644 if (start<0 || len<0 || start+len>array->header.size)
2645 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2647 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2651 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2653 if (start<0 || len<0 || start+len>array->header.size)
2654 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2656 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2660 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2662 if (start<0 || len<0 || start+len>array->header.size)
2663 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2665 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2670 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2672 if (start<0 || len<0 || start+len>array->header.size)
2673 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2675 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2679 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2681 if (start<0 || len<0 || start+len>array->header.size)
2682 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2684 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2688 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2690 if (start<0 || len<0 || start+len>array->header.size)
2691 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2693 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2697 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2699 if (start<0 || len<0 || start+len>array->header.size)
2700 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2702 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2706 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2708 if (start<0 || len<0 || start+len>array->header.size)
2709 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2711 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2714 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
2716 log_text("JNI-Call: RegisterNatives");
2721 jint UnregisterNatives (JNIEnv* env, jclass clazz)
2723 log_text("JNI-Call: UnregisterNatives");
2727 /******************************* monitor operations ********************************/
2729 jint MonitorEnter (JNIEnv* env, jobject obj)
2731 builtin_monitorenter(obj);
2736 jint MonitorExit (JNIEnv* env, jobject obj)
2738 builtin_monitorexit(obj);
2743 /************************************* JavaVM interface ****************************/
2745 #error CPP mode not supported yet
2747 jint GetJavaVM (JNIEnv* env, JavaVM **vm)
2749 log_text("JNI-Call: GetJavaVM");
2753 #endif /*__cplusplus*/
2755 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
2757 log_text("JNI-Call: GetStringRegion");
2761 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
2763 log_text("JNI-Call: GetStringUTFRegion");
2767 /****************** obtain direct pointer to array elements ***********************/
2769 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
2771 java_objectheader *s = (java_objectheader*) array;
2772 arraydescriptor *desc = s->vftbl->arraydesc;
2774 if (!desc) return NULL;
2776 return ((u1*)s) + desc->dataoffset;
2780 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
2782 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
2787 /********* returns a pointer to an array of Unicode characters of the string *******/
2789 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
2791 log_text("JNI-Call: GetStringCritical");
2793 return GetStringChars(env,string,isCopy);
2796 /**************** native code no longer needs access to chars **********************/
2798 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
2800 log_text("JNI-Call: ReleaseStringCritical");
2802 ReleaseStringChars(env,string,cstring);
2806 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
2808 log_text("JNI-Call: NewWeakGlobalRef");
2814 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
2816 log_text("JNI-Call: DeleteWeakGlobalRef");
2822 /******************************* check for pending exception ***********************/
2825 jboolean ExceptionCheck(JNIEnv* env)
2827 log_text("JNI-Call: ExceptionCheck");
2829 return exceptionptr ? JNI_TRUE : JNI_FALSE;
2837 jint DestroyJavaVM(JavaVM *vm)
2839 log_text("DestroyJavaVM called");
2845 jint AttachCurrentThread(JavaVM *vm, void **par1, void *par2)
2847 log_text("AttachCurrentThread called");
2853 jint DetachCurrentThread(JavaVM *vm)
2855 log_text("DetachCurrentThread called");
2861 jint GetEnv(JavaVM *vm, void **environment, jint jniversion)
2863 *environment = &env;
2869 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
2871 log_text("AttachCurrentThreadAsDaemon called");
2886 /********************************* JNI invocation table ******************************/
2888 struct _JavaVM javaVMTable={
2893 &AttachCurrentThread,
2894 &DetachCurrentThread,
2896 &AttachCurrentThreadAsDaemon
2899 JavaVM javaVM = &javaVMTable;
2902 /********************************* JNI function table ******************************/
2904 struct JNI_Table envTable = {
2912 &FromReflectedMethod,
2913 &FromReflectedField,
2931 &EnsureLocalCapacity,
2943 &CallBooleanMethodV,
2944 &CallBooleanMethodA,
2969 &CallNonvirtualObjectMethod,
2970 &CallNonvirtualObjectMethodV,
2971 &CallNonvirtualObjectMethodA,
2972 &CallNonvirtualBooleanMethod,
2973 &CallNonvirtualBooleanMethodV,
2974 &CallNonvirtualBooleanMethodA,
2975 &CallNonvirtualByteMethod,
2976 &CallNonvirtualByteMethodV,
2977 &CallNonvirtualByteMethodA,
2978 &CallNonvirtualCharMethod,
2979 &CallNonvirtualCharMethodV,
2980 &CallNonvirtualCharMethodA,
2981 &CallNonvirtualShortMethod,
2982 &CallNonvirtualShortMethodV,
2983 &CallNonvirtualShortMethodA,
2984 &CallNonvirtualIntMethod,
2985 &CallNonvirtualIntMethodV,
2986 &CallNonvirtualIntMethodA,
2987 &CallNonvirtualLongMethod,
2988 &CallNonvirtualLongMethodV,
2989 &CallNonvirtualLongMethodA,
2990 &CallNonvirtualFloatMethod,
2991 &CallNonvirtualFloatMethodV,
2992 &CallNonvirtualFloatMethodA,
2993 &CallNonvirtualDoubleMethod,
2994 &CallNonvirtualDoubleMethodV,
2995 &CallNonvirtualDoubleMethodA,
2996 &CallNonvirtualVoidMethod,
2997 &CallNonvirtualVoidMethodV,
2998 &CallNonvirtualVoidMethodA,
3019 &CallStaticObjectMethod,
3020 &CallStaticObjectMethodV,
3021 &CallStaticObjectMethodA,
3022 &CallStaticBooleanMethod,
3023 &CallStaticBooleanMethodV,
3024 &CallStaticBooleanMethodA,
3025 &CallStaticByteMethod,
3026 &CallStaticByteMethodV,
3027 &CallStaticByteMethodA,
3028 &CallStaticCharMethod,
3029 &CallStaticCharMethodV,
3030 &CallStaticCharMethodA,
3031 &CallStaticShortMethod,
3032 &CallStaticShortMethodV,
3033 &CallStaticShortMethodA,
3034 &CallStaticIntMethod,
3035 &CallStaticIntMethodV,
3036 &CallStaticIntMethodA,
3037 &CallStaticLongMethod,
3038 &CallStaticLongMethodV,
3039 &CallStaticLongMethodA,
3040 &CallStaticFloatMethod,
3041 &CallStaticFloatMethodV,
3042 &CallStaticFloatMethodA,
3043 &CallStaticDoubleMethod,
3044 &CallStaticDoubleMethodV,
3045 &CallStaticDoubleMethodA,
3046 &CallStaticVoidMethod,
3047 &CallStaticVoidMethodV,
3048 &CallStaticVoidMethodA,
3050 &GetStaticObjectField,
3051 &GetStaticBooleanField,
3052 &GetStaticByteField,
3053 &GetStaticCharField,
3054 &GetStaticShortField,
3056 &GetStaticLongField,
3057 &GetStaticFloatField,
3058 &GetStaticDoubleField,
3059 &SetStaticObjectField,
3060 &SetStaticBooleanField,
3061 &SetStaticByteField,
3062 &SetStaticCharField,
3063 &SetStaticShortField,
3065 &SetStaticLongField,
3066 &SetStaticFloatField,
3067 &SetStaticDoubleField,
3071 &ReleaseStringChars,
3073 &GetStringUTFLength,
3075 &ReleaseStringUTFChars,
3078 &GetObjectArrayElement,
3079 &SetObjectArrayElement,
3088 &GetBooleanArrayElements,
3089 &GetByteArrayElements,
3090 &GetCharArrayElements,
3091 &GetShortArrayElements,
3092 &GetIntArrayElements,
3093 &GetLongArrayElements,
3094 &GetFloatArrayElements,
3095 &GetDoubleArrayElements,
3096 &ReleaseBooleanArrayElements,
3097 &ReleaseByteArrayElements,
3098 &ReleaseCharArrayElements,
3099 &ReleaseShortArrayElements,
3100 &ReleaseIntArrayElements,
3101 &ReleaseLongArrayElements,
3102 &ReleaseFloatArrayElements,
3103 &ReleaseDoubleArrayElements,
3104 &GetBooleanArrayRegion,
3105 &GetByteArrayRegion,
3106 &GetCharArrayRegion,
3107 &GetShortArrayRegion,
3109 &GetLongArrayRegion,
3110 &GetFloatArrayRegion,
3111 &GetDoubleArrayRegion,
3112 &SetBooleanArrayRegion,
3113 &SetByteArrayRegion,
3114 &SetCharArrayRegion,
3115 &SetShortArrayRegion,
3117 &SetLongArrayRegion,
3118 &SetFloatArrayRegion,
3119 &SetDoubleArrayRegion,
3126 &GetStringUTFRegion,
3127 &GetPrimitiveArrayCritical,
3128 &ReleasePrimitiveArrayCritical,
3130 &ReleaseStringCritical,
3132 &DeleteWeakGlobalRef,
3137 JNIEnv env = &envTable;
3146 jobject *jni_method_invokeNativeHelper(JNIEnv *env,struct methodinfo *methodID,jobject obj, java_objectarray *params) {
3153 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
3156 argcount=get_parametercount(methodID);
3158 if (obj && (! builtin_instanceof((java_objectheader*)obj,methodID->class))) {
3159 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
3164 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
3165 log_text("Too many arguments. invokeNativeHelper does not support that");
3169 if ( ((!params) && (argcount!=0)) ||
3170 (params && (params->header.size!=argcount))
3172 exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
3176 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
3178 retT=fill_callblock_objA(obj,methodID->descriptor,blk,params);
3181 case 'V': (void)asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3182 retVal=native_new_and_init(loader_load(utf_new_char("java/lang/Void")));
3186 intVal=(s4)asm_calljavafunction2(methodID,
3187 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3188 retVal=builtin_new(loader_load(utf_new_char("java/lang/Integer")));
3189 CallVoidMethod(env,retVal,
3190 class_resolvemethod(retVal->vftbl->class,
3191 utf_new_char("<init>"),utf_new_char("(I)V")),intVal);
3196 intVal=(s4)asm_calljavafunction2(methodID,
3197 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3198 retVal=builtin_new(loader_load(utf_new_char("java/lang/Byte")));
3199 CallVoidMethod(env,retVal,
3200 class_resolvemethod(retVal->vftbl->class,
3201 utf_new_char("<init>"),utf_new_char("(B)V")),intVal);
3206 intVal=(s4)asm_calljavafunction2(methodID,
3207 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3208 retVal=builtin_new(loader_load(utf_new_char("java/lang/Character")));
3209 CallVoidMethod(env,retVal,
3210 class_resolvemethod(retVal->vftbl->class,
3211 utf_new_char("<init>"),utf_new_char("(C)V")),intVal);
3216 intVal=(s4)asm_calljavafunction2(methodID,
3217 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3218 retVal=builtin_new(loader_load(utf_new_char("java/lang/Short")));
3219 CallVoidMethod(env,retVal,
3220 class_resolvemethod(retVal->vftbl->class,
3221 utf_new_char("<init>"),utf_new_char("(S)V")),intVal);
3226 intVal=(s4)asm_calljavafunction2(methodID,
3227 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3228 retVal=builtin_new(loader_load(utf_new_char("java/lang/Boolean")));
3229 CallVoidMethod(env,retVal,
3230 class_resolvemethod(retVal->vftbl->class,
3231 utf_new_char("<init>"),utf_new_char("(Z)V")),intVal);
3236 intVal=asm_calljavafunction2long(methodID,
3237 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3238 retVal=builtin_new(loader_load(utf_new_char("java/lang/Long")));
3239 CallVoidMethod(env,retVal,
3240 class_resolvemethod(retVal->vftbl->class,
3241 utf_new_char("<init>"),utf_new_char("(J)V")),intVal);
3246 floatVal=asm_calljavafunction2double(methodID,
3247 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3248 retVal=builtin_new(loader_load(utf_new_char("java/lang/Float")));
3249 CallVoidMethod(env,retVal,
3250 class_resolvemethod(retVal->vftbl->class,
3251 utf_new_char("<init>"),utf_new_char("(F)V")),floatVal);
3256 floatVal=asm_calljavafunction2double(methodID,
3257 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3258 retVal=builtin_new(loader_load(utf_new_char("java/lang/Double")));
3259 CallVoidMethod(env,retVal,
3260 class_resolvemethod(retVal->vftbl->class,
3261 utf_new_char("<init>"),utf_new_char("(D)V")),floatVal);
3265 case 'L': /* fall through */
3266 case '[': retVal=asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3269 /* if this happens the acception has already been set by fill_callblock_objA*/
3270 MFREE(blk, jni_callblock, 4 /*argcount+2*/);
3274 MFREE(blk, jni_callblock, 4 /*argcount+2*/);
3277 exceptionptr=native_new_and_init(loader_load("java/lang/reflect/InvocationTargetException"));
3285 * These are local overrides for various environment variables in Emacs.
3286 * Please do not remove this and leave it at the end of the file, where
3287 * Emacs will automagically detect them.
3288 * ---------------------------------------------------------------------
3291 * indent-tabs-mode: t