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 669 2003-11-23 14:04:20Z edwin $
35 #include "toolbox/memory.h"
38 #define JNI_VERSION 0x00010002
42 /********************* accessing instance-fields **********************************/
44 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
45 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
46 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
50 u4 get_parametercount(methodinfo *m)
52 utf *descr = m->descriptor; /* method-descriptor */
53 char *utf_ptr = descr->text; /* current position in utf-text */
54 char *desc_end = utf_end(descr); /* points behind utf string */
55 java_objectarray* result;
56 int parametercount = 0;
62 /* determine number of parameters */
63 while ( *utf_ptr != ')' ) {
64 get_type(&utf_ptr,desc_end,true);
68 return parametercount;
73 void fill_callblock(void *obj,utf *descr,jni_callblock blk[], va_list data, char ret) {
74 char *utf__ptr = descr->text; /* current position in utf-text */
75 char **utf_ptr = &utf__ptr;
76 char *desc_end = utf_end(descr); /* points behind utf string */
85 log_text("fill_callblock");
92 /* determine number of parameters */
94 blk[0].itemtype=TYPE_ADR;
95 blk[0].item=(u8)(u4)obj;
98 while ( **utf_ptr != ')' ) {
99 if (*utf_ptr>=desc_end)
100 panic("illegal method descriptor");
102 switch (utf_nextu2(utf_ptr)) {
103 /* primitive types */
108 blk[cnt].itemtype=TYPE_INT;
109 blk[cnt].item=(u8) va_arg(data,int);
112 blk[cnt].itemtype=TYPE_INT;
113 dummy=va_arg(data,u4);
114 /*printf("fill_callblock: pos:%d, value:%d\n",cnt,dummy);*/
115 blk[cnt].item=(u8)dummy;
120 blk[cnt].itemtype=TYPE_LNG;
121 blk[cnt].item=(u8)va_arg(data,jlong);
124 blk[cnt].itemtype=TYPE_FLT;
125 *((jfloat*)(&blk[cnt].item))=((jfloat)va_arg(data,jdouble));
129 blk[cnt].itemtype=TYPE_DBL;
130 *((jdouble*)(&blk[cnt].item))=(jdouble)va_arg(data,jdouble);
132 case 'V' : panic ("V not allowed as function parameter");
135 char *start = *utf_ptr;
136 while (utf_nextu2(utf_ptr)!=';')
138 blk[cnt].itemtype=TYPE_ADR;
139 blk[cnt].item=(u8)(u4)va_arg(data,void*);
143 /* XXX need arrayclass change? */
145 char *start = *utf_ptr;
147 while ((ch = utf_nextu2(utf_ptr))=='[')
149 while (utf_nextu2(utf_ptr)!=';') {}
152 ch=utf_nextu2(utf_ptr);
153 blk[cnt].itemtype=TYPE_ADR;
154 blk[cnt].item=(u8)(u4)va_arg(data,void*);
161 /*the standard doesn't say anything about return value checking, but it appears to be usefull*/
162 c=utf_nextu2(utf_ptr);
163 c=utf_nextu2(utf_ptr);
164 /*printf("%c %c\n",ret,c);*/
166 if (!((c=='L') || (c=='['))) log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
167 } else if (ret != c) log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
173 jmethodID get_virtual(jobject obj,jmethodID methodID) {
174 if (obj->vftbl->class==methodID->class) return methodID;
175 return class_resolvemethod (obj->vftbl->class, methodID->name, methodID->descriptor);
178 jmethodID get_nonvirtual(jclass clazz,jmethodID methodID) {
179 if (clazz==methodID->class) return methodID;
180 return class_resolvemethod (clazz, methodID->name, methodID->descriptor);
183 jobject callObjectMethod (jobject obj, jmethodID methodID, va_list args)
191 log_text("JNI-Call: CallObjectMethodV");
192 utf_display(methodID->name);
193 utf_display(methodID->descriptor);
194 printf("\nParmaeter count: %d\n",argcount);
195 utf_display(obj->vftbl->class->name);
200 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
203 argcount=get_parametercount(methodID);
205 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
206 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
207 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
211 if (obj && (! builtin_instanceof(obj,methodID->class))) {
212 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
217 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
218 log_text("Too many arguments. CallObjectMethod does not support that");
222 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
224 fill_callblock(obj,methodID->descriptor,blk,args,'O');
226 /* printf("parameter: obj: %p",blk[0].item); */
227 ret=asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
228 MFREE(blk,jni_callblock,argcount+1);
229 /* printf("(CallObjectMethodV)-->%p\n",ret); */
234 /*core function for integer class methods (bool,byte,short,integer
235 This is basically needed for i386*/
236 jint callIntegerMethod (jobject obj, jmethodID methodID, char retType, va_list args) {
242 /* printf("%p, %c\n",retType,methodID,retType);*/
245 log_text("JNI-Call: CallObjectMethodV");
246 utf_display(methodID->name);
247 utf_display(methodID->descriptor);
248 printf("\nParmaeter count: %d\n",argcount);
249 utf_display(obj->vftbl->class->name);
253 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
257 argcount=get_parametercount(methodID);
259 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
260 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
261 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
265 if (obj && (! builtin_instanceof(obj,methodID->class))) {
266 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
272 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
273 log_text("Too many arguments. CallObjectMethod does not support that");
277 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
279 fill_callblock(obj,methodID->descriptor,blk,args,retType);
281 /* printf("parameter: obj: %p",blk[0].item); */
282 ret=(jint)asm_calljavafunction2(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
283 MFREE(blk,jni_callblock,argcount+1);
284 /* printf("(CallObjectMethodV)-->%p\n",ret); */
290 /*core function for long class functions*/
291 jlong callLongMethod (jobject obj, jmethodID methodID, va_list args) {
298 log_text("JNI-Call: CallObjectMethodV");
299 utf_display(methodID->name);
300 utf_display(methodID->descriptor);
301 printf("\nParmaeter count: %d\n",argcount);
302 utf_display(obj->vftbl->class->name);
306 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
309 argcount=get_parametercount(methodID);
311 if (!( ((methodID->flags & ACC_STATIC) && (obj==0)) ||
312 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
313 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
317 if (obj && (! builtin_instanceof(obj,methodID->class))) {
318 exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
324 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
325 log_text("Too many arguments. CallObjectMethod does not support that");
329 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
331 fill_callblock(obj,methodID->descriptor,blk,args,'L');
333 /* printf("parameter: obj: %p",blk[0].item); */
334 ret=asm_calljavafunction2long(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
335 MFREE(blk,jni_callblock,argcount+1);
336 /* printf("(CallObjectMethodV)-->%p\n",ret); */
342 /*core function for float class methods (float,double)*/
343 jdouble callFloatMethod (jobject obj, jmethodID methodID, va_list args,char retType) {
344 int argcount=get_parametercount(methodID);
350 log_text("JNI-Call: CallObjectMethodV");
351 utf_display(methodID->name);
352 utf_display(methodID->descriptor);
353 printf("\nParmaeter count: %d\n",argcount);
354 utf_display(obj->vftbl->class->name);
358 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
359 log_text("Too many arguments. CallObjectMethod does not support that");
363 blk = MNEW(jni_callblock, 4 /*argcount+2*/);
365 fill_callblock(obj,methodID->descriptor,blk,args,retType);
367 /* printf("parameter: obj: %p",blk[0].item); */
368 ret=asm_calljavafunction2double(methodID,argcount+1,(argcount+1)*sizeof(jni_callblock),blk);
369 MFREE(blk,jni_callblock,argcount+1);
370 /* printf("(CallObjectMethodV)-->%p\n",ret); */
376 /*************************** function: jclass_findfield ****************************
378 searches for field with specified name and type in a 'classinfo'-structur
379 if no such field is found NULL is returned
381 ************************************************************************************/
383 fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
386 /* printf(" FieldCount: %d\n",c->fieldscount);
387 utf_display(c->name); */
388 for (i = 0; i < c->fieldscount; i++) {
389 /* utf_display(c->fields[i].name);
391 utf_display(c->fields[i].descriptor);
393 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
394 return &(c->fields[i]);
400 /********************* returns version of native method interface *****************/
402 jint GetVersion (JNIEnv* env)
407 /****************** loads a class from a buffer of raw class data *****************/
409 jclass DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len)
413 /* change suck-mode, so subsequent class_load will read from memory-buffer */
414 classload_buffer( (u1*) buf,len);
416 clazz = loader_load(utf_new_char ((char *) name));
418 /* restore old suck-mode */
419 classload_buffer(NULL,0);
425 /*************** loads locally defined class with the specified name **************/
427 jclass FindClass (JNIEnv* env, const char *name)
431 if (strcmp(name,"[B")==0) {
432 c = loader_load(utf_new_char("The_Array_Class"));
435 c = loader_load(utf_new_char_classname ((char *) name));
437 if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
443 /***********************************************************************************
445 converts java.lang.reflect.Method or
446 java.lang.reflect.Constructor object to a method ID
448 **********************************************************************************/
450 jmethodID FromReflectedMethod (JNIEnv* env, jobject method)
452 /* log_text("JNI-Call: FromReflectedMethod"); */
456 /*************** return superclass of the class represented by sub ****************/
458 jclass GetSuperclass (JNIEnv* env, jclass sub)
462 c = ((classinfo*) sub) -> super;
465 use_class_as_object (c);
470 /*********************** check whether sub can be cast to sup ********************/
472 jboolean IsAssignableForm (JNIEnv* env, jclass sub, jclass sup)
474 return builtin_isanysubclass(sub,sup);
478 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
480 jobject ToReflectedField (JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
482 /* log_text("JNI-Call: ToReflectedField"); */
486 /***************** throw java.lang.Throwable object ******************************/
488 jint Throw (JNIEnv* env, jthrowable obj)
490 exceptionptr = (java_objectheader*) obj;
495 /***********************************************************************************
497 create exception object from the class clazz with the
498 specified message and cause it to be thrown
500 **********************************************************************************/
503 jint ThrowNew (JNIEnv* env, jclass clazz, const char *msg)
505 java_lang_Throwable *o;
507 /* instantiate exception object */
508 o = (java_lang_Throwable *) native_new_and_init ((classinfo*) clazz);
512 o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
514 exceptionptr = (java_objectheader*) o;
518 /************************* check if exception occured *****************************/
520 jthrowable ExceptionOccurred (JNIEnv* env)
522 return (jthrowable) exceptionptr;
525 /********** print exception and a backtrace of the stack (for debugging) **********/
527 void ExceptionDescribe (JNIEnv* env)
529 utf_display(exceptionptr->vftbl->class->name);
535 /******************* clear any exception currently being thrown *******************/
537 void ExceptionClear (JNIEnv* env)
543 /********** raises a fatal error and does not expect the VM to recover ************/
545 void FatalError (JNIEnv* env, const char *msg)
550 /******************* creates a new local reference frame **************************/
552 jint PushLocalFrame (JNIEnv* env, jint capacity)
557 /**************** Pops off the current local reference frame **********************/
559 jobject PopLocalFrame (JNIEnv* env, jobject result)
565 /** Creates a new global reference to the object referred to by the obj argument **/
567 jobject NewGlobalRef (JNIEnv* env, jobject lobj)
569 heap_addreference ( (void**) &lobj);
573 /************* Deletes the global reference pointed to by globalRef **************/
575 void DeleteGlobalRef (JNIEnv* env, jobject gref)
581 /*************** Deletes the local reference pointed to by localRef ***************/
583 void DeleteLocalRef (JNIEnv* env, jobject localRef)
588 /********** Tests whether two references refer to the same Java object ************/
590 jboolean IsSameObject (JNIEnv* env, jobject obj1, jobject obj2)
595 /***** Creates a new local reference that refers to the same object as ref *******/
597 jobject NewLocalRef (JNIEnv* env, jobject ref)
602 /***********************************************************************************
604 Ensures that at least a given number of local references can
605 be created in the current thread
607 **********************************************************************************/
609 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
611 return 0; /* return 0 on success */
615 /********* Allocates a new Java object without invoking a constructor *************/
617 jobject AllocObject (JNIEnv* env, jclass clazz)
619 java_objectheader *o = builtin_new(clazz);
624 /***********************************************************************************
626 Constructs a new Java object
627 arguments that are to be passed to the constructor are placed after methodID
629 ***********************************************************************************/
631 jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
633 java_objectheader *o;
635 int argcount=get_parametercount(methodID);
639 /* log_text("JNI-Call: NewObject"); */
642 exceptionptr=native_new_and_init(loader_load(utf_new_char("java/lang/IllegalArgumentException")));
643 log_text("Too many arguments. NewObject does not support that");
648 o = builtin_new (clazz); /* create object */
652 va_start(vaargs,methodID);
653 for (i=0;i<argcount;i++) {
654 args[i]=va_arg(vaargs,void*);
657 exceptionptr=asm_calljavamethod(methodID,o,args[0],args[1],args[2]);
663 /***********************************************************************************
665 Constructs a new Java object
666 arguments that are to be passed to the constructor are placed in va_list args
668 ***********************************************************************************/
670 jobject NewObjectV (JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
672 /* log_text("JNI-Call: NewObjectV"); */
675 /***********************************************************************************
677 Constructs a new Java object
678 arguments that are to be passed to the constructor are placed in
679 args array of jvalues
681 ***********************************************************************************/
683 jobject NewObjectA (JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
685 /* log_text("JNI-Call: NewObjectA"); */
689 /************************ returns the class of an object **************************/
691 jclass GetObjectClass (JNIEnv* env, jobject obj)
693 classinfo *c = obj->vftbl -> class;
694 use_class_as_object (c);
698 /************* tests whether an object is an instance of a class ******************/
700 jboolean IsInstanceOf (JNIEnv* env, jobject obj, jclass clazz)
702 return builtin_instanceof(obj,clazz);
706 /***************** converts a java.lang.reflect.Field to a field ID ***************/
708 jfieldID FromReflectedField (JNIEnv* env, jobject field)
710 log_text("JNI-Call: FromReflectedField");
713 /**********************************************************************************
715 converts a method ID to a java.lang.reflect.Method or
716 java.lang.reflect.Constructor object
718 **********************************************************************************/
720 jobject ToReflectedMethod (JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
722 log_text("JNI-Call: ToReflectedMethod");
725 /**************** returns the method ID for an instance method ********************/
727 jmethodID GetMethodID (JNIEnv* env, jclass clazz, const char *name, const char *sig)
731 m = class_resolvemethod (
733 utf_new_char ((char*) name),
734 utf_new_char ((char*) sig)
737 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
742 /******************** JNI-functions for calling instance methods ******************/
743 jobject CallObjectMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
748 /* log_text("JNI-Call: CallObjectMethod");*/
750 va_start(vaargs,methodID);
751 ret = callObjectMethod(obj,methodID,vaargs);
757 jobject CallObjectMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
759 return callObjectMethod(obj,methodID,args);
763 jobject CallObjectMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
767 log_text("JNI-Call: CallObjectMethodA");
775 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
780 /* log_text("JNI-Call: CallBooleanMethod");*/
782 va_start(vaargs,methodID);
783 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',vaargs);
789 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
791 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),'Z',args);
795 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
797 log_text("JNI-Call: CallBooleanMethodA");
802 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
807 /* log_text("JNI-Call: CallVyteMethod");*/
809 va_start(vaargs,methodID);
810 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'B',vaargs);
816 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
818 /* log_text("JNI-Call: CallByteMethodV");*/
819 return callIntegerMethod(obj,methodID,'B',args);
823 jbyte CallByteMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
825 log_text("JNI-Call: CallByteMethodA");
829 jchar CallCharMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
834 /* log_text("JNI-Call: CallCharMethod");*/
836 va_start(vaargs,methodID);
837 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'C',vaargs);
843 jchar CallCharMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
845 /* log_text("JNI-Call: CallCharMethodV");*/
846 return callIntegerMethod(obj,get_virtual(obj,methodID),'C',args);
850 jchar CallCharMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
852 log_text("JNI-Call: CallCharMethodA");
858 jshort CallShortMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
863 /* log_text("JNI-Call: CallShortMethod");*/
865 va_start(vaargs,methodID);
866 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'S',vaargs);
873 jshort CallShortMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
875 return callIntegerMethod(obj,get_virtual(obj,methodID),'S',args);
879 jshort CallShortMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
881 log_text("JNI-Call: CallShortMethodA");
888 jint CallIntMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
893 va_start(vaargs,methodID);
894 ret = callIntegerMethod(obj,get_virtual(obj,methodID),'I',vaargs);
900 jint CallIntMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
902 return callIntegerMethod(obj,get_virtual(obj,methodID),'I',args);
906 jint CallIntMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
908 log_text("JNI-Call: CallIntMethodA");
915 jlong CallLongMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
917 log_text("JNI-Call: CallLongMethod");
923 jlong CallLongMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
925 log_text("JNI-Call: CallLongMethodV");
931 jlong CallLongMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
933 log_text("JNI-Call: CallLongMethodA");
940 jfloat CallFloatMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
945 /* log_text("JNI-Call: CallFloatMethod");*/
947 va_start(vaargs,methodID);
948 ret = callFloatMethod(obj,get_virtual(obj,methodID),vaargs,'F');
954 jfloat CallFloatMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
956 log_text("JNI-Call: CallFloatMethodV");
957 return callFloatMethod(obj,get_virtual(obj,methodID),args,'F');
961 jfloat CallFloatMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
963 log_text("JNI-Call: CallFloatMethodA");
970 jdouble CallDoubleMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
975 /* log_text("JNI-Call: CallDoubleMethod");*/
977 va_start(vaargs,methodID);
978 ret = callFloatMethod(obj,get_virtual(obj,methodID),vaargs,'D');
984 jdouble CallDoubleMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
986 log_text("JNI-Call: CallDoubleMethodV");
987 return callFloatMethod(obj,get_virtual(obj,methodID),args,'D');
991 jdouble CallDoubleMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
993 log_text("JNI-Call: CallDoubleMethodA");
999 void CallVoidMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1003 /* log_text("JNI-Call: CallVoidMethod");*/
1005 va_start(vaargs,methodID);
1006 (void)callIntegerMethod(obj,get_virtual(obj,methodID),'V',vaargs);
1013 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1015 log_text("JNI-Call: CallVoidMethodV");
1016 (void)callIntegerMethod(obj,get_virtual(obj,methodID),'V',args);
1021 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1023 log_text("JNI-Call: CallVoidMethodA");
1029 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1031 log_text("JNI-Call: CallNonvirtualObjectMethod");
1037 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1039 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1045 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1047 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1054 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1059 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1061 va_start(vaargs,methodID);
1062 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',vaargs);
1069 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1071 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1072 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'Z',args);
1076 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1078 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1085 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1090 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1092 va_start(vaargs,methodID);
1093 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',vaargs);
1099 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1101 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1102 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'B',args);
1107 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1109 log_text("JNI-Call: CallNonvirtualByteMethodA");
1116 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1121 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1123 va_start(vaargs,methodID);
1124 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',vaargs);
1130 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1132 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1133 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'C',args);
1137 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1139 log_text("JNI-Call: CallNonvirtualCharMethodA");
1146 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1151 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1153 va_start(vaargs,methodID);
1154 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',vaargs);
1160 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1162 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1163 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'S',args);
1167 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1169 log_text("JNI-Call: CallNonvirtualShortMethodA");
1176 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1182 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1184 va_start(vaargs,methodID);
1185 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',vaargs);
1191 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1193 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1194 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'I',args);
1198 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1200 log_text("JNI-Call: CallNonvirtualIntMethodA");
1207 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1209 log_text("JNI-Call: CallNonvirtualLongMethod");
1215 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1217 log_text("JNI-Call: CallNonvirtualLongMethodV");
1223 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1225 log_text("JNI-Call: CallNonvirtualLongMethodA");
1232 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1237 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1240 va_start(vaargs,methodID);
1241 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'F');
1248 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1250 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1251 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'F');
1255 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1257 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1264 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1268 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1270 va_start(vaargs,methodID);
1271 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,'D');
1278 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1280 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1281 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,'D');
1285 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1287 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1294 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1298 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1300 va_start(vaargs,methodID);
1301 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',vaargs);
1307 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1309 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1311 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),'V',args);
1316 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1318 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1321 /************************* JNI-functions for accessing fields ************************/
1323 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1327 f = jclass_findfield(clazz,
1328 utf_new_char ((char*) name),
1329 utf_new_char ((char*) sig)
1332 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1337 /*************************** retrieve fieldid, abort on error ************************/
1339 jfieldID getFieldID_critical(JNIEnv *env,jclass clazz,const char *name,const char *sig)
1341 jfieldID id = GetFieldID(env,clazz,name,sig);
1342 if (!id) panic("setfield_critical failed");
1346 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1348 return getField(obj,jobject,fieldID);
1351 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1353 return getField(obj,jboolean,fieldID);
1357 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1359 return getField(obj,jbyte,fieldID);
1363 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1365 return getField(obj,jchar,fieldID);
1369 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1371 return getField(obj,jshort,fieldID);
1375 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1377 return getField(obj,jint,fieldID);
1381 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1383 return getField(obj,jlong,fieldID);
1387 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1389 return getField(obj,jfloat,fieldID);
1393 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1395 return getField(obj,jdouble,fieldID);
1398 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1400 setField(obj,jobject,fieldID,val);
1404 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1406 setField(obj,jboolean,fieldID,val);
1410 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1412 setField(obj,jbyte,fieldID,val);
1416 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1418 setField(obj,jchar,fieldID,val);
1422 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
1424 setField(obj,jshort,fieldID,val);
1428 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
1430 setField(obj,jint,fieldID,val);
1434 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
1436 setField(obj,jlong,fieldID,val);
1440 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
1442 setField(obj,jfloat,fieldID,val);
1446 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
1448 setField(obj,jdouble,fieldID,val);
1451 /**************** JNI-functions for calling static methods **********************/
1453 jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1457 m = class_resolvemethod (
1459 utf_new_char ((char*) name),
1460 utf_new_char ((char*) sig)
1463 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1468 jobject CallStaticObjectMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1470 log_text("JNI-Call: CallStaticObjectMethod");
1476 jobject CallStaticObjectMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1478 log_text("JNI-Call: CallStaticObjectMethodV");
1484 jobject CallStaticObjectMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1486 log_text("JNI-Call: CallStaticObjectMethodA");
1492 jboolean CallStaticBooleanMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1497 /* log_text("JNI-Call: CallStaticBooleanMethod");*/
1499 va_start(vaargs,methodID);
1500 ret = (jboolean)callIntegerMethod(0,methodID,'Z',vaargs);
1507 jboolean CallStaticBooleanMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1509 return (jboolean)callIntegerMethod(0,methodID,'Z',args);
1512 jboolean CallStaticBooleanMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1514 log_text("JNI-Call: CallStaticBooleanMethodA");
1520 jbyte CallStaticByteMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1525 /* log_text("JNI-Call: CallStaticByteMethod");*/
1527 va_start(vaargs,methodID);
1528 ret = (jbyte)callIntegerMethod(0,methodID,'B',vaargs);
1535 jbyte CallStaticByteMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1537 return (jbyte)callIntegerMethod(0,methodID,'B',args);
1541 jbyte CallStaticByteMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1543 log_text("JNI-Call: CallStaticByteMethodA");
1548 jchar CallStaticCharMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1553 /* log_text("JNI-Call: CallStaticByteMethod");*/
1555 va_start(vaargs,methodID);
1556 ret = (jchar)callIntegerMethod(0,methodID,'C',vaargs);
1563 jchar CallStaticCharMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1565 return (jchar)callIntegerMethod(0,methodID,'C',args);
1569 jchar CallStaticCharMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1571 log_text("JNI-Call: CallStaticCharMethodA");
1578 jshort CallStaticShortMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1583 /* log_text("JNI-Call: CallStaticByteMethod");*/
1585 va_start(vaargs,methodID);
1586 ret = (jshort)callIntegerMethod(0,methodID,'S',vaargs);
1592 jshort CallStaticShortMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1594 /*log_text("JNI-Call: CallStaticShortMethodV");*/
1595 return (jshort)callIntegerMethod(0,methodID,'S',args);
1599 jshort CallStaticShortMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1601 log_text("JNI-Call: CallStaticShortMethodA");
1608 jint CallStaticIntMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1613 /* log_text("JNI-Call: CallStaticIntMethod");*/
1615 va_start(vaargs,methodID);
1616 ret = callIntegerMethod(0,methodID,'I',vaargs);
1623 jint CallStaticIntMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1625 log_text("JNI-Call: CallStaticIntMethodV");
1627 return callIntegerMethod(0,methodID,'I',args);
1631 jint CallStaticIntMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1633 log_text("JNI-Call: CallStaticIntMethodA");
1640 jlong CallStaticLongMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1645 /* log_text("JNI-Call: CallStaticLongMethod");*/
1647 va_start(vaargs,methodID);
1648 ret = callLongMethod(0,methodID,vaargs);
1654 jlong CallStaticLongMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1656 log_text("JNI-Call: CallStaticLongMethodV");
1658 return callLongMethod(0,methodID,args);
1662 jlong CallStaticLongMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1664 log_text("JNI-Call: CallStaticLongMethodA");
1671 jfloat CallStaticFloatMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1676 /* log_text("JNI-Call: CallStaticLongMethod");*/
1678 va_start(vaargs,methodID);
1679 ret = callFloatMethod(0,methodID,vaargs,'F');
1686 jfloat CallStaticFloatMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1689 return callFloatMethod(0,methodID,args,'F');
1694 jfloat CallStaticFloatMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1696 log_text("JNI-Call: CallStaticFloatMethodA");
1702 jdouble CallStaticDoubleMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1708 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
1710 va_start(vaargs,methodID);
1711 ret = callFloatMethod(0,methodID,vaargs,'D');
1718 jdouble CallStaticDoubleMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1720 log_text("JNI-Call: CallStaticDoubleMethodV");
1722 return callFloatMethod(0,methodID,args,'D');
1726 jdouble CallStaticDoubleMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1728 log_text("JNI-Call: CallStaticDoubleMethodA");
1735 void CallStaticVoidMethod (JNIEnv *env, jclass cls, jmethodID methodID, ...)
1739 /* log_text("JNI-Call: CallStaticVoidMethod");*/
1741 va_start(vaargs,methodID);
1742 (void)callIntegerMethod(0,methodID,'V',vaargs);
1748 void CallStaticVoidMethodV (JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
1750 log_text("JNI-Call: CallStaticVoidMethodV");
1751 (void)callIntegerMethod(0,methodID,'V',args);
1756 void CallStaticVoidMethodA (JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
1758 log_text("JNI-Call: CallStaticVoidMethodA");
1762 /****************** JNI-functions for accessing static fields ********************/
1764 jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1768 f = jclass_findfield(clazz,
1769 utf_new_char ((char*) name),
1770 utf_new_char ((char*) sig)
1773 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1779 jobject GetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1782 return fieldID->value.a;
1786 jboolean GetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1789 return fieldID->value.i;
1793 jbyte GetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1796 return fieldID->value.i;
1800 jchar GetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1803 return fieldID->value.i;
1807 jshort GetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1810 return fieldID->value.i;
1814 jint GetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1817 return fieldID->value.i;
1821 jlong GetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1824 return fieldID->value.l;
1828 jfloat GetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1831 return fieldID->value.f;
1835 jdouble GetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1838 return fieldID->value.d;
1843 void SetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
1846 fieldID->value.a = value;
1850 void SetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
1853 fieldID->value.i = value;
1857 void SetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
1860 fieldID->value.i = value;
1864 void SetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
1867 fieldID->value.i = value;
1871 void SetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
1874 fieldID->value.i = value;
1878 void SetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
1881 fieldID->value.i = value;
1885 void SetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
1888 fieldID->value.l = value;
1892 void SetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
1895 fieldID->value.f = value;
1899 void SetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
1902 fieldID->value.d = value;
1906 /***** create new java.lang.String object from an array of Unicode characters ****/
1908 jstring NewString (JNIEnv *env, const jchar *buf, jsize len)
1911 java_lang_String *s;
1914 s = (java_lang_String*) builtin_new (class_java_lang_String);
1915 a = builtin_newarray_char (len);
1917 /* javastring or characterarray could not be created */
1918 if ( (!a) || (!s) ) return NULL;
1921 for (i=0; i<len; i++) a->data[i] = buf[i];
1929 /******************* returns the length of a Java string ***************************/
1931 jsize GetStringLength (JNIEnv *env, jstring str)
1933 return ((java_lang_String*) str)->count;
1937 /******************** convertes javastring to u2-array ****************************/
1939 u2 *javastring_tou2 (jstring so)
1941 java_lang_String *s = (java_lang_String*) so;
1946 if (!s) return NULL;
1949 if (!a) return NULL;
1951 /* allocate memory */
1952 stringbuffer = MNEW( u2 , s->count + 1 );
1955 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
1957 /* terminate string */
1958 stringbuffer[i] = '\0';
1960 return stringbuffer;
1963 /********* returns a pointer to an array of Unicode characters of the string *******/
1965 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
1967 return javastring_tou2(str);
1970 /**************** native code no longer needs access to chars **********************/
1972 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
1974 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count);
1977 /************ create new java.lang.String object from utf8-characterarray **********/
1979 jstring NewStringUTF (JNIEnv *env, const char *utf)
1981 /* log_text("NewStringUTF called");*/
1982 return javastring_new(utf_new_char(utf));
1985 /****************** returns the utf8 length in bytes of a string *******************/
1987 jsize GetStringUTFLength (JNIEnv *env, jstring string)
1989 java_lang_String *s = (java_lang_String*) string;
1991 return (jsize) u2_utflength(s->value->data, s->count);
1994 /************ converts a Javastring to an array of UTF-8 characters ****************/
1996 const char* GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy)
1998 if (verbose) log_text("GetStringUTFChars:");
2000 return javastring_toutf((java_lang_String*) string,false)->text;
2004 /***************** native code no longer needs access to utf ***********************/
2006 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2009 log_text("JNI-Call: ReleaseStringUTFChars");
2010 utf_display(utf_new_char(chars));
2014 /************************** array operations ***************************************/
2016 jsize GetArrayLength (JNIEnv *env, jarray array)
2021 jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
2023 java_objectarray *j = builtin_anewarray (len, clazz);
2024 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2028 jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
2032 if (index<array->header.size)
2033 j = array->data[index];
2035 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2040 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
2042 if (index>=array->header.size)
2043 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2046 /* check if the class of value is a subclass of the element class of the array */
2048 if (!builtin_canstore((java_objectarray*)array,(java_objectheader*)val))
2049 exceptionptr = proto_java_lang_ArrayStoreException;
2051 array->data[index] = val;
2057 jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
2059 java_booleanarray *j = builtin_newarray_boolean(len);
2060 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2065 jbyteArray NewByteArray (JNIEnv *env, jsize len)
2067 java_bytearray *j = builtin_newarray_byte(len);
2068 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2073 jcharArray NewCharArray (JNIEnv *env, jsize len)
2075 java_chararray *j = builtin_newarray_char(len);
2076 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2081 jshortArray NewShortArray (JNIEnv *env, jsize len)
2083 java_shortarray *j = builtin_newarray_short(len);
2084 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2089 jintArray NewIntArray (JNIEnv *env, jsize len)
2091 java_intarray *j = builtin_newarray_int(len);
2092 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2097 jlongArray NewLongArray (JNIEnv *env, jsize len)
2099 java_longarray *j = builtin_newarray_long(len);
2100 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2105 jfloatArray NewFloatArray (JNIEnv *env, jsize len)
2107 java_floatarray *j = builtin_newarray_float(len);
2108 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2113 jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
2115 java_doublearray *j = builtin_newarray_double(len);
2116 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
2121 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2123 if (isCopy) *isCopy = JNI_FALSE;
2128 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2130 if (isCopy) *isCopy = JNI_FALSE;
2135 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
2137 if (isCopy) *isCopy = JNI_FALSE;
2142 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
2144 if (isCopy) *isCopy = JNI_FALSE;
2149 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
2151 if (isCopy) *isCopy = JNI_FALSE;
2156 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
2158 if (isCopy) *isCopy = JNI_FALSE;
2163 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
2165 if (isCopy) *isCopy = JNI_FALSE;
2170 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
2172 if (isCopy) *isCopy = JNI_FALSE;
2178 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
2184 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
2190 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
2196 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
2202 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
2208 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
2214 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
2220 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
2225 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2227 if (start<0 || len<0 || start+len>array->header.size)
2228 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2230 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2234 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2236 if (start<0 || len<0 || start+len>array->header.size)
2237 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2239 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2243 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2245 if (start<0 || len<0 || start+len>array->header.size)
2246 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2248 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2252 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2254 if (start<0 || len<0 || start+len>array->header.size)
2255 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2257 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2261 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2263 if (start<0 || len<0 || start+len>array->header.size)
2264 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2266 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2270 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2272 if (start<0 || len<0 || start+len>array->header.size)
2273 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2275 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2279 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2281 if (start<0 || len<0 || start+len>array->header.size)
2282 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2284 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2288 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2290 if (start<0 || len<0 || start+len>array->header.size)
2291 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2293 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
2297 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
2299 if (start<0 || len<0 || start+len>array->header.size)
2300 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2302 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2306 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
2308 if (start<0 || len<0 || start+len>array->header.size)
2309 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2311 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2315 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
2317 if (start<0 || len<0 || start+len>array->header.size)
2318 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2320 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2325 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
2327 if (start<0 || len<0 || start+len>array->header.size)
2328 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2330 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2334 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
2336 if (start<0 || len<0 || start+len>array->header.size)
2337 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2339 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2343 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
2345 if (start<0 || len<0 || start+len>array->header.size)
2346 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2348 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2352 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
2354 if (start<0 || len<0 || start+len>array->header.size)
2355 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2357 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2361 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
2363 if (start<0 || len<0 || start+len>array->header.size)
2364 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
2366 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
2369 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
2371 log_text("JNI-Call: RegisterNatives");
2376 jint UnregisterNatives (JNIEnv* env, jclass clazz)
2378 log_text("JNI-Call: UnregisterNatives");
2382 /******************************* monitor operations ********************************/
2384 jint MonitorEnter (JNIEnv* env, jobject obj)
2386 builtin_monitorenter(obj);
2391 jint MonitorExit (JNIEnv* env, jobject obj)
2393 builtin_monitorexit(obj);
2398 /************************************* JavaVM interface ****************************/
2400 #error CPP mode not supported yet
2402 jint GetJavaVM (JNIEnv* env, JavaVM **vm)
2404 log_text("JNI-Call: GetJavaVM");
2408 #endif /*__cplusplus*/
2410 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
2412 log_text("JNI-Call: GetStringRegion");
2416 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
2418 log_text("JNI-Call: GetStringUTFRegion");
2422 /****************** obtain direct pointer to array elements ***********************/
2424 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
2426 java_objectheader *s = (java_objectheader*) array;
2427 arraydescriptor *desc = s->vftbl->arraydesc;
2429 if (!desc) return NULL;
2431 return ((u1*)s) + desc->dataoffset;
2435 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
2437 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
2442 /********* returns a pointer to an array of Unicode characters of the string *******/
2444 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
2446 log_text("JNI-Call: GetStringCritical");
2448 return GetStringChars(env,string,isCopy);
2451 /**************** native code no longer needs access to chars **********************/
2453 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
2455 log_text("JNI-Call: ReleaseStringCritical");
2457 ReleaseStringChars(env,string,cstring);
2461 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
2463 log_text("JNI-Call: NewWeakGlobalRef");
2469 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
2471 log_text("JNI-Call: DeleteWeakGlobalRef");
2477 /******************************* check for pending exception ***********************/
2480 jboolean ExceptionCheck (JNIEnv* env)
2482 log_text("JNI-Call: ExceptionCheck");
2484 return exceptionptr ? JNI_TRUE : JNI_FALSE;
2492 jint DestroyJavaVM (JavaVM *vm) {
2493 log_text("DestroyJavaVM called");
2496 jint AttachCurrentThread(JavaVM *vm, void **par1, void *par2) {
2497 log_text("AttachCurrentThread called");
2500 jint DetachCurrentThread (JavaVM *vm) {
2501 log_text("DetachCurrentThread called");
2504 jint GetEnv (JavaVM *vm, void **environment, jint jniversion) {
2509 jint AttachCurrentThreadAsDaemon (JavaVM *vm, void **par1, void *par2) {
2510 log_text("AttachCurrentThreadAsDaemon called");
2523 /********************************* JNI invocation table ******************************/
2525 struct _JavaVM javaVMTable={
2530 &AttachCurrentThread,
2531 &DetachCurrentThread,
2533 &AttachCurrentThreadAsDaemon
2537 JavaVM javaVM=&javaVMTable;
2539 /********************************* JNI function table ******************************/
2541 struct JNI_Table envTable =
2550 &FromReflectedMethod,
2551 &FromReflectedField,
2569 &EnsureLocalCapacity,
2581 &CallBooleanMethodV,
2582 &CallBooleanMethodA,
2607 &CallNonvirtualObjectMethod,
2608 &CallNonvirtualObjectMethodV,
2609 &CallNonvirtualObjectMethodA,
2610 &CallNonvirtualBooleanMethod,
2611 &CallNonvirtualBooleanMethodV,
2612 &CallNonvirtualBooleanMethodA,
2613 &CallNonvirtualByteMethod,
2614 &CallNonvirtualByteMethodV,
2615 &CallNonvirtualByteMethodA,
2616 &CallNonvirtualCharMethod,
2617 &CallNonvirtualCharMethodV,
2618 &CallNonvirtualCharMethodA,
2619 &CallNonvirtualShortMethod,
2620 &CallNonvirtualShortMethodV,
2621 &CallNonvirtualShortMethodA,
2622 &CallNonvirtualIntMethod,
2623 &CallNonvirtualIntMethodV,
2624 &CallNonvirtualIntMethodA,
2625 &CallNonvirtualLongMethod,
2626 &CallNonvirtualLongMethodV,
2627 &CallNonvirtualLongMethodA,
2628 &CallNonvirtualFloatMethod,
2629 &CallNonvirtualFloatMethodV,
2630 &CallNonvirtualFloatMethodA,
2631 &CallNonvirtualDoubleMethod,
2632 &CallNonvirtualDoubleMethodV,
2633 &CallNonvirtualDoubleMethodA,
2634 &CallNonvirtualVoidMethod,
2635 &CallNonvirtualVoidMethodV,
2636 &CallNonvirtualVoidMethodA,
2657 &CallStaticObjectMethod,
2658 &CallStaticObjectMethodV,
2659 &CallStaticObjectMethodA,
2660 &CallStaticBooleanMethod,
2661 &CallStaticBooleanMethodV,
2662 &CallStaticBooleanMethodA,
2663 &CallStaticByteMethod,
2664 &CallStaticByteMethodV,
2665 &CallStaticByteMethodA,
2666 &CallStaticCharMethod,
2667 &CallStaticCharMethodV,
2668 &CallStaticCharMethodA,
2669 &CallStaticShortMethod,
2670 &CallStaticShortMethodV,
2671 &CallStaticShortMethodA,
2672 &CallStaticIntMethod,
2673 &CallStaticIntMethodV,
2674 &CallStaticIntMethodA,
2675 &CallStaticLongMethod,
2676 &CallStaticLongMethodV,
2677 &CallStaticLongMethodA,
2678 &CallStaticFloatMethod,
2679 &CallStaticFloatMethodV,
2680 &CallStaticFloatMethodA,
2681 &CallStaticDoubleMethod,
2682 &CallStaticDoubleMethodV,
2683 &CallStaticDoubleMethodA,
2684 &CallStaticVoidMethod,
2685 &CallStaticVoidMethodV,
2686 &CallStaticVoidMethodA,
2688 &GetStaticObjectField,
2689 &GetStaticBooleanField,
2690 &GetStaticByteField,
2691 &GetStaticCharField,
2692 &GetStaticShortField,
2694 &GetStaticLongField,
2695 &GetStaticFloatField,
2696 &GetStaticDoubleField,
2697 &SetStaticObjectField,
2698 &SetStaticBooleanField,
2699 &SetStaticByteField,
2700 &SetStaticCharField,
2701 &SetStaticShortField,
2703 &SetStaticLongField,
2704 &SetStaticFloatField,
2705 &SetStaticDoubleField,
2709 &ReleaseStringChars,
2711 &GetStringUTFLength,
2713 &ReleaseStringUTFChars,
2716 &GetObjectArrayElement,
2717 &SetObjectArrayElement,
2726 &GetBooleanArrayElements,
2727 &GetByteArrayElements,
2728 &GetCharArrayElements,
2729 &GetShortArrayElements,
2730 &GetIntArrayElements,
2731 &GetLongArrayElements,
2732 &GetFloatArrayElements,
2733 &GetDoubleArrayElements,
2734 &ReleaseBooleanArrayElements,
2735 &ReleaseByteArrayElements,
2736 &ReleaseCharArrayElements,
2737 &ReleaseShortArrayElements,
2738 &ReleaseIntArrayElements,
2739 &ReleaseLongArrayElements,
2740 &ReleaseFloatArrayElements,
2741 &ReleaseDoubleArrayElements,
2742 &GetBooleanArrayRegion,
2743 &GetByteArrayRegion,
2744 &GetCharArrayRegion,
2745 &GetShortArrayRegion,
2747 &GetLongArrayRegion,
2748 &GetFloatArrayRegion,
2749 &GetDoubleArrayRegion,
2750 &SetBooleanArrayRegion,
2751 &SetByteArrayRegion,
2752 &SetCharArrayRegion,
2753 &SetShortArrayRegion,
2755 &SetLongArrayRegion,
2756 &SetFloatArrayRegion,
2757 &SetDoubleArrayRegion,
2764 &GetStringUTFRegion,
2765 &GetPrimitiveArrayCritical,
2766 &ReleasePrimitiveArrayCritical,
2768 &ReleaseStringCritical,
2770 &DeleteWeakGlobalRef,
2775 JNIEnv env=&envTable;
2779 * These are local overrides for various environment variables in Emacs.
2780 * Please do not remove this and leave it at the end of the file, where
2781 * Emacs will automagically detect them.
2782 * ---------------------------------------------------------------------
2785 * indent-tabs-mode: t