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 791 2003-12-16 18:49:19Z edwin $
43 #include "threads/thread.h"
44 #include "toolbox/loging.h"
45 #include "toolbox/memory.h"
46 #include "nat/java_lang_Byte.h"
47 #include "nat/java_lang_Character.h"
48 #include "nat/java_lang_Short.h"
49 #include "nat/java_lang_Integer.h"
50 #include "nat/java_lang_Boolean.h"
51 #include "nat/java_lang_Long.h"
52 #include "nat/java_lang_Float.h"
53 #include "nat/java_lang_Double.h"
54 #include "nat/java_lang_Throwable.h"
57 #define JNI_VERSION 0x00010002
60 #define PTR_TO_ITEM(ptr) ((u8)(size_t)(ptr))
62 static utf* utf_char = 0;
63 static utf* utf_bool = 0;
64 static utf* utf_byte =0;
65 static utf* utf_short = 0;
66 static utf* utf_int = 0;
67 static utf* utf_long = 0;
68 static utf* utf_float = 0;
69 static utf* utf_double = 0;
72 /********************* accessing instance-fields **********************************/
74 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
75 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
76 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
80 u4 get_parametercount(methodinfo *m)
82 utf *descr = m->descriptor; /* method-descriptor */
83 char *utf_ptr = descr->text; /* current position in utf-text */
84 char *desc_end = utf_end(descr); /* points behind utf string */
85 java_objectarray* result;
86 int parametercount = 0;
92 /* determine number of parameters */
93 while ( *utf_ptr != ')' ) {
94 get_type(&utf_ptr,desc_end,true);
98 return parametercount;
103 void fill_callblock(void *obj,utf *descr,jni_callblock blk[], va_list data, char ret) {
104 char *utf__ptr = descr->text; /* current position in utf-text */
105 char **utf_ptr = &utf__ptr;
106 char *desc_end = utf_end(descr); /* points behind utf string */
115 log_text("fill_callblock");
122 /* determine number of parameters */
124 blk[0].itemtype=TYPE_ADR;
125 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);
142 blk[cnt].itemtype=TYPE_INT;
143 dummy=va_arg(data,u4);
144 /*printf("fill_callblock: pos:%d, value:%d\n",cnt,dummy);*/
145 blk[cnt].item=(u8)dummy;
150 blk[cnt].itemtype=TYPE_LNG;
151 blk[cnt].item=(u8)va_arg(data,jlong);
154 blk[cnt].itemtype=TYPE_FLT;
155 *((jfloat*)(&blk[cnt].item))=((jfloat)va_arg(data,jdouble));
159 blk[cnt].itemtype=TYPE_DBL;
160 *((jdouble*)(&blk[cnt].item))=(jdouble)va_arg(data,jdouble);
162 case 'V' : panic ("V not allowed as function parameter");
165 while (utf_nextu2(utf_ptr)!=';')
167 blk[cnt].itemtype=TYPE_ADR;
168 blk[cnt].item=PTR_TO_ITEM(va_arg(data,void*));
174 char *start = *utf_ptr;
176 while ((ch = utf_nextu2(utf_ptr))=='[')
178 while (utf_nextu2(utf_ptr)!=';') {}
181 ch=utf_nextu2(utf_ptr);
182 blk[cnt].itemtype=TYPE_ADR;
183 blk[cnt].item=PTR_TO_ITEM(va_arg(data,void*));
190 /*the standard doesn't say anything about return value checking, but it appears to be usefull*/
191 c=utf_nextu2(utf_ptr);
192 c=utf_nextu2(utf_ptr);
193 /*printf("%c %c\n",ret,c);*/
195 if (!((c=='L') || (c=='['))) log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
196 } else if (ret != c) log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
200 /* XXX it could be considered if we should do typechecking here in the future */
201 char fill_callblock_objA(void *obj, utf *descr, jni_callblock blk[], java_objectarray* params)
203 char *utf__ptr = descr->text; /* current position in utf-text */
204 char **utf_ptr = &utf__ptr;
205 char *desc_end = utf_end(descr); /* points behind utf string */
216 utf_char=utf_new_char("java/lang/Character");
217 utf_bool=utf_new_char("java/lang/Boolean");
218 utf_byte=utf_new_char("java/lang/Byte");
219 utf_short=utf_new_char("java/lang/Short");
220 utf_int=utf_new_char("java/lang/Integer");
221 utf_long=utf_new_char("java/lang/Long");
222 utf_float=utf_new_char("java/lang/Float");
223 utf_double=utf_new_char("java/lang/Double");
228 log_text("fill_callblock");
235 /* determine number of parameters */
237 blk[0].itemtype = TYPE_ADR;
238 blk[0].item = PTR_TO_ITEM(obj);
246 while (**utf_ptr != ')') {
247 if (*utf_ptr >= desc_end)
248 panic("illegal method descriptor");
250 /* primitive types */
251 switch (utf_nextu2(utf_ptr)) {
253 param=params->data[cnts];
255 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
258 if (param->vftbl->class->name==utf_byte) {
259 blk[cnt].itemtype=TYPE_INT;
260 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
262 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
267 param=params->data[cnts];
269 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
272 if (param->vftbl->class->name==utf_char) {
273 blk[cnt].itemtype=TYPE_INT;
274 blk[cnt].item = (u8) ((struct java_lang_Character * )param)->value;
276 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
282 param=params->data[cnts];
284 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
287 if (param->vftbl->class->name==utf_short) {
288 blk[cnt].itemtype=TYPE_INT;
289 blk[cnt].item = (u8) ((struct java_lang_Short* )param)->value;
291 if (param->vftbl->class->name==utf_byte) {
292 blk[cnt].itemtype=TYPE_INT;
293 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
295 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
302 param=params->data[cnts];
304 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
307 if (param->vftbl->class->name==utf_bool) {
308 blk[cnt].itemtype=TYPE_INT;
309 blk[cnt].item = (u8) ((struct java_lang_Boolean * )param)->value;
311 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
317 /*log_text("fill_callblock_objA: param 'I'");*/
318 param=params->data[cnts];
320 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
323 if (param->vftbl->class->name==utf_int) {
324 blk[cnt].itemtype=TYPE_INT;
325 blk[cnt].item = (u8) ((struct java_lang_Integer * )param)->value;
326 /*printf("INT VALUE :%d\n",((struct java_lang_Integer * )param)->value);*/
328 if (param->vftbl->class->name==utf_short) {
329 blk[cnt].itemtype=TYPE_INT;
330 blk[cnt].item = (u8) ((struct java_lang_Short* )param)->value;
332 if (param->vftbl->class->name==utf_byte) {
333 blk[cnt].itemtype=TYPE_INT;
334 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
337 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
344 param=params->data[cnts];
346 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
349 if (param->vftbl->class->name==utf_long) {
350 blk[cnt].itemtype=TYPE_LNG;
351 blk[cnt].item = (u8) ((struct java_lang_Long * )param)->value;
353 if (param->vftbl->class->name==utf_int) {
354 blk[cnt].itemtype=TYPE_LNG;
355 blk[cnt].item = (u8) ((struct java_lang_Integer * )param)->value;
357 if (param->vftbl->class->name==utf_short) {
358 blk[cnt].itemtype=TYPE_LNG;
359 blk[cnt].item = (u8) ((struct java_lang_Short* )param)->value;
361 if (param->vftbl->class->name==utf_byte) {
362 blk[cnt].itemtype=TYPE_LNG;
363 blk[cnt].item = (u8) ((struct java_lang_Byte * )param)->value;
365 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
375 param=params->data[cnts];
377 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
381 if (param->vftbl->class->name==utf_float) {
382 blk[cnt].itemtype=TYPE_FLT;
383 *((jfloat*)(&blk[cnt].item))=(jfloat) ((struct java_lang_Float*)param)->value;
385 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
390 param=params->data[cnts];
392 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
396 if (param->vftbl->class->name==utf_double) {
397 blk[cnt].itemtype=TYPE_DBL;
398 *((jdouble*)(&blk[cnt].item))=(jdouble) ((struct java_lang_Float*)param)->value;
400 if (param->vftbl->class->name==utf_float) {
401 blk[cnt].itemtype=TYPE_DBL;
402 *((jdouble*)(&blk[cnt].item))=(jdouble) ((struct java_lang_Float*)param)->value;
404 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
410 panic("V not allowed as function parameter");
414 char *start=(*utf_ptr)-1;
417 while (utf_nextu2(utf_ptr) != ';')
419 if (!builtin_instanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD))) {
420 if (params->data[cnts]!=0) {
421 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
425 blk[cnt].itemtype = TYPE_ADR;
426 blk[cnt].item= PTR_TO_ITEM(params->data[cnts]);
432 char *start=(*utf_ptr)-1;
436 while ((ch = utf_nextu2(utf_ptr)) == '[')
438 while (utf_nextu2(utf_ptr) != ';') {}
441 ch = utf_nextu2(utf_ptr);
442 if (!builtin_arrayinstanceof(params->data[cnts],class_from_descriptor(start,end,0,CLASSLOAD_LOAD)->vftbl)) {
443 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
448 blk[cnt].itemtype = TYPE_ADR;
449 blk[cnt].item = PTR_TO_ITEM(params->data[cnts]);
457 c = utf_nextu2(utf_ptr);
458 c = utf_nextu2(utf_ptr);
459 return c; /*return type needed usage of the right lowlevel methods*/
476 jmethodID get_virtual(jobject obj,jmethodID methodID) {
477 if (obj->vftbl->class==methodID->class) return methodID;
478 return class_resolvemethod (obj->vftbl->class, methodID->name, methodID->descriptor);
481 jmethodID get_nonvirtual(jclass clazz,jmethodID methodID) {
482 if (clazz==methodID->class) return methodID;
483 return class_resolvemethod (clazz, methodID->name, methodID->descriptor);
488 jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
495 log_text("JNI-Call: CallObjectMethodV");
496 utf_display(methodID->name);
497 utf_display(methodID->descriptor);
498 printf("\nParmaeter count: %d\n",argcount);
499 utf_display(obj->vftbl->class->name);
504 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
508 argcount = get_parametercount(methodID);
510 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
511 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
512 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
516 if (obj && !builtin_instanceof(obj, methodID->class)) {
517 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
522 exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
523 log_text("Too many arguments. CallObjectMethod does not support that");
527 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
529 fill_callblock(obj, methodID->descriptor, blk, args, 'O');
531 /* printf("parameter: obj: %p",blk[0].item); */
532 ret = asm_calljavafunction2(methodID,
534 (argcount + 1) * sizeof(jni_callblock),
537 MFREE(blk, jni_callblock, argcount + 1);
538 /* printf("(CallObjectMethodV)-->%p\n",ret); */
544 core function for integer class methods (bool, byte, short, integer)
545 This is basically needed for i386
547 jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list args)
553 /* printf("%p, %c\n",retType,methodID,retType);*/
556 log_text("JNI-Call: CallObjectMethodV");
557 utf_display(methodID->name);
558 utf_display(methodID->descriptor);
559 printf("\nParmaeter count: %d\n",argcount);
560 utf_display(obj->vftbl->class->name);
564 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
568 argcount = get_parametercount(methodID);
570 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
571 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
572 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
576 if (obj && !builtin_instanceof(obj, methodID->class)) {
577 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
583 exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
584 log_text("Too many arguments. CallObjectMethod does not support that");
588 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
590 fill_callblock(obj, methodID->descriptor, blk, args, retType);
592 /* printf("parameter: obj: %p",blk[0].item); */
593 ret = (jint) asm_calljavafunction2(methodID,
595 (argcount + 1) * sizeof(jni_callblock),
598 MFREE(blk, jni_callblock, argcount + 1);
599 /* printf("(CallObjectMethodV)-->%p\n",ret); */
605 /*core function for long class functions*/
606 jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
613 log_text("JNI-Call: CallObjectMethodV");
614 utf_display(methodID->name);
615 utf_display(methodID->descriptor);
616 printf("\nParmaeter count: %d\n",argcount);
617 utf_display(obj->vftbl->class->name);
621 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
625 argcount = get_parametercount(methodID);
627 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
628 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
629 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
633 if (obj && !builtin_instanceof(obj,methodID->class)) {
634 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
640 exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
641 log_text("Too many arguments. CallObjectMethod does not support that");
645 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
647 fill_callblock(obj, methodID->descriptor, blk, args, 'L');
649 /* printf("parameter: obj: %p",blk[0].item); */
650 ret = asm_calljavafunction2long(methodID,
652 (argcount + 1) * sizeof(jni_callblock),
655 MFREE(blk, jni_callblock, argcount + 1);
656 /* printf("(CallObjectMethodV)-->%p\n",ret); */
662 /*core function for float class methods (float,double)*/
663 jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,char retType)
665 int argcount = get_parametercount(methodID);
670 log_text("JNI-Call: CallObjectMethodV");
671 utf_display(methodID->name);
672 utf_display(methodID->descriptor);
673 printf("\nParmaeter count: %d\n",argcount);
674 utf_display(obj->vftbl->class->name);
679 exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
680 log_text("Too many arguments. CallObjectMethod does not support that");
684 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
686 fill_callblock(obj, methodID->descriptor, blk, args, retType);
688 /* printf("parameter: obj: %p",blk[0].item); */
689 ret = asm_calljavafunction2double(methodID,
691 (argcount + 1) * sizeof(jni_callblock),
694 MFREE(blk, jni_callblock, argcount + 1);
695 /* printf("(CallObjectMethodV)-->%p\n",ret); */
701 /*************************** function: jclass_findfield ****************************
703 searches for field with specified name and type in a 'classinfo'-structur
704 if no such field is found NULL is returned
706 ************************************************************************************/
708 fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
711 /* printf(" FieldCount: %d\n",c->fieldscount);
712 utf_display(c->name); */
713 for (i = 0; i < c->fieldscount; i++) {
714 /* utf_display(c->fields[i].name);
716 utf_display(c->fields[i].descriptor);
718 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
719 return &(c->fields[i]);
722 if (c->super) return jclass_findfield(c->super,name,desc);
727 /********************* returns version of native method interface *****************/
729 jint GetVersion (JNIEnv* env)
734 /****************** loads a class from a buffer of raw class data *****************/
736 jclass DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len)
740 /* change suck-mode, so subsequent class_load will read from memory-buffer */
741 classload_buffer( (u1*) buf,len);
743 clazz = loader_load(utf_new_char ((char *) name));
745 /* restore old suck-mode */
746 classload_buffer(NULL,0);
752 /*************** loads locally defined class with the specified name **************/
754 jclass FindClass (JNIEnv* env, const char *name)
758 /* if (strcmp(name,"[B")==0) {
759 c = loader_load(utf_new_char("The_Array_Class"));
762 c = loader_load(utf_new_char_classname ((char *) name));
764 if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
770 /***********************************************************************************
772 converts java.lang.reflect.Method or
773 java.lang.reflect.Constructor object to a method ID
775 **********************************************************************************/
777 jmethodID FromReflectedMethod(JNIEnv* env, jobject method)
779 /* log_text("JNI-Call: FromReflectedMethod"); */
785 /*************** return superclass of the class represented by sub ****************/
787 jclass GetSuperclass(JNIEnv* env, jclass sub)
791 c = ((classinfo*) sub)->super;
795 use_class_as_object(c);
801 /*********************** check whether sub can be cast to sup ********************/
803 jboolean IsAssignableForm(JNIEnv* env, jclass sub, jclass sup)
805 return builtin_isanysubclass(sub, sup);
809 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
811 jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
813 /* log_text("JNI-Call: ToReflectedField"); */
819 /***************** throw java.lang.Throwable object ******************************/
821 jint Throw(JNIEnv* env, jthrowable obj)
823 exceptionptr = (java_objectheader*) obj;
829 /***********************************************************************************
831 create exception object from the class clazz with the
832 specified message and cause it to be thrown
834 **********************************************************************************/
837 jint ThrowNew (JNIEnv* env, jclass clazz, const char *msg)
839 java_lang_Throwable *o;
841 /* instantiate exception object */
842 o = (java_lang_Throwable *) native_new_and_init ((classinfo*) clazz);
846 o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
848 exceptionptr = (java_objectheader*) o;
852 /************************* check if exception occured *****************************/
854 jthrowable ExceptionOccurred (JNIEnv* env)
856 return (jthrowable) exceptionptr;
859 /********** print exception and a backtrace of the stack (for debugging) **********/
861 void ExceptionDescribe (JNIEnv* env)
863 utf_display(exceptionptr->vftbl->class->name);
869 /******************* clear any exception currently being thrown *******************/
871 void ExceptionClear (JNIEnv* env)
877 /********** raises a fatal error and does not expect the VM to recover ************/
879 void FatalError (JNIEnv* env, const char *msg)
884 /******************* creates a new local reference frame **************************/
886 jint PushLocalFrame(JNIEnv* env, jint capacity)
893 /**************** Pops off the current local reference frame **********************/
895 jobject PopLocalFrame(JNIEnv* env, jobject result)
903 /** Creates a new global reference to the object referred to by the obj argument **/
905 jobject NewGlobalRef(JNIEnv* env, jobject lobj)
910 /************* Deletes the global reference pointed to by globalRef **************/
912 void DeleteGlobalRef (JNIEnv* env, jobject gref)
918 /*************** Deletes the local reference pointed to by localRef ***************/
920 void DeleteLocalRef (JNIEnv* env, jobject localRef)
925 /********** Tests whether two references refer to the same Java object ************/
927 jboolean IsSameObject (JNIEnv* env, jobject obj1, jobject obj2)
932 /***** Creates a new local reference that refers to the same object as ref *******/
934 jobject NewLocalRef (JNIEnv* env, jobject ref)
939 /***********************************************************************************
941 Ensures that at least a given number of local references can
942 be created in the current thread
944 **********************************************************************************/
946 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
948 return 0; /* return 0 on success */
952 /********* Allocates a new Java object without invoking a constructor *************/
954 jobject AllocObject (JNIEnv* env, jclass clazz)
956 java_objectheader *o = builtin_new(clazz);
961 /***********************************************************************************
963 Constructs a new Java object
964 arguments that are to be passed to the constructor are placed after methodID
966 ***********************************************************************************/
968 jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
970 java_objectheader *o;
972 int argcount=get_parametercount(methodID);
976 /* log_text("JNI-Call: NewObject"); */
979 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
980 log_text("Too many arguments. NewObject does not support that");
985 o = builtin_new (clazz); /* create object */
989 va_start(vaargs,methodID);
990 for (i=0;i<argcount;i++) {
991 args[i]=va_arg(vaargs,void*);
994 asm_calljavafunction(methodID,o,args[0],args[1],args[2]);
1000 /***********************************************************************************
1002 Constructs a new Java object
1003 arguments that are to be passed to the constructor are placed in va_list args
1005 ***********************************************************************************/
1007 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
1009 /* log_text("JNI-Call: NewObjectV"); */
1015 /***********************************************************************************
1017 Constructs a new Java object
1018 arguments that are to be passed to the constructor are placed in
1019 args array of jvalues
1021 ***********************************************************************************/
1023 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
1025 /* log_text("JNI-Call: NewObjectA"); */
1031 /************************ returns the class of an object **************************/
1033 jclass GetObjectClass(JNIEnv* env, jobject obj)
1035 classinfo *c = obj->vftbl->class;
1036 /* log_text("GetObjectClass");
1037 utf_display(obj->vftbl->class->name);*/
1038 use_class_as_object(c);
1040 /*printf("\nPointer: %p\n",c);*/
1045 /************* tests whether an object is an instance of a class ******************/
1047 jboolean IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz)
1049 return builtin_instanceof(obj,clazz);
1053 /***************** converts a java.lang.reflect.Field to a field ID ***************/
1055 jfieldID FromReflectedField(JNIEnv* env, jobject field)
1057 log_text("JNI-Call: FromReflectedField");
1063 /**********************************************************************************
1065 converts a method ID to a java.lang.reflect.Method or
1066 java.lang.reflect.Constructor object
1068 **********************************************************************************/
1070 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
1072 log_text("JNI-Call: ToReflectedMethod");
1078 /**************** returns the method ID for an instance method ********************/
1080 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
1084 m = class_resolvemethod (
1086 utf_new_char ((char*) name),
1087 utf_new_char ((char*) sig)
1090 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1096 /******************** JNI-functions for calling instance methods ******************/
1098 jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1103 /* log_text("JNI-Call: CallObjectMethod");*/
1105 va_start(vaargs, methodID);
1106 ret = callObjectMethod(obj, methodID, vaargs);
1113 jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1115 return callObjectMethod(obj,methodID,args);
1119 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1121 log_text("JNI-Call: CallObjectMethodA");
1129 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1134 /* log_text("JNI-Call: CallBooleanMethod");*/
1136 va_start(vaargs,methodID);
1137 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',vaargs);
1143 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1145 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',args);
1149 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1151 log_text("JNI-Call: CallBooleanMethodA");
1156 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1161 /* log_text("JNI-Call: CallVyteMethod");*/
1163 va_start(vaargs,methodID);
1164 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'B',vaargs);
1170 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1172 /* log_text("JNI-Call: CallByteMethodV");*/
1173 return callIntegerMethod(obj,methodID,'B',args);
1177 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1179 log_text("JNI-Call: CallByteMethodA");
1185 jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1190 /* log_text("JNI-Call: CallCharMethod");*/
1192 va_start(vaargs,methodID);
1193 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'C', vaargs);
1200 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1202 /* log_text("JNI-Call: CallCharMethodV");*/
1203 return callIntegerMethod(obj,get_virtual(obj,methodID),'C',args);
1207 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1209 log_text("JNI-Call: CallCharMethodA");
1215 jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1220 /* log_text("JNI-Call: CallShortMethod");*/
1222 va_start(vaargs, methodID);
1223 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'S', vaargs);
1230 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1232 return callIntegerMethod(obj, get_virtual(obj, methodID), 'S', args);
1236 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1238 log_text("JNI-Call: CallShortMethodA");
1245 jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1250 va_start(vaargs,methodID);
1251 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'I', vaargs);
1258 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1260 return callIntegerMethod(obj, get_virtual(obj, methodID), 'I', args);
1264 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1266 log_text("JNI-Call: CallIntMethodA");
1273 jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1275 log_text("JNI-Call: CallLongMethod");
1281 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1283 log_text("JNI-Call: CallLongMethodV");
1289 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1291 log_text("JNI-Call: CallLongMethodA");
1298 jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1303 /* log_text("JNI-Call: CallFloatMethod");*/
1305 va_start(vaargs,methodID);
1306 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'F');
1313 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1315 log_text("JNI-Call: CallFloatMethodV");
1316 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'F');
1320 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1322 log_text("JNI-Call: CallFloatMethodA");
1329 jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1334 /* log_text("JNI-Call: CallDoubleMethod");*/
1336 va_start(vaargs,methodID);
1337 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'D');
1344 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1346 log_text("JNI-Call: CallDoubleMethodV");
1347 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'D');
1351 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1353 log_text("JNI-Call: CallDoubleMethodA");
1359 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1363 /* log_text("JNI-Call: CallVoidMethod");*/
1365 va_start(vaargs,methodID);
1366 (void) callIntegerMethod(obj, get_virtual(obj, methodID), 'V', vaargs);
1371 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1373 log_text("JNI-Call: CallVoidMethodV");
1374 (void)callIntegerMethod(obj,get_virtual(obj,methodID),'V',args);
1378 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1380 log_text("JNI-Call: CallVoidMethodA");
1385 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1387 log_text("JNI-Call: CallNonvirtualObjectMethod");
1393 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1395 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1401 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1403 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1410 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1415 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1417 va_start(vaargs,methodID);
1418 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',vaargs);
1425 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1427 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1428 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',args);
1432 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1434 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1441 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1446 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1448 va_start(vaargs,methodID);
1449 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',vaargs);
1455 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1457 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1458 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',args);
1463 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1465 log_text("JNI-Call: CallNonvirtualByteMethodA");
1472 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1477 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1479 va_start(vaargs,methodID);
1480 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',vaargs);
1486 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1488 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1489 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',args);
1493 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1495 log_text("JNI-Call: CallNonvirtualCharMethodA");
1502 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1507 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1509 va_start(vaargs,methodID);
1510 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',vaargs);
1516 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1518 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1519 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',args);
1523 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1525 log_text("JNI-Call: CallNonvirtualShortMethodA");
1532 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1538 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1540 va_start(vaargs,methodID);
1541 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',vaargs);
1547 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1549 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1550 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',args);
1554 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1556 log_text("JNI-Call: CallNonvirtualIntMethodA");
1563 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1565 log_text("JNI-Call: CallNonvirtualLongMethod");
1571 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1573 log_text("JNI-Call: CallNonvirtualLongMethodV");
1579 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1581 log_text("JNI-Call: CallNonvirtualLongMethodA");
1588 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1593 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1596 va_start(vaargs,methodID);
1597 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'F');
1604 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1606 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1607 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'F');
1611 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1613 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1620 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1624 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1626 va_start(vaargs,methodID);
1627 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'D');
1634 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1636 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1637 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'D');
1641 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1643 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1650 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1654 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1656 va_start(vaargs,methodID);
1657 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',vaargs);
1663 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1665 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1667 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',args);
1672 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1674 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1677 /************************* JNI-functions for accessing fields ************************/
1679 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1683 /* log_text("========================= searching for:");
1686 f = jclass_findfield(clazz,
1687 utf_new_char ((char*) name),
1688 utf_new_char ((char*) sig)
1692 /* utf_display(clazz->name);
1695 exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1700 /*************************** retrieve fieldid, abort on error ************************/
1702 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
1704 jfieldID id = GetFieldID(env, clazz, name, sig);
1708 utf_display(clazz->name);
1709 log_text("\nfield:");
1714 panic("setfield_critical failed");
1719 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1721 return getField(obj,jobject,fieldID);
1724 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1726 return getField(obj,jboolean,fieldID);
1730 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1732 return getField(obj,jbyte,fieldID);
1736 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1738 return getField(obj,jchar,fieldID);
1742 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1744 return getField(obj,jshort,fieldID);
1748 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1750 return getField(obj,jint,fieldID);
1754 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1756 return getField(obj,jlong,fieldID);
1760 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1762 return getField(obj,jfloat,fieldID);
1766 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1768 return getField(obj,jdouble,fieldID);
1771 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1773 setField(obj,jobject,fieldID,val);
1777 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1779 setField(obj,jboolean,fieldID,val);
1783 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1785 setField(obj,jbyte,fieldID,val);
1789 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1791 setField(obj,jchar,fieldID,val);
1795 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
1797 setField(obj,jshort,fieldID,val);
1801 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
1803 setField(obj,jint,fieldID,val);
1807 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
1809 setField(obj,jlong,fieldID,val);
1813 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
1815 setField(obj,jfloat,fieldID,val);
1819 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
1821 setField(obj,jdouble,fieldID,val);
1824 /**************** JNI-functions for calling static methods **********************/
1826 jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1830 m = class_resolvemethod (
1832 utf_new_char ((char*) name),
1833 utf_new_char ((char*) sig)
1836 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1841 jobject CallStaticObjectMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1843 log_text("JNI-Call: CallStaticObjectMethod");
1849 jobject CallStaticObjectMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1851 log_text("JNI-Call: CallStaticObjectMethodV");
1857 jobject CallStaticObjectMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1859 log_text("JNI-Call: CallStaticObjectMethodA");
1865 jboolean CallStaticBooleanMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1870 /* log_text("JNI-Call: CallStaticBooleanMethod");*/
1872 va_start(vaargs,methodID);
1873 ret = (jboolean)callIntegerMethod(0,methodID,'Z',vaargs);
1880 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1882 return (jboolean) callIntegerMethod(0, methodID, 'Z', args);
1885 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1887 log_text("JNI-Call: CallStaticBooleanMethodA");
1893 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1898 /* log_text("JNI-Call: CallStaticByteMethod");*/
1900 va_start(vaargs, methodID);
1901 ret = (jbyte) callIntegerMethod(0, methodID, 'B', vaargs);
1908 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1910 return (jbyte) callIntegerMethod(0, methodID, 'B', args);
1914 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1916 log_text("JNI-Call: CallStaticByteMethodA");
1922 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1927 /* log_text("JNI-Call: CallStaticByteMethod");*/
1929 va_start(vaargs, methodID);
1930 ret = (jchar) callIntegerMethod(0, methodID, 'C', vaargs);
1937 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1939 return (jchar) callIntegerMethod(0, methodID, 'C', args);
1943 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1945 log_text("JNI-Call: CallStaticCharMethodA");
1952 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1957 /* log_text("JNI-Call: CallStaticByteMethod");*/
1959 va_start(vaargs,methodID);
1960 ret = (jshort) callIntegerMethod(0, methodID, 'S', vaargs);
1967 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1969 /*log_text("JNI-Call: CallStaticShortMethodV");*/
1970 return (jshort) callIntegerMethod(0, methodID, 'S', args);
1974 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1976 log_text("JNI-Call: CallStaticShortMethodA");
1983 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1988 /* log_text("JNI-Call: CallStaticIntMethod");*/
1990 va_start(vaargs, methodID);
1991 ret = callIntegerMethod(0, methodID, 'I', vaargs);
1998 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2000 log_text("JNI-Call: CallStaticIntMethodV");
2002 return callIntegerMethod(0, methodID, 'I', args);
2006 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2008 log_text("JNI-Call: CallStaticIntMethodA");
2015 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2020 /* log_text("JNI-Call: CallStaticLongMethod");*/
2022 va_start(vaargs, methodID);
2023 ret = callLongMethod(0, methodID, vaargs);
2030 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2032 log_text("JNI-Call: CallStaticLongMethodV");
2034 return callLongMethod(0,methodID,args);
2038 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2040 log_text("JNI-Call: CallStaticLongMethodA");
2047 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2052 /* log_text("JNI-Call: CallStaticLongMethod");*/
2054 va_start(vaargs, methodID);
2055 ret = callFloatMethod(0, methodID, vaargs, 'F');
2062 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2065 return callFloatMethod(0, methodID, args, 'F');
2070 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2072 log_text("JNI-Call: CallStaticFloatMethodA");
2079 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2084 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
2086 va_start(vaargs,methodID);
2087 ret = callFloatMethod(0, methodID, vaargs, 'D');
2094 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2096 log_text("JNI-Call: CallStaticDoubleMethodV");
2098 return callFloatMethod(0, methodID, args, 'D');
2102 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2104 log_text("JNI-Call: CallStaticDoubleMethodA");
2110 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
2114 /* log_text("JNI-Call: CallStaticVoidMethod");*/
2116 va_start(vaargs, methodID);
2117 (void) callIntegerMethod(0, methodID, 'V', vaargs);
2122 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
2124 log_text("JNI-Call: CallStaticVoidMethodV");
2125 (void)callIntegerMethod(0, methodID, 'V', args);
2129 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
2131 log_text("JNI-Call: CallStaticVoidMethodA");
2135 /****************** JNI-functions for accessing static fields ********************/
2137 jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
2141 f = jclass_findfield(clazz,
2142 utf_new_char ((char*) name),
2143 utf_new_char ((char*) sig)
2146 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
2152 jobject GetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2155 return fieldID->value.a;
2159 jboolean GetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2162 return fieldID->value.i;
2166 jbyte GetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2169 return fieldID->value.i;
2173 jchar GetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2176 return fieldID->value.i;
2180 jshort GetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2183 return fieldID->value.i;
2187 jint GetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2190 return fieldID->value.i;
2194 jlong GetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2197 return fieldID->value.l;
2201 jfloat GetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2204 return fieldID->value.f;
2208 jdouble GetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID)
2211 return fieldID->value.d;
2216 void SetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
2219 fieldID->value.a = value;
2223 void SetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
2226 fieldID->value.i = value;
2230 void SetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
2233 fieldID->value.i = value;
2237 void SetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
2240 fieldID->value.i = value;
2244 void SetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
2247 fieldID->value.i = value;
2251 void SetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
2254 fieldID->value.i = value;
2258 void SetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
2261 fieldID->value.l = value;
2265 void SetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
2268 fieldID->value.f = value;
2272 void SetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
2275 fieldID->value.d = value;
2279 /***** create new java.lang.String object from an array of Unicode characters ****/
2281 jstring NewString (JNIEnv *env, const jchar *buf, jsize len)
2284 java_lang_String *s;
2287 s = (java_lang_String*) builtin_new (class_java_lang_String);
2288 a = builtin_newarray_char (len);
2290 /* javastring or characterarray could not be created */
2291 if ( (!a) || (!s) ) return NULL;
2294 for (i=0; i<len; i++) a->data[i] = buf[i];
2303 static char emptyString[]="";
2304 static jchar emptyStringJ[]={0,0};
2306 /******************* returns the length of a Java string ***************************/
2308 jsize GetStringLength (JNIEnv *env, jstring str)
2310 return ((java_lang_String*) str)->count;
2314 /******************** convertes javastring to u2-array ****************************/
2316 u2 *javastring_tou2 (jstring so)
2318 java_lang_String *s = (java_lang_String*) so;
2323 if (!s) return NULL;
2326 if (!a) return NULL;
2328 /* allocate memory */
2329 stringbuffer = MNEW( u2 , s->count + 1 );
2332 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
2334 /* terminate string */
2335 stringbuffer[i] = '\0';
2337 return stringbuffer;
2340 /********* returns a pointer to an array of Unicode characters of the string *******/
2342 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
2344 jchar *jc=javastring_tou2(str);
2347 if (isCopy) *isCopy=JNI_TRUE;
2350 if (isCopy) *isCopy=JNI_TRUE;
2351 return emptyStringJ;
2354 /**************** native code no longer needs access to chars **********************/
2356 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
2358 if (chars==emptyStringJ) return;
2359 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
2362 /************ create new java.lang.String object from utf8-characterarray **********/
2364 jstring NewStringUTF (JNIEnv *env, const char *utf)
2366 /* log_text("NewStringUTF called");*/
2367 return javastring_new(utf_new_char(utf));
2370 /****************** returns the utf8 length in bytes of a string *******************/
2372 jsize GetStringUTFLength (JNIEnv *env, jstring string)
2374 java_lang_String *s = (java_lang_String*) string;
2376 return (jsize) u2_utflength(s->value->data, s->count);
2379 /************ converts a Javastring to an array of UTF-8 characters ****************/
2381 const char* GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy)
2384 if (verbose) log_text("GetStringUTFChars:");
2386 u=javastring_toutf((java_lang_String*) string,false);
2387 if (isCopy) *isCopy=JNI_FALSE;
2395 /***************** native code no longer needs access to utf ***********************/
2397 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2399 /*we don't release utf chars right now, perhaps that should be done later. Since there is always one reference
2400 the garbage collector will never get them*/
2402 log_text("JNI-Call: ReleaseStringUTFChars");
2403 utf_display(utf_new_char(chars));
2407 /************************** array operations ***************************************/
2409 jsize GetArrayLength (JNIEnv *env, jarray array)
2414 jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
2416 java_objectarray *j;
2418 exceptionptr=proto_java_lang_NegativeArraySizeException;
2421 j = builtin_anewarray (len, clazz);
2422 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2426 jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
2430 if (index<array->header.size)
2431 j = array->data[index];
2433 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2438 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
2440 if (index>=array->header.size)
2441 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2444 /* check if the class of value is a subclass of the element class of the array */
2446 if (!builtin_canstore((java_objectarray*)array,(java_objectheader*)val))
2447 exceptionptr = proto_java_lang_ArrayStoreException;
2449 array->data[index] = val;
2455 jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
2457 java_booleanarray *j;
2459 exceptionptr=proto_java_lang_NegativeArraySizeException;
2462 j = builtin_newarray_boolean(len);
2463 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2468 jbyteArray NewByteArray (JNIEnv *env, jsize len)
2472 exceptionptr=proto_java_lang_NegativeArraySizeException;
2475 j = builtin_newarray_byte(len);
2476 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2481 jcharArray NewCharArray (JNIEnv *env, jsize len)
2485 exceptionptr=proto_java_lang_NegativeArraySizeException;
2488 j = builtin_newarray_char(len);
2489 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2494 jshortArray NewShortArray (JNIEnv *env, jsize len)
2498 exceptionptr=proto_java_lang_NegativeArraySizeException;
2501 j = builtin_newarray_short(len);
2502 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2507 jintArray NewIntArray (JNIEnv *env, jsize len)
2511 exceptionptr=proto_java_lang_NegativeArraySizeException;
2514 j = builtin_newarray_int(len);
2515 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2520 jlongArray NewLongArray (JNIEnv *env, jsize len)
2524 exceptionptr=proto_java_lang_NegativeArraySizeException;
2527 j = builtin_newarray_long(len);
2528 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2533 jfloatArray NewFloatArray (JNIEnv *env, jsize len)
2537 exceptionptr=proto_java_lang_NegativeArraySizeException;
2540 j = builtin_newarray_float(len);
2541 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2546 jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
2548 java_doublearray *j;
2550 exceptionptr=proto_java_lang_NegativeArraySizeException;
2553 j = builtin_newarray_double(len);
2554 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2559 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2561 if (isCopy) *isCopy = JNI_FALSE;
2566 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2568 if (isCopy) *isCopy = JNI_FALSE;
2573 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
2575 if (isCopy) *isCopy = JNI_FALSE;
2580 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
2582 if (isCopy) *isCopy = JNI_FALSE;
2587 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
2589 if (isCopy) *isCopy = JNI_FALSE;
2594 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
2596 if (isCopy) *isCopy = JNI_FALSE;
2601 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
2603 if (isCopy) *isCopy = JNI_FALSE;
2608 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
2610 if (isCopy) *isCopy = JNI_FALSE;
2616 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
2622 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
2628 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
2634 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
2640 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
2646 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
2652 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
2658 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
2663 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2665 if (start<0 || len<0 || start+len>array->header.size)
2666 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2668 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2672 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2674 if (start<0 || len<0 || start+len>array->header.size)
2675 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2677 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2681 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2683 if (start<0 || len<0 || start+len>array->header.size)
2684 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2686 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2690 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2692 if (start<0 || len<0 || start+len>array->header.size)
2693 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2695 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2699 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2701 if (start<0 || len<0 || start+len>array->header.size)
2702 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2704 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2708 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2710 if (start<0 || len<0 || start+len>array->header.size)
2711 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2713 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2717 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2719 if (start<0 || len<0 || start+len>array->header.size)
2720 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2722 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2726 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2728 if (start<0 || len<0 || start+len>array->header.size)
2729 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2731 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2735 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2737 if (start<0 || len<0 || start+len>array->header.size)
2738 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2740 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2744 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2746 if (start<0 || len<0 || start+len>array->header.size)
2747 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2749 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2753 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2755 if (start<0 || len<0 || start+len>array->header.size)
2756 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2758 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2763 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2765 if (start<0 || len<0 || start+len>array->header.size)
2766 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2768 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2772 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2774 if (start<0 || len<0 || start+len>array->header.size)
2775 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2777 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2781 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2783 if (start<0 || len<0 || start+len>array->header.size)
2784 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2786 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2790 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2792 if (start<0 || len<0 || start+len>array->header.size)
2793 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2795 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2799 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2801 if (start<0 || len<0 || start+len>array->header.size)
2802 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2804 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2807 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
2809 log_text("JNI-Call: RegisterNatives");
2814 jint UnregisterNatives (JNIEnv* env, jclass clazz)
2816 log_text("JNI-Call: UnregisterNatives");
2820 /******************************* monitor operations ********************************/
2822 jint MonitorEnter (JNIEnv* env, jobject obj)
2824 builtin_monitorenter(obj);
2829 jint MonitorExit (JNIEnv* env, jobject obj)
2831 builtin_monitorexit(obj);
2836 /************************************* JavaVM interface ****************************/
2838 #error CPP mode not supported yet
2840 jint GetJavaVM (JNIEnv* env, JavaVM **vm)
2842 log_text("JNI-Call: GetJavaVM");
2846 #endif /*__cplusplus*/
2848 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
2850 log_text("JNI-Call: GetStringRegion");
2854 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
2856 log_text("JNI-Call: GetStringUTFRegion");
2860 /****************** obtain direct pointer to array elements ***********************/
2862 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
2864 java_objectheader *s = (java_objectheader*) array;
2865 arraydescriptor *desc = s->vftbl->arraydesc;
2867 if (!desc) return NULL;
2869 return ((u1*)s) + desc->dataoffset;
2873 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
2875 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
2880 /********* returns a pointer to an array of Unicode characters of the string *******/
2882 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
2884 log_text("JNI-Call: GetStringCritical");
2886 return GetStringChars(env,string,isCopy);
2889 /**************** native code no longer needs access to chars **********************/
2891 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
2893 log_text("JNI-Call: ReleaseStringCritical");
2895 ReleaseStringChars(env,string,cstring);
2899 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
2901 log_text("JNI-Call: NewWeakGlobalRef");
2907 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
2909 log_text("JNI-Call: DeleteWeakGlobalRef");
2915 /******************************* check for pending exception ***********************/
2918 jboolean ExceptionCheck(JNIEnv* env)
2920 log_text("JNI-Call: ExceptionCheck");
2922 return exceptionptr ? JNI_TRUE : JNI_FALSE;
2930 jint DestroyJavaVM(JavaVM *vm)
2932 log_text("DestroyJavaVM called");
2938 jint AttachCurrentThread(JavaVM *vm, void **par1, void *par2)
2940 log_text("AttachCurrentThread called");
2946 jint DetachCurrentThread(JavaVM *vm)
2948 log_text("DetachCurrentThread called");
2954 jint GetEnv(JavaVM *vm, void **environment, jint jniversion)
2956 *environment = &env;
2962 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
2964 log_text("AttachCurrentThreadAsDaemon called");
2979 /********************************* JNI invocation table ******************************/
2981 struct _JavaVM javaVMTable={
2986 &AttachCurrentThread,
2987 &DetachCurrentThread,
2989 &AttachCurrentThreadAsDaemon
2992 JavaVM javaVM = &javaVMTable;
2995 /********************************* JNI function table ******************************/
2997 struct JNI_Table envTable = {
3005 &FromReflectedMethod,
3006 &FromReflectedField,
3024 &EnsureLocalCapacity,
3036 &CallBooleanMethodV,
3037 &CallBooleanMethodA,
3062 &CallNonvirtualObjectMethod,
3063 &CallNonvirtualObjectMethodV,
3064 &CallNonvirtualObjectMethodA,
3065 &CallNonvirtualBooleanMethod,
3066 &CallNonvirtualBooleanMethodV,
3067 &CallNonvirtualBooleanMethodA,
3068 &CallNonvirtualByteMethod,
3069 &CallNonvirtualByteMethodV,
3070 &CallNonvirtualByteMethodA,
3071 &CallNonvirtualCharMethod,
3072 &CallNonvirtualCharMethodV,
3073 &CallNonvirtualCharMethodA,
3074 &CallNonvirtualShortMethod,
3075 &CallNonvirtualShortMethodV,
3076 &CallNonvirtualShortMethodA,
3077 &CallNonvirtualIntMethod,
3078 &CallNonvirtualIntMethodV,
3079 &CallNonvirtualIntMethodA,
3080 &CallNonvirtualLongMethod,
3081 &CallNonvirtualLongMethodV,
3082 &CallNonvirtualLongMethodA,
3083 &CallNonvirtualFloatMethod,
3084 &CallNonvirtualFloatMethodV,
3085 &CallNonvirtualFloatMethodA,
3086 &CallNonvirtualDoubleMethod,
3087 &CallNonvirtualDoubleMethodV,
3088 &CallNonvirtualDoubleMethodA,
3089 &CallNonvirtualVoidMethod,
3090 &CallNonvirtualVoidMethodV,
3091 &CallNonvirtualVoidMethodA,
3112 &CallStaticObjectMethod,
3113 &CallStaticObjectMethodV,
3114 &CallStaticObjectMethodA,
3115 &CallStaticBooleanMethod,
3116 &CallStaticBooleanMethodV,
3117 &CallStaticBooleanMethodA,
3118 &CallStaticByteMethod,
3119 &CallStaticByteMethodV,
3120 &CallStaticByteMethodA,
3121 &CallStaticCharMethod,
3122 &CallStaticCharMethodV,
3123 &CallStaticCharMethodA,
3124 &CallStaticShortMethod,
3125 &CallStaticShortMethodV,
3126 &CallStaticShortMethodA,
3127 &CallStaticIntMethod,
3128 &CallStaticIntMethodV,
3129 &CallStaticIntMethodA,
3130 &CallStaticLongMethod,
3131 &CallStaticLongMethodV,
3132 &CallStaticLongMethodA,
3133 &CallStaticFloatMethod,
3134 &CallStaticFloatMethodV,
3135 &CallStaticFloatMethodA,
3136 &CallStaticDoubleMethod,
3137 &CallStaticDoubleMethodV,
3138 &CallStaticDoubleMethodA,
3139 &CallStaticVoidMethod,
3140 &CallStaticVoidMethodV,
3141 &CallStaticVoidMethodA,
3143 &GetStaticObjectField,
3144 &GetStaticBooleanField,
3145 &GetStaticByteField,
3146 &GetStaticCharField,
3147 &GetStaticShortField,
3149 &GetStaticLongField,
3150 &GetStaticFloatField,
3151 &GetStaticDoubleField,
3152 &SetStaticObjectField,
3153 &SetStaticBooleanField,
3154 &SetStaticByteField,
3155 &SetStaticCharField,
3156 &SetStaticShortField,
3158 &SetStaticLongField,
3159 &SetStaticFloatField,
3160 &SetStaticDoubleField,
3164 &ReleaseStringChars,
3166 &GetStringUTFLength,
3168 &ReleaseStringUTFChars,
3171 &GetObjectArrayElement,
3172 &SetObjectArrayElement,
3181 &GetBooleanArrayElements,
3182 &GetByteArrayElements,
3183 &GetCharArrayElements,
3184 &GetShortArrayElements,
3185 &GetIntArrayElements,
3186 &GetLongArrayElements,
3187 &GetFloatArrayElements,
3188 &GetDoubleArrayElements,
3189 &ReleaseBooleanArrayElements,
3190 &ReleaseByteArrayElements,
3191 &ReleaseCharArrayElements,
3192 &ReleaseShortArrayElements,
3193 &ReleaseIntArrayElements,
3194 &ReleaseLongArrayElements,
3195 &ReleaseFloatArrayElements,
3196 &ReleaseDoubleArrayElements,
3197 &GetBooleanArrayRegion,
3198 &GetByteArrayRegion,
3199 &GetCharArrayRegion,
3200 &GetShortArrayRegion,
3202 &GetLongArrayRegion,
3203 &GetFloatArrayRegion,
3204 &GetDoubleArrayRegion,
3205 &SetBooleanArrayRegion,
3206 &SetByteArrayRegion,
3207 &SetCharArrayRegion,
3208 &SetShortArrayRegion,
3210 &SetLongArrayRegion,
3211 &SetFloatArrayRegion,
3212 &SetDoubleArrayRegion,
3219 &GetStringUTFRegion,
3220 &GetPrimitiveArrayCritical,
3221 &ReleasePrimitiveArrayCritical,
3223 &ReleaseStringCritical,
3225 &DeleteWeakGlobalRef,
3230 JNIEnv env = &envTable;
3239 jobject *jni_method_invokeNativeHelper(JNIEnv *env,struct methodinfo *methodID,jobject obj, java_objectarray *params) {
3246 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
3249 argcount=get_parametercount(methodID);
3251 if (obj && (!builtin_instanceof((java_objectheader*)obj,methodID->class))) {
3252 (*env)->ThrowNew(env,loader_load(utf_new_char("java/lang/IllegalArgumentException")),
3253 "Object parameter of wrong type in Java_java_lang_reflect_Method_invokeNative");
3260 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
3261 log_text("Too many arguments. invokeNativeHelper does not support that");
3265 if ( ((!params) && (argcount!=0)) ||
3266 (params && (params->header.size!=argcount))
3268 exceptionptr = native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
3273 if (!(methodID->flags & ACC_STATIC) && (!obj)) {
3274 (*env)->ThrowNew(env,loader_load(utf_new_char("java/lang/NullPointerException")),
3275 "Static mismatch in Java_java_lang_reflect_Method_invokeNative");
3279 if ((methodID->flags & ACC_STATIC) && (obj)) obj=0;
3281 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
3283 retT=fill_callblock_objA(obj,methodID->descriptor,blk,params);
3286 case 'V': (void)asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3287 retVal=NULL; /*native_new_and_init(loader_load(utf_new_char("java/lang/Void")));*/
3291 intVal=(s4)asm_calljavafunction2(methodID,
3292 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3293 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Integer")));
3294 CallVoidMethod(env,retVal,
3295 class_resolvemethod(retVal->vftbl->class,
3296 utf_new_char("<init>"),utf_new_char("(I)V")),intVal);
3301 intVal=(s4)asm_calljavafunction2(methodID,
3302 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3303 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Byte")));
3304 CallVoidMethod(env,retVal,
3305 class_resolvemethod(retVal->vftbl->class,
3306 utf_new_char("<init>"),utf_new_char("(B)V")),intVal);
3311 intVal=(s4)asm_calljavafunction2(methodID,
3312 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3313 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Character")));
3314 CallVoidMethod(env,retVal,
3315 class_resolvemethod(retVal->vftbl->class,
3316 utf_new_char("<init>"),utf_new_char("(C)V")),intVal);
3321 intVal=(s4)asm_calljavafunction2(methodID,
3322 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3323 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Short")));
3324 CallVoidMethod(env,retVal,
3325 class_resolvemethod(retVal->vftbl->class,
3326 utf_new_char("<init>"),utf_new_char("(S)V")),intVal);
3331 intVal=(s4)asm_calljavafunction2(methodID,
3332 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3333 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Boolean")));
3334 CallVoidMethod(env,retVal,
3335 class_resolvemethod(retVal->vftbl->class,
3336 utf_new_char("<init>"),utf_new_char("(Z)V")),intVal);
3341 intVal=asm_calljavafunction2long(methodID,
3342 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3343 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Long")));
3344 CallVoidMethod(env,retVal,
3345 class_resolvemethod(retVal->vftbl->class,
3346 utf_new_char("<init>"),utf_new_char("(J)V")),intVal);
3351 floatVal=asm_calljavafunction2double(methodID,
3352 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3353 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Float")));
3354 CallVoidMethod(env,retVal,
3355 class_resolvemethod(retVal->vftbl->class,
3356 utf_new_char("<init>"),utf_new_char("(F)V")),floatVal);
3361 floatVal=asm_calljavafunction2double(methodID,
3362 argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3363 retVal=builtin_new(loader_load_sysclass(NULL,utf_new_char("java/lang/Double")));
3364 CallVoidMethod(env,retVal,
3365 class_resolvemethod(retVal->vftbl->class,
3366 utf_new_char("<init>"),utf_new_char("(D)V")),floatVal);
3370 case 'L': /* fall through */
3371 case '[': retVal=asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
3374 /* if this happens the acception has already been set by fill_callblock_objA*/
3375 MFREE(blk, jni_callblock, 4 /*argcount+2*/);
3379 MFREE(blk, jni_callblock, 4 /*argcount+2*/);
3382 java_objectheader *exceptionToWrap=exceptionptr;
3383 classinfo *ivtec=loader_load_sysclass(NULL,utf_new_char("java/lang/reflect/InvocationTargetException"));
3384 java_objectheader* ivte=builtin_new(ivtec);
3385 asm_calljavafunction(class_resolvemethod(ivtec,utf_new_char("<init>"),utf_new_char("(Ljava/lang/Throwable;)V")),
3386 ivte,exceptionToWrap,0,0);
3387 if (exceptionptr!=NULL) panic("jni.c: error while creating InvocationTargetException wrapper");
3397 * These are local overrides for various environment variables in Emacs.
3398 * Please do not remove this and leave it at the end of the file, where
3399 * Emacs will automagically detect them.
3400 * ---------------------------------------------------------------------
3403 * indent-tabs-mode: t