1 /* jni.c - implementation of JNI 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 $Id: jni.c 676 2003-11-24 20:50:23Z twisti $
42 #include "toolbox/memory.h"
43 #include "nat/java_lang_Throwable.h"
46 /********************* accessing instance-fields **********************************/
48 u4 get_parametercount(methodinfo *m)
50 utf *descr = m->descriptor; /* method-descriptor */
51 char *utf_ptr = descr->text; /* current position in utf-text */
52 char *desc_end = utf_end(descr); /* points behind utf string */
53 int parametercount = 0;
58 /* determine number of parameters */
59 while (*utf_ptr != ')') {
60 get_type(&utf_ptr, desc_end, true);
64 return parametercount;
69 /* XXX it could be considered if we should do typechecking here in the future */
70 void fill_callblock(void *obj, utf *descr, jni_callblock blk[], va_list data, char ret)
72 char *utf__ptr = descr->text; /* current position in utf-text */
73 char **utf_ptr = &utf__ptr;
74 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;
98 while (**utf_ptr != ')') {
99 if (*utf_ptr >= desc_end)
100 panic("illegal method descriptor");
102 /* primitive types */
103 switch (utf_nextu2(utf_ptr)) {
108 blk[cnt].itemtype = TYPE_INT;
109 blk[cnt].item = (u8) va_arg(data, int);
113 blk[cnt].itemtype = TYPE_INT;
114 dummy = va_arg(data, u4);
115 /*printf("fill_callblock: pos:%d, value:%d\n",cnt,dummy);*/
116 blk[cnt].item = (u8) dummy;
120 blk[cnt].itemtype = TYPE_LNG;
121 blk[cnt].item = (u8) va_arg(data, jlong);
125 blk[cnt].itemtype = TYPE_FLT;
126 *((jfloat*) (&blk[cnt].item)) = ((jfloat) va_arg(data, jdouble));
130 blk[cnt].itemtype = TYPE_DBL;
131 *((jdouble*) (&blk[cnt].item)) = (jdouble) va_arg(data, jdouble);
135 panic("V not allowed as function parameter");
139 while (utf_nextu2(utf_ptr) != ';')
140 blk[cnt].itemtype = TYPE_ADR;
142 blk[cnt].item = (u8)(u4) va_arg(data, void*);
146 /* XXX need arrayclass change? no.*/
149 while ((ch = utf_nextu2(utf_ptr)) == '[')
151 while (utf_nextu2(utf_ptr) != ';') {}
154 ch = utf_nextu2(utf_ptr);
155 blk[cnt].itemtype = TYPE_ADR;
156 blk[cnt].item = (u8)(u4) va_arg(data, void*);
163 /*the standard doesn't say anything about return value checking, but it appears to be usefull*/
164 c = utf_nextu2(utf_ptr);
165 c = utf_nextu2(utf_ptr);
166 /*printf("%c %c\n",ret,c);*/
168 if (!((c == 'L') || (c == '[')))
169 log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
172 log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
177 jmethodID get_virtual(jobject obj,jmethodID methodID) {
178 if (obj->vftbl->class==methodID->class) return methodID;
179 return class_resolvemethod (obj->vftbl->class, methodID->name, methodID->descriptor);
182 jmethodID get_nonvirtual(jclass clazz,jmethodID methodID) {
183 if (clazz==methodID->class) return methodID;
184 return class_resolvemethod (clazz, methodID->name, methodID->descriptor);
187 jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
194 log_text("JNI-Call: CallObjectMethodV");
195 utf_display(methodID->name);
196 utf_display(methodID->descriptor);
197 printf("\nParmaeter count: %d\n",argcount);
198 utf_display(obj->vftbl->class->name);
203 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
206 argcount=get_parametercount(methodID);
208 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
209 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
210 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
214 if (obj && (! builtin_instanceof(obj,methodID->class))) {
215 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
220 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
221 log_text("Too many arguments. CallObjectMethod does not support that");
225 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
227 fill_callblock(obj,methodID->descriptor,blk,args,'O');
229 /* printf("parameter: obj: %p",blk[0].item); */
230 ret=asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
231 MFREE(blk,jni_callblock,argcount+1);
232 /* printf("(CallObjectMethodV)-->%p\n",ret); */
238 core function for integer class methods (bool, byte, short, integer)
239 This is basically needed for i386
241 jint callIntegerMethod(jobject obj, jmethodID methodID, char retType, va_list args)
247 /* printf("%p, %c\n",retType,methodID,retType);*/
250 log_text("JNI-Call: CallObjectMethodV");
251 utf_display(methodID->name);
252 utf_display(methodID->descriptor);
253 printf("\nParmaeter count: %d\n",argcount);
254 utf_display(obj->vftbl->class->name);
258 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
262 argcount = get_parametercount(methodID);
264 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
265 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
266 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
270 if (obj && (! builtin_instanceof(obj,methodID->class))) {
271 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
277 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
278 log_text("Too many arguments. CallObjectMethod does not support that");
282 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
284 fill_callblock(obj, methodID->descriptor, blk, args, retType);
286 /* printf("parameter: obj: %p",blk[0].item); */
287 ret = (jint) asm_calljavafunction2(methodID,
289 (argcount + 1) * sizeof(jni_callblock),
292 MFREE(blk, jni_callblock, argcount + 1);
293 /* printf("(CallObjectMethodV)-->%p\n",ret); */
299 /*core function for long class functions*/
300 jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
307 log_text("JNI-Call: CallObjectMethodV");
308 utf_display(methodID->name);
309 utf_display(methodID->descriptor);
310 printf("\nParmaeter count: %d\n",argcount);
311 utf_display(obj->vftbl->class->name);
315 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
318 argcount=get_parametercount(methodID);
320 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
321 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
322 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
326 if (obj && (! builtin_instanceof(obj,methodID->class))) {
327 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
333 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
334 log_text("Too many arguments. CallObjectMethod does not support that");
338 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
340 fill_callblock(obj,methodID->descriptor,blk,args,'L');
342 /* printf("parameter: obj: %p",blk[0].item); */
343 ret=asm_calljavafunction2long(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
344 MFREE(blk,jni_callblock,argcount+1);
345 /* printf("(CallObjectMethodV)-->%p\n",ret); */
351 /*core function for float class methods (float,double)*/
352 jdouble callFloatMethod (jobject obj, jmethodID methodID, va_list args,char retType)
354 int argcount=get_parametercount(methodID);
359 log_text("JNI-Call: CallObjectMethodV");
360 utf_display(methodID->name);
361 utf_display(methodID->descriptor);
362 printf("\nParmaeter count: %d\n",argcount);
363 utf_display(obj->vftbl->class->name);
367 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
368 log_text("Too many arguments. CallObjectMethod does not support that");
372 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
374 fill_callblock(obj,methodID->descriptor,blk,args,retType);
376 /* printf("parameter: obj: %p",blk[0].item); */
377 ret=asm_calljavafunction2double(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
378 MFREE(blk,jni_callblock,argcount+1);
379 /* printf("(CallObjectMethodV)-->%p\n",ret); */
385 /*************************** function: jclass_findfield ****************************
387 searches for field with specified name and type in a 'classinfo'-structur
388 if no such field is found NULL is returned
390 ************************************************************************************/
392 fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
395 /* printf(" FieldCount: %d\n",c->fieldscount);
396 utf_display(c->name); */
397 for (i = 0; i < c->fieldscount; i++) {
398 /* utf_display(c->fields[i].name);
400 utf_display(c->fields[i].descriptor);
402 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
403 return &(c->fields[i]);
406 if (c->super) return jclass_findfield(c->super,name,desc);
411 /********************* returns version of native method interface *****************/
413 jint GetVersion (JNIEnv* env)
418 /****************** loads a class from a buffer of raw class data *****************/
420 jclass DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len)
424 /* change suck-mode, so subsequent class_load will read from memory-buffer */
425 classload_buffer( (u1*) buf,len);
427 clazz = loader_load(utf_new_char ((char *) name));
429 /* restore old suck-mode */
430 classload_buffer(NULL,0);
436 /*************** loads locally defined class with the specified name **************/
438 jclass FindClass (JNIEnv* env, const char *name)
442 /* if (strcmp(name,"[B")==0) {
443 c = loader_load(utf_new_char("The_Array_Class"));
446 c = loader_load(utf_new_char_classname ((char *) name));
448 if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
454 /***********************************************************************************
456 converts java.lang.reflect.Method or
457 java.lang.reflect.Constructor object to a method ID
459 **********************************************************************************/
461 jmethodID FromReflectedMethod(JNIEnv* env, jobject method)
463 /* log_text("JNI-Call: FromReflectedMethod"); */
469 /*************** return superclass of the class represented by sub ****************/
471 jclass GetSuperclass(JNIEnv* env, jclass sub)
475 c = ((classinfo*) sub)->super;
479 use_class_as_object(c);
485 /*********************** check whether sub can be cast to sup ********************/
487 jboolean IsAssignableForm(JNIEnv* env, jclass sub, jclass sup)
489 return builtin_isanysubclass(sub, sup);
493 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
495 jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
497 /* log_text("JNI-Call: ToReflectedField"); */
503 /***************** throw java.lang.Throwable object ******************************/
505 jint Throw(JNIEnv* env, jthrowable obj)
507 exceptionptr = (java_objectheader*) obj;
513 /***********************************************************************************
515 create exception object from the class clazz with the
516 specified message and cause it to be thrown
518 **********************************************************************************/
521 jint ThrowNew (JNIEnv* env, jclass clazz, const char *msg)
523 java_lang_Throwable *o;
525 /* instantiate exception object */
526 o = (java_lang_Throwable *) native_new_and_init ((classinfo*) clazz);
530 o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
532 exceptionptr = (java_objectheader*) o;
536 /************************* check if exception occured *****************************/
538 jthrowable ExceptionOccurred (JNIEnv* env)
540 return (jthrowable) exceptionptr;
543 /********** print exception and a backtrace of the stack (for debugging) **********/
545 void ExceptionDescribe (JNIEnv* env)
547 utf_display(exceptionptr->vftbl->class->name);
553 /******************* clear any exception currently being thrown *******************/
555 void ExceptionClear (JNIEnv* env)
561 /********** raises a fatal error and does not expect the VM to recover ************/
563 void FatalError (JNIEnv* env, const char *msg)
568 /******************* creates a new local reference frame **************************/
570 jint PushLocalFrame(JNIEnv* env, jint capacity)
577 /**************** Pops off the current local reference frame **********************/
579 jobject PopLocalFrame(JNIEnv* env, jobject result)
587 /** Creates a new global reference to the object referred to by the obj argument **/
589 jobject NewGlobalRef(JNIEnv* env, jobject lobj)
591 heap_addreference((void**) &lobj);
596 /************* Deletes the global reference pointed to by globalRef **************/
598 void DeleteGlobalRef (JNIEnv* env, jobject gref)
604 /*************** Deletes the local reference pointed to by localRef ***************/
606 void DeleteLocalRef (JNIEnv* env, jobject localRef)
611 /********** Tests whether two references refer to the same Java object ************/
613 jboolean IsSameObject (JNIEnv* env, jobject obj1, jobject obj2)
618 /***** Creates a new local reference that refers to the same object as ref *******/
620 jobject NewLocalRef (JNIEnv* env, jobject ref)
625 /***********************************************************************************
627 Ensures that at least a given number of local references can
628 be created in the current thread
630 **********************************************************************************/
632 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
634 return 0; /* return 0 on success */
638 /********* Allocates a new Java object without invoking a constructor *************/
640 jobject AllocObject (JNIEnv* env, jclass clazz)
642 java_objectheader *o = builtin_new(clazz);
647 /***********************************************************************************
649 Constructs a new Java object
650 arguments that are to be passed to the constructor are placed after methodID
652 ***********************************************************************************/
654 jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
656 java_objectheader *o;
658 int argcount=get_parametercount(methodID);
662 /* log_text("JNI-Call: NewObject"); */
665 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
666 log_text("Too many arguments. NewObject does not support that");
671 o = builtin_new (clazz); /* create object */
675 va_start(vaargs,methodID);
676 for (i=0;i<argcount;i++) {
677 args[i]=va_arg(vaargs,void*);
680 exceptionptr=asm_calljavamethod(methodID,o,args[0],args[1],args[2]);
686 /***********************************************************************************
688 Constructs a new Java object
689 arguments that are to be passed to the constructor are placed in va_list args
691 ***********************************************************************************/
693 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
695 /* log_text("JNI-Call: NewObjectV"); */
701 /***********************************************************************************
703 Constructs a new Java object
704 arguments that are to be passed to the constructor are placed in
705 args array of jvalues
707 ***********************************************************************************/
709 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
711 /* log_text("JNI-Call: NewObjectA"); */
717 /************************ returns the class of an object **************************/
719 jclass GetObjectClass(JNIEnv* env, jobject obj)
721 classinfo *c = obj->vftbl->class;
722 use_class_as_object(c);
728 /************* tests whether an object is an instance of a class ******************/
730 jboolean IsInstanceOf(JNIEnv* env, jobject obj, jclass clazz)
732 return builtin_instanceof(obj,clazz);
736 /***************** converts a java.lang.reflect.Field to a field ID ***************/
738 jfieldID FromReflectedField(JNIEnv* env, jobject field)
740 log_text("JNI-Call: FromReflectedField");
746 /**********************************************************************************
748 converts a method ID to a java.lang.reflect.Method or
749 java.lang.reflect.Constructor object
751 **********************************************************************************/
753 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
755 log_text("JNI-Call: ToReflectedMethod");
761 /**************** returns the method ID for an instance method ********************/
763 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
767 m = class_resolvemethod (
769 utf_new_char ((char*) name),
770 utf_new_char ((char*) sig)
773 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
779 /******************** JNI-functions for calling instance methods ******************/
781 jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
786 /* log_text("JNI-Call: CallObjectMethod");*/
788 va_start(vaargs, methodID);
789 ret = callObjectMethod(obj, methodID, vaargs);
796 jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
798 return callObjectMethod(obj,methodID,args);
802 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
804 log_text("JNI-Call: CallObjectMethodA");
812 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
817 /* log_text("JNI-Call: CallBooleanMethod");*/
819 va_start(vaargs,methodID);
820 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',vaargs);
826 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
828 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',args);
832 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
834 log_text("JNI-Call: CallBooleanMethodA");
839 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
844 /* log_text("JNI-Call: CallVyteMethod");*/
846 va_start(vaargs,methodID);
847 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'B',vaargs);
853 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
855 /* log_text("JNI-Call: CallByteMethodV");*/
856 return callIntegerMethod(obj,methodID,'B',args);
860 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
862 log_text("JNI-Call: CallByteMethodA");
868 jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
873 /* log_text("JNI-Call: CallCharMethod");*/
875 va_start(vaargs,methodID);
876 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'C', vaargs);
883 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
885 /* log_text("JNI-Call: CallCharMethodV");*/
886 return callIntegerMethod(obj,get_virtual(obj,methodID),'C',args);
890 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
892 log_text("JNI-Call: CallCharMethodA");
898 jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
903 /* log_text("JNI-Call: CallShortMethod");*/
905 va_start(vaargs, methodID);
906 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'S', vaargs);
913 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
915 return callIntegerMethod(obj, get_virtual(obj, methodID), 'S', args);
919 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
921 log_text("JNI-Call: CallShortMethodA");
928 jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
933 va_start(vaargs,methodID);
934 ret = callIntegerMethod(obj, get_virtual(obj, methodID), 'I', vaargs);
941 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
943 return callIntegerMethod(obj, get_virtual(obj, methodID), 'I', args);
947 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
949 log_text("JNI-Call: CallIntMethodA");
956 jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
958 log_text("JNI-Call: CallLongMethod");
964 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
966 log_text("JNI-Call: CallLongMethodV");
972 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
974 log_text("JNI-Call: CallLongMethodA");
981 jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
986 /* log_text("JNI-Call: CallFloatMethod");*/
988 va_start(vaargs,methodID);
989 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'F');
996 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
998 log_text("JNI-Call: CallFloatMethodV");
999 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'F');
1003 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1005 log_text("JNI-Call: CallFloatMethodA");
1012 jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1017 /* log_text("JNI-Call: CallDoubleMethod");*/
1019 va_start(vaargs,methodID);
1020 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, 'D');
1027 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1029 log_text("JNI-Call: CallDoubleMethodV");
1030 return callFloatMethod(obj, get_virtual(obj, methodID), args, 'D');
1034 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1036 log_text("JNI-Call: CallDoubleMethodA");
1042 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1046 /* log_text("JNI-Call: CallVoidMethod");*/
1048 va_start(vaargs,methodID);
1049 (void) callIntegerMethod(obj, get_virtual(obj, methodID), 'V', vaargs);
1054 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1056 log_text("JNI-Call: CallVoidMethodV");
1057 (void)callIntegerMethod(obj,get_virtual(obj,methodID),'V',args);
1061 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1063 log_text("JNI-Call: CallVoidMethodA");
1068 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1070 log_text("JNI-Call: CallNonvirtualObjectMethod");
1076 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1078 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1084 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1086 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1093 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1098 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1100 va_start(vaargs,methodID);
1101 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',vaargs);
1108 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1110 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1111 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',args);
1115 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1117 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1124 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1129 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1131 va_start(vaargs,methodID);
1132 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',vaargs);
1138 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1140 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1141 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',args);
1146 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1148 log_text("JNI-Call: CallNonvirtualByteMethodA");
1155 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1160 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1162 va_start(vaargs,methodID);
1163 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',vaargs);
1169 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1171 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1172 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',args);
1176 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1178 log_text("JNI-Call: CallNonvirtualCharMethodA");
1185 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1190 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1192 va_start(vaargs,methodID);
1193 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',vaargs);
1199 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1201 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1202 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',args);
1206 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1208 log_text("JNI-Call: CallNonvirtualShortMethodA");
1215 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1221 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1223 va_start(vaargs,methodID);
1224 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',vaargs);
1230 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1232 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1233 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',args);
1237 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1239 log_text("JNI-Call: CallNonvirtualIntMethodA");
1246 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1248 log_text("JNI-Call: CallNonvirtualLongMethod");
1254 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1256 log_text("JNI-Call: CallNonvirtualLongMethodV");
1262 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1264 log_text("JNI-Call: CallNonvirtualLongMethodA");
1271 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1276 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1279 va_start(vaargs,methodID);
1280 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'F');
1287 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1289 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1290 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'F');
1294 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1296 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1303 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1307 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1309 va_start(vaargs,methodID);
1310 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'D');
1317 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1319 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1320 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'D');
1324 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1326 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1333 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1337 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1339 va_start(vaargs,methodID);
1340 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',vaargs);
1346 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1348 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1350 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',args);
1355 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1357 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1360 /************************* JNI-functions for accessing fields ************************/
1362 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1366 /* log_text("========================= searching for:");
1369 f = jclass_findfield(clazz,
1370 utf_new_char ((char*) name),
1371 utf_new_char ((char*) sig)
1375 /* utf_display(clazz->name);
1378 exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1383 /*************************** retrieve fieldid, abort on error ************************/
1385 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
1387 jfieldID id = GetFieldID(env, clazz, name, sig);
1391 utf_display(clazz->name);
1392 log_text("\nfield:");
1397 panic("setfield_critical failed");
1402 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1404 return getField(obj,jobject,fieldID);
1407 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1409 return getField(obj,jboolean,fieldID);
1413 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1415 return getField(obj,jbyte,fieldID);
1419 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1421 return getField(obj,jchar,fieldID);
1425 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1427 return getField(obj,jshort,fieldID);
1431 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1433 return getField(obj,jint,fieldID);
1437 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1439 return getField(obj,jlong,fieldID);
1443 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1445 return getField(obj,jfloat,fieldID);
1449 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1451 return getField(obj,jdouble,fieldID);
1454 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1456 setField(obj,jobject,fieldID,val);
1460 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1462 setField(obj,jboolean,fieldID,val);
1466 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1468 setField(obj,jbyte,fieldID,val);
1472 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1474 setField(obj,jchar,fieldID,val);
1478 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
1480 setField(obj,jshort,fieldID,val);
1484 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
1486 setField(obj,jint,fieldID,val);
1490 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
1492 setField(obj,jlong,fieldID,val);
1496 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
1498 setField(obj,jfloat,fieldID,val);
1502 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
1504 setField(obj,jdouble,fieldID,val);
1507 /**************** JNI-functions for calling static methods **********************/
1509 jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1513 m = class_resolvemethod (
1515 utf_new_char ((char*) name),
1516 utf_new_char ((char*) sig)
1519 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1524 jobject CallStaticObjectMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1526 log_text("JNI-Call: CallStaticObjectMethod");
1532 jobject CallStaticObjectMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1534 log_text("JNI-Call: CallStaticObjectMethodV");
1540 jobject CallStaticObjectMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1542 log_text("JNI-Call: CallStaticObjectMethodA");
1548 jboolean CallStaticBooleanMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1553 /* log_text("JNI-Call: CallStaticBooleanMethod");*/
1555 va_start(vaargs,methodID);
1556 ret = (jboolean)callIntegerMethod(0,methodID,'Z',vaargs);
1563 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1565 return (jboolean) callIntegerMethod(0, methodID, 'Z', args);
1568 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1570 log_text("JNI-Call: CallStaticBooleanMethodA");
1576 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1581 /* log_text("JNI-Call: CallStaticByteMethod");*/
1583 va_start(vaargs, methodID);
1584 ret = (jbyte) callIntegerMethod(0, methodID, 'B', vaargs);
1591 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1593 return (jbyte) callIntegerMethod(0, methodID, 'B', args);
1597 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1599 log_text("JNI-Call: CallStaticByteMethodA");
1605 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1610 /* log_text("JNI-Call: CallStaticByteMethod");*/
1612 va_start(vaargs, methodID);
1613 ret = (jchar) callIntegerMethod(0, methodID, 'C', vaargs);
1620 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1622 return (jchar) callIntegerMethod(0, methodID, 'C', args);
1626 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1628 log_text("JNI-Call: CallStaticCharMethodA");
1635 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1640 /* log_text("JNI-Call: CallStaticByteMethod");*/
1642 va_start(vaargs,methodID);
1643 ret = (jshort) callIntegerMethod(0, methodID, 'S', vaargs);
1650 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1652 /*log_text("JNI-Call: CallStaticShortMethodV");*/
1653 return (jshort) callIntegerMethod(0, methodID, 'S', args);
1657 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1659 log_text("JNI-Call: CallStaticShortMethodA");
1666 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1671 /* log_text("JNI-Call: CallStaticIntMethod");*/
1673 va_start(vaargs, methodID);
1674 ret = callIntegerMethod(0, methodID, 'I', vaargs);
1681 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1683 log_text("JNI-Call: CallStaticIntMethodV");
1685 return callIntegerMethod(0, methodID, 'I', args);
1689 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1691 log_text("JNI-Call: CallStaticIntMethodA");
1698 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1703 /* log_text("JNI-Call: CallStaticLongMethod");*/
1705 va_start(vaargs, methodID);
1706 ret = callLongMethod(0, methodID, vaargs);
1713 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1715 log_text("JNI-Call: CallStaticLongMethodV");
1717 return callLongMethod(0,methodID,args);
1721 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1723 log_text("JNI-Call: CallStaticLongMethodA");
1730 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1735 /* log_text("JNI-Call: CallStaticLongMethod");*/
1737 va_start(vaargs, methodID);
1738 ret = callFloatMethod(0, methodID, vaargs, 'F');
1745 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1748 return callFloatMethod(0, methodID, args, 'F');
1753 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1755 log_text("JNI-Call: CallStaticFloatMethodA");
1762 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1767 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
1769 va_start(vaargs,methodID);
1770 ret = callFloatMethod(0, methodID, vaargs, 'D');
1777 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1779 log_text("JNI-Call: CallStaticDoubleMethodV");
1781 return callFloatMethod(0, methodID, args, 'D');
1785 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1787 log_text("JNI-Call: CallStaticDoubleMethodA");
1793 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
1797 /* log_text("JNI-Call: CallStaticVoidMethod");*/
1799 va_start(vaargs, methodID);
1800 (void) callIntegerMethod(0, methodID, 'V', vaargs);
1805 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
1807 log_text("JNI-Call: CallStaticVoidMethodV");
1808 (void)callIntegerMethod(0, methodID, 'V', args);
1812 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
1814 log_text("JNI-Call: CallStaticVoidMethodA");
1818 /****************** JNI-functions for accessing static fields ********************/
1820 jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1824 f = jclass_findfield(clazz,
1825 utf_new_char ((char*) name),
1826 utf_new_char ((char*) sig)
1829 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1835 jobject GetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1838 return fieldID->value.a;
1842 jboolean GetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1845 return fieldID->value.i;
1849 jbyte GetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1852 return fieldID->value.i;
1856 jchar GetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1859 return fieldID->value.i;
1863 jshort GetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1866 return fieldID->value.i;
1870 jint GetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1873 return fieldID->value.i;
1877 jlong GetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1880 return fieldID->value.l;
1884 jfloat GetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1887 return fieldID->value.f;
1891 jdouble GetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1894 return fieldID->value.d;
1899 void SetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
1902 fieldID->value.a = value;
1906 void SetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
1909 fieldID->value.i = value;
1913 void SetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
1916 fieldID->value.i = value;
1920 void SetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
1923 fieldID->value.i = value;
1927 void SetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
1930 fieldID->value.i = value;
1934 void SetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
1937 fieldID->value.i = value;
1941 void SetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
1944 fieldID->value.l = value;
1948 void SetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
1951 fieldID->value.f = value;
1955 void SetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
1958 fieldID->value.d = value;
1962 /***** create new java.lang.String object from an array of Unicode characters ****/
1964 jstring NewString (JNIEnv *env, const jchar *buf, jsize len)
1967 java_lang_String *s;
1970 s = (java_lang_String*) builtin_new (class_java_lang_String);
1971 a = builtin_newarray_char (len);
1973 /* javastring or characterarray could not be created */
1974 if ( (!a) || (!s) ) return NULL;
1977 for (i=0; i<len; i++) a->data[i] = buf[i];
1986 static char emptyString[]="";
1988 /******************* returns the length of a Java string ***************************/
1990 jsize GetStringLength (JNIEnv *env, jstring str)
1992 return ((java_lang_String*) str)->count;
1996 /******************** convertes javastring to u2-array ****************************/
1998 u2 *javastring_tou2 (jstring so)
2000 java_lang_String *s = (java_lang_String*) so;
2005 if (!s) return NULL;
2008 if (!a) return NULL;
2010 /* allocate memory */
2011 stringbuffer = MNEW( u2 , s->count + 1 );
2014 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
2016 /* terminate string */
2017 stringbuffer[i] = '\0';
2019 return stringbuffer;
2022 /********* returns a pointer to an array of Unicode characters of the string *******/
2024 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
2026 jchar *jc=javastring_tou2(str);
2029 if (isCopy) *isCopy=JNI_TRUE;
2032 if (isCopy) *isCopy=JNI_TRUE;
2036 /**************** native code no longer needs access to chars **********************/
2038 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
2040 if (chars==emptyString) return;
2041 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
2044 /************ create new java.lang.String object from utf8-characterarray **********/
2046 jstring NewStringUTF (JNIEnv *env, const char *utf)
2048 /* log_text("NewStringUTF called");*/
2049 return javastring_new(utf_new_char(utf));
2052 /****************** returns the utf8 length in bytes of a string *******************/
2054 jsize GetStringUTFLength (JNIEnv *env, jstring string)
2056 java_lang_String *s = (java_lang_String*) string;
2058 return (jsize) u2_utflength(s->value->data, s->count);
2061 /************ converts a Javastring to an array of UTF-8 characters ****************/
2063 const char* GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy)
2066 if (verbose) log_text("GetStringUTFChars:");
2068 u=javastring_toutf((java_lang_String*) string,false);
2069 if (isCopy) *isCopy=JNI_FALSE;
2077 /***************** native code no longer needs access to utf ***********************/
2079 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2081 /*we don't release utf chars right now, perhaps that should be done later. Since there is always one reference
2082 the garbage collector will never get them*/
2084 log_text("JNI-Call: ReleaseStringUTFChars");
2085 utf_display(utf_new_char(chars));
2089 /************************** array operations ***************************************/
2091 jsize GetArrayLength (JNIEnv *env, jarray array)
2096 jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
2098 java_objectarray *j = builtin_anewarray (len, clazz);
2099 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2103 jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
2107 if (index<array->header.size)
2108 j = array->data[index];
2110 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2115 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
2117 if (index>=array->header.size)
2118 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2121 /* check if the class of value is a subclass of the element class of the array */
2123 if (!builtin_canstore((java_objectarray*)array,(java_objectheader*)val))
2124 exceptionptr = proto_java_lang_ArrayStoreException;
2126 array->data[index] = val;
2132 jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
2134 java_booleanarray *j = builtin_newarray_boolean(len);
2135 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2140 jbyteArray NewByteArray (JNIEnv *env, jsize len)
2142 java_bytearray *j = builtin_newarray_byte(len);
2143 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2148 jcharArray NewCharArray (JNIEnv *env, jsize len)
2150 java_chararray *j = builtin_newarray_char(len);
2151 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2156 jshortArray NewShortArray (JNIEnv *env, jsize len)
2158 java_shortarray *j = builtin_newarray_short(len);
2159 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2164 jintArray NewIntArray (JNIEnv *env, jsize len)
2166 java_intarray *j = builtin_newarray_int(len);
2167 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2172 jlongArray NewLongArray (JNIEnv *env, jsize len)
2174 java_longarray *j = builtin_newarray_long(len);
2175 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2180 jfloatArray NewFloatArray (JNIEnv *env, jsize len)
2182 java_floatarray *j = builtin_newarray_float(len);
2183 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2188 jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
2190 java_doublearray *j = builtin_newarray_double(len);
2191 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2196 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2198 if (isCopy) *isCopy = JNI_FALSE;
2203 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2205 if (isCopy) *isCopy = JNI_FALSE;
2210 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
2212 if (isCopy) *isCopy = JNI_FALSE;
2217 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
2219 if (isCopy) *isCopy = JNI_FALSE;
2224 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
2226 if (isCopy) *isCopy = JNI_FALSE;
2231 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
2233 if (isCopy) *isCopy = JNI_FALSE;
2238 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
2240 if (isCopy) *isCopy = JNI_FALSE;
2245 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
2247 if (isCopy) *isCopy = JNI_FALSE;
2253 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
2259 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
2265 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
2271 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
2277 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
2283 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
2289 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
2295 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
2300 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2302 if (start<0 || len<0 || start+len>array->header.size)
2303 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2305 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2309 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2311 if (start<0 || len<0 || start+len>array->header.size)
2312 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2314 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2318 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2320 if (start<0 || len<0 || start+len>array->header.size)
2321 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2323 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2327 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2329 if (start<0 || len<0 || start+len>array->header.size)
2330 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2332 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2336 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2338 if (start<0 || len<0 || start+len>array->header.size)
2339 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2341 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2345 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2347 if (start<0 || len<0 || start+len>array->header.size)
2348 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2350 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2354 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2356 if (start<0 || len<0 || start+len>array->header.size)
2357 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2359 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2363 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2365 if (start<0 || len<0 || start+len>array->header.size)
2366 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2368 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2372 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2374 if (start<0 || len<0 || start+len>array->header.size)
2375 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2377 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2381 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2383 if (start<0 || len<0 || start+len>array->header.size)
2384 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2386 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2390 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2392 if (start<0 || len<0 || start+len>array->header.size)
2393 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2395 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2400 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2402 if (start<0 || len<0 || start+len>array->header.size)
2403 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2405 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2409 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2411 if (start<0 || len<0 || start+len>array->header.size)
2412 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2414 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2418 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2420 if (start<0 || len<0 || start+len>array->header.size)
2421 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2423 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2427 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2429 if (start<0 || len<0 || start+len>array->header.size)
2430 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2432 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2436 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2438 if (start<0 || len<0 || start+len>array->header.size)
2439 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2441 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2444 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
2446 log_text("JNI-Call: RegisterNatives");
2451 jint UnregisterNatives (JNIEnv* env, jclass clazz)
2453 log_text("JNI-Call: UnregisterNatives");
2457 /******************************* monitor operations ********************************/
2459 jint MonitorEnter (JNIEnv* env, jobject obj)
2461 builtin_monitorenter(obj);
2466 jint MonitorExit (JNIEnv* env, jobject obj)
2468 builtin_monitorexit(obj);
2473 /************************************* JavaVM interface ****************************/
2475 #error CPP mode not supported yet
2477 jint GetJavaVM (JNIEnv* env, JavaVM **vm)
2479 log_text("JNI-Call: GetJavaVM");
2483 #endif /*__cplusplus*/
2485 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
2487 log_text("JNI-Call: GetStringRegion");
2491 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
2493 log_text("JNI-Call: GetStringUTFRegion");
2497 /****************** obtain direct pointer to array elements ***********************/
2499 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
2501 java_objectheader *s = (java_objectheader*) array;
2502 arraydescriptor *desc = s->vftbl->arraydesc;
2504 if (!desc) return NULL;
2506 return ((u1*)s) + desc->dataoffset;
2510 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
2512 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
2517 /********* returns a pointer to an array of Unicode characters of the string *******/
2519 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
2521 log_text("JNI-Call: GetStringCritical");
2523 return GetStringChars(env,string,isCopy);
2526 /**************** native code no longer needs access to chars **********************/
2528 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
2530 log_text("JNI-Call: ReleaseStringCritical");
2532 ReleaseStringChars(env,string,cstring);
2536 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
2538 log_text("JNI-Call: NewWeakGlobalRef");
2544 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
2546 log_text("JNI-Call: DeleteWeakGlobalRef");
2552 /******************************* check for pending exception ***********************/
2555 jboolean ExceptionCheck(JNIEnv* env)
2557 log_text("JNI-Call: ExceptionCheck");
2559 return exceptionptr ? JNI_TRUE : JNI_FALSE;
2567 jint DestroyJavaVM(JavaVM *vm)
2569 log_text("DestroyJavaVM called");
2575 jint AttachCurrentThread(JavaVM *vm, void **par1, void *par2)
2577 log_text("AttachCurrentThread called");
2583 jint DetachCurrentThread(JavaVM *vm)
2585 log_text("DetachCurrentThread called");
2591 jint GetEnv(JavaVM *vm, void **environment, jint jniversion)
2593 *environment = &env;
2599 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
2601 log_text("AttachCurrentThreadAsDaemon called");
2616 /********************************* JNI invocation table ******************************/
2618 struct _JavaVM javaVMTable={
2623 &AttachCurrentThread,
2624 &DetachCurrentThread,
2626 &AttachCurrentThreadAsDaemon
2629 JavaVM javaVM = &javaVMTable;
2632 /********************************* JNI function table ******************************/
2634 struct JNI_Table envTable = {
2642 &FromReflectedMethod,
2643 &FromReflectedField,
2661 &EnsureLocalCapacity,
2673 &CallBooleanMethodV,
2674 &CallBooleanMethodA,
2699 &CallNonvirtualObjectMethod,
2700 &CallNonvirtualObjectMethodV,
2701 &CallNonvirtualObjectMethodA,
2702 &CallNonvirtualBooleanMethod,
2703 &CallNonvirtualBooleanMethodV,
2704 &CallNonvirtualBooleanMethodA,
2705 &CallNonvirtualByteMethod,
2706 &CallNonvirtualByteMethodV,
2707 &CallNonvirtualByteMethodA,
2708 &CallNonvirtualCharMethod,
2709 &CallNonvirtualCharMethodV,
2710 &CallNonvirtualCharMethodA,
2711 &CallNonvirtualShortMethod,
2712 &CallNonvirtualShortMethodV,
2713 &CallNonvirtualShortMethodA,
2714 &CallNonvirtualIntMethod,
2715 &CallNonvirtualIntMethodV,
2716 &CallNonvirtualIntMethodA,
2717 &CallNonvirtualLongMethod,
2718 &CallNonvirtualLongMethodV,
2719 &CallNonvirtualLongMethodA,
2720 &CallNonvirtualFloatMethod,
2721 &CallNonvirtualFloatMethodV,
2722 &CallNonvirtualFloatMethodA,
2723 &CallNonvirtualDoubleMethod,
2724 &CallNonvirtualDoubleMethodV,
2725 &CallNonvirtualDoubleMethodA,
2726 &CallNonvirtualVoidMethod,
2727 &CallNonvirtualVoidMethodV,
2728 &CallNonvirtualVoidMethodA,
2749 &CallStaticObjectMethod,
2750 &CallStaticObjectMethodV,
2751 &CallStaticObjectMethodA,
2752 &CallStaticBooleanMethod,
2753 &CallStaticBooleanMethodV,
2754 &CallStaticBooleanMethodA,
2755 &CallStaticByteMethod,
2756 &CallStaticByteMethodV,
2757 &CallStaticByteMethodA,
2758 &CallStaticCharMethod,
2759 &CallStaticCharMethodV,
2760 &CallStaticCharMethodA,
2761 &CallStaticShortMethod,
2762 &CallStaticShortMethodV,
2763 &CallStaticShortMethodA,
2764 &CallStaticIntMethod,
2765 &CallStaticIntMethodV,
2766 &CallStaticIntMethodA,
2767 &CallStaticLongMethod,
2768 &CallStaticLongMethodV,
2769 &CallStaticLongMethodA,
2770 &CallStaticFloatMethod,
2771 &CallStaticFloatMethodV,
2772 &CallStaticFloatMethodA,
2773 &CallStaticDoubleMethod,
2774 &CallStaticDoubleMethodV,
2775 &CallStaticDoubleMethodA,
2776 &CallStaticVoidMethod,
2777 &CallStaticVoidMethodV,
2778 &CallStaticVoidMethodA,
2780 &GetStaticObjectField,
2781 &GetStaticBooleanField,
2782 &GetStaticByteField,
2783 &GetStaticCharField,
2784 &GetStaticShortField,
2786 &GetStaticLongField,
2787 &GetStaticFloatField,
2788 &GetStaticDoubleField,
2789 &SetStaticObjectField,
2790 &SetStaticBooleanField,
2791 &SetStaticByteField,
2792 &SetStaticCharField,
2793 &SetStaticShortField,
2795 &SetStaticLongField,
2796 &SetStaticFloatField,
2797 &SetStaticDoubleField,
2801 &ReleaseStringChars,
2803 &GetStringUTFLength,
2805 &ReleaseStringUTFChars,
2808 &GetObjectArrayElement,
2809 &SetObjectArrayElement,
2818 &GetBooleanArrayElements,
2819 &GetByteArrayElements,
2820 &GetCharArrayElements,
2821 &GetShortArrayElements,
2822 &GetIntArrayElements,
2823 &GetLongArrayElements,
2824 &GetFloatArrayElements,
2825 &GetDoubleArrayElements,
2826 &ReleaseBooleanArrayElements,
2827 &ReleaseByteArrayElements,
2828 &ReleaseCharArrayElements,
2829 &ReleaseShortArrayElements,
2830 &ReleaseIntArrayElements,
2831 &ReleaseLongArrayElements,
2832 &ReleaseFloatArrayElements,
2833 &ReleaseDoubleArrayElements,
2834 &GetBooleanArrayRegion,
2835 &GetByteArrayRegion,
2836 &GetCharArrayRegion,
2837 &GetShortArrayRegion,
2839 &GetLongArrayRegion,
2840 &GetFloatArrayRegion,
2841 &GetDoubleArrayRegion,
2842 &SetBooleanArrayRegion,
2843 &SetByteArrayRegion,
2844 &SetCharArrayRegion,
2845 &SetShortArrayRegion,
2847 &SetLongArrayRegion,
2848 &SetFloatArrayRegion,
2849 &SetDoubleArrayRegion,
2856 &GetStringUTFRegion,
2857 &GetPrimitiveArrayCritical,
2858 &ReleasePrimitiveArrayCritical,
2860 &ReleaseStringCritical,
2862 &DeleteWeakGlobalRef,
2867 JNIEnv env = &envTable;
2871 * These are local overrides for various environment variables in Emacs.
2872 * Please do not remove this and leave it at the end of the file, where
2873 * Emacs will automagically detect them.
2874 * ---------------------------------------------------------------------
2877 * indent-tabs-mode: t