1 /* src/native/jni.c - implementation of the Java Native Interface functions
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
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
27 Authors: Rainhard Grafl
30 Changes: Joseph Wenninger
34 $Id: jni.c 2574 2005-06-06 15:38:52Z twisti $
44 #include "mm/memory.h"
45 #include "native/jni.h"
46 #include "native/native.h"
47 #include "native/include/java_lang_Object.h"
48 #include "native/include/java_lang_Byte.h"
49 #include "native/include/java_lang_Character.h"
50 #include "native/include/java_lang_Short.h"
51 #include "native/include/java_lang_Integer.h"
52 #include "native/include/java_lang_Boolean.h"
53 #include "native/include/java_lang_Long.h"
54 #include "native/include/java_lang_Float.h"
55 #include "native/include/java_lang_Double.h"
56 #include "native/include/java_lang_Throwable.h"
57 #include "native/include/java_lang_reflect_Method.h"
58 #include "native/include/java_lang_reflect_Constructor.h"
59 #include "native/include/java_lang_reflect_Field.h"
61 #include "native/include/java_lang_Class.h" /* for java_lang_VMClass.h */
62 #include "native/include/java_lang_VMClass.h"
63 #include "native/include/java_lang_VMClassLoader.h"
65 #if defined(USE_THREADS)
66 # if defined(NATIVE_THREADS)
67 # include "threads/native/threads.h"
69 # include "threads/green/threads.h"
73 #include "toolbox/logging.h"
74 #include "vm/builtin.h"
75 #include "vm/exceptions.h"
76 #include "vm/global.h"
77 #include "vm/initialize.h"
78 #include "vm/loader.h"
79 #include "vm/options.h"
80 #include "vm/resolve.h"
81 #include "vm/statistics.h"
82 #include "vm/stringlocal.h"
83 #include "vm/tables.h"
84 #include "vm/jit/asmpart.h"
85 #include "vm/jit/jit.h"
86 #include "vm/statistics.h"
89 /* XXX TWISTI hack: define it extern so they can be found in this file */
90 extern const struct JNIInvokeInterface JNI_JavaVMTable;
91 extern struct JNINativeInterface JNI_JNIEnvTable;
93 /* pointers to VM and the environment needed by GetJavaVM and GetEnv */
94 static JavaVM ptr_jvm = (JavaVM) &JNI_JavaVMTable;
95 static void* ptr_env = (void*) &JNI_JNIEnvTable;
98 #define PTR_TO_ITEM(ptr) ((u8)(size_t)(ptr))
100 /* global reference table */
101 static jobject *global_ref_table;
102 static bool initrunning=false;
104 /* jmethodID and jclass caching variables for NewGlobalRef and DeleteGlobalRef*/
105 static jmethodID getmid = NULL;
106 static jmethodID putmid = NULL;
107 static jclass intclass = NULL;
108 static jmethodID intvalue = NULL;
109 static jmethodID newint = NULL;
110 static jclass ihmclass = NULL;
111 static jmethodID removemid = NULL;
113 #define JWCLINITDEBUG(x)
116 /********************* accessing instance-fields **********************************/
118 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
119 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
120 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
123 static void fill_callblock(void *obj, methoddesc *descr, jni_callblock blk[],
124 va_list data, int rettype)
126 typedesc *paramtypes;
130 paramtypes = descr->paramtypes;
132 /* if method is non-static fill first block and skip `this' pointer */
137 /* the this pointer */
138 blk[0].itemtype = TYPE_ADR;
139 blk[0].item = PTR_TO_ITEM(obj);
145 for (; i < descr->paramcount; i++, paramtypes++) {
146 switch (paramtypes->decltype) {
147 /* primitive types */
148 case PRIMITIVETYPE_BYTE:
149 case PRIMITIVETYPE_CHAR:
150 case PRIMITIVETYPE_SHORT:
151 case PRIMITIVETYPE_BOOLEAN:
152 blk[i].itemtype = TYPE_INT;
153 blk[i].item = (u8) va_arg(data, int);
156 case PRIMITIVETYPE_INT:
157 blk[i].itemtype = TYPE_INT;
158 dummy = va_arg(data, u4);
159 blk[i].item = (u8) dummy;
162 case PRIMITIVETYPE_LONG:
163 blk[i].itemtype = TYPE_LNG;
164 blk[i].item = (u8) va_arg(data, jlong);
167 case PRIMITIVETYPE_FLOAT:
168 blk[i].itemtype = TYPE_FLT;
169 *((jfloat *) (&blk[i].item)) = (jfloat) va_arg(data, jdouble);
172 case PRIMITIVETYPE_DOUBLE:
173 blk[i].itemtype = TYPE_DBL;
174 *((jdouble *) (&blk[i].item)) = (jdouble) va_arg(data, jdouble);
178 blk[i].itemtype = TYPE_ADR;
179 blk[i].item = PTR_TO_ITEM(va_arg(data, void*));
184 /* The standard doesn't say anything about return value checking, but it */
185 /* appears to be useful. */
187 if (rettype != descr->returntype.decltype)
188 log_text("\n====\nWarning call*Method called for function with wrong return type\n====");
192 /* XXX it could be considered if we should do typechecking here in the future */
193 static bool fill_callblock_objA(void *obj, methoddesc *descr,
194 jni_callblock blk[], java_objectarray* params,
198 typedesc *paramtypes;
202 paramtypes = descr->paramtypes;
204 /* if method is non-static fill first block and skip `this' pointer */
210 blk[0].itemtype = TYPE_ADR;
211 blk[0].item = PTR_TO_ITEM(obj);
217 for (; i < descr->paramcount; i++, paramtypes++) {
218 switch (paramtypes->type) {
219 /* primitive types */
224 param = params->data[i];
228 /* internally used data type */
229 blk[i].itemtype = paramtypes->type;
231 /* convert the value according to its declared type */
233 c = param->vftbl->class;
235 switch (paramtypes->decltype) {
236 case PRIMITIVETYPE_BOOLEAN:
237 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
238 blk[i].item = (u8) ((java_lang_Boolean *) param)->value;
243 case PRIMITIVETYPE_BYTE:
244 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
245 blk[i].item = (u8) ((java_lang_Byte *) param)->value;
250 case PRIMITIVETYPE_CHAR:
251 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
252 blk[i].item = (u8) ((java_lang_Character *) param)->value;
257 case PRIMITIVETYPE_SHORT:
258 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
259 blk[i].item = (u8) ((java_lang_Short *) param)->value;
260 else if (c == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
261 blk[i].item = (u8) ((java_lang_Byte *) param)->value;
266 case PRIMITIVETYPE_INT:
267 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
268 blk[i].item = (u8) ((java_lang_Integer *) param)->value;
269 else if (c == primitivetype_table[PRIMITIVETYPE_SHORT].class_wrap)
270 blk[i].item = (u8) ((java_lang_Short *) param)->value;
271 else if (c == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
272 blk[i].item = (u8) ((java_lang_Byte *) param)->value;
277 case PRIMITIVETYPE_LONG:
278 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
279 blk[i].item = (u8) ((java_lang_Long *) param)->value;
280 else if (c == primitivetype_table[PRIMITIVETYPE_INT].class_wrap)
281 blk[i].item = (u8) ((java_lang_Integer *) param)->value;
282 else if (c == primitivetype_table[PRIMITIVETYPE_SHORT].class_wrap)
283 blk[i].item = (u8) ((java_lang_Short *) param)->value;
284 else if (c == primitivetype_table[PRIMITIVETYPE_BYTE].class_wrap)
285 blk[i].item = (u8) ((java_lang_Byte *) param)->value;
290 case PRIMITIVETYPE_FLOAT:
291 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
292 *((jfloat *) (&blk[i].item)) = (jfloat) ((java_lang_Float *) param)->value;
297 case PRIMITIVETYPE_DOUBLE:
298 if (c == primitivetype_table[paramtypes->decltype].class_wrap)
299 *((jdouble *) (&blk[i].item)) = (jdouble) ((java_lang_Float *) param)->value;
300 else if (c == primitivetype_table[PRIMITIVETYPE_FLOAT].class_wrap)
301 *((jfloat *) (&blk[i].item)) = (jfloat) ((java_lang_Float *) param)->value;
308 } /* end declared type switch */
312 if (!resolve_class_from_typedesc(paramtypes, true, &c))
313 return false; /* exception */
314 if (params->data[i] != 0) {
315 if (paramtypes->arraydim > 0) {
316 if (!builtin_arrayinstanceof(params->data[i], c->vftbl))
320 if (!builtin_instanceof(params->data[i], c))
324 blk[i].itemtype = TYPE_ADR;
325 blk[i].item = PTR_TO_ITEM(params->data[i]);
330 } /* end param type switch */
332 } /* end param loop */
335 *rettype = descr->returntype.decltype;
340 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
345 static jmethodID get_virtual(jobject obj, jmethodID methodID)
347 if (obj->vftbl->class == methodID->class)
350 return class_resolvemethod(obj->vftbl->class, methodID->name,
351 methodID->descriptor);
355 static jmethodID get_nonvirtual(jclass clazz, jmethodID methodID)
357 if (clazz == methodID->class)
360 /* class_resolvemethod -> classfindmethod? (JOWENN) */
361 return class_resolvemethod(clazz, methodID->name, methodID->descriptor);
365 static jobject callObjectMethod(jobject obj, jmethodID methodID, va_list args)
374 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
378 argcount = methodID->parseddesc->paramcount;
380 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
381 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
382 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
386 if (obj && !builtin_instanceof(obj, methodID->class)) {
387 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
394 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
395 log_text("Too many arguments. CallObjectMethod does not support that");
400 blk = MNEW(jni_callblock, /*4 */argcount+2);
402 fill_callblock(obj, methodID->parseddesc, blk, args, TYPE_ADR);
403 /* printf("parameter: obj: %p",blk[0].item); */
404 STATS(jnicallXmethodnvokation();)
405 ret = asm_calljavafunction2(methodID,
407 (argcount + 1) * sizeof(jni_callblock),
409 MFREE(blk, jni_callblock, argcount + 1);
410 /* printf("(CallObjectMethodV)-->%p\n",ret); */
417 core function for integer class methods (bool, byte, short, integer)
418 This is basically needed for i386
420 static jint callIntegerMethod(jobject obj, jmethodID methodID, int retType, va_list args)
426 STATS(jniinvokation();)
429 log_text("JNI-Call: CallObjectMethodV");
430 utf_display(methodID->name);
431 utf_display(methodID->descriptor);
432 printf("\nParmaeter count: %d\n",argcount);
433 utf_display(obj->vftbl->class->name);
437 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
441 argcount = methodID->parseddesc->paramcount;
443 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
444 ((!(methodID->flags & ACC_STATIC)) && (obj != 0)) )) {
445 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
449 if (obj && !builtin_instanceof(obj, methodID->class)) {
450 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
456 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
457 log_text("Too many arguments. CallIntegerMethod does not support that");
462 blk = MNEW(jni_callblock, /*4 */ argcount+2);
464 fill_callblock(obj, methodID->parseddesc, blk, args, retType);
466 /* printf("parameter: obj: %p",blk[0].item); */
467 STATS(jnicallXmethodnvokation();)
468 ret = asm_calljavafunction2int(methodID,
470 (argcount + 1) * sizeof(jni_callblock),
473 MFREE(blk, jni_callblock, argcount + 1);
474 /* printf("(CallObjectMethodV)-->%p\n",ret); */
480 /*core function for long class functions*/
481 static jlong callLongMethod(jobject obj, jmethodID methodID, va_list args)
487 STATS(jniinvokation();)
490 log_text("JNI-Call: CallObjectMethodV");
491 utf_display(methodID->name);
492 utf_display(methodID->descriptor);
493 printf("\nParmaeter count: %d\n",argcount);
494 utf_display(obj->vftbl->class->name);
498 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
502 argcount = methodID->parseddesc->paramcount;
504 if (!( ((methodID->flags & ACC_STATIC) && (obj == 0)) ||
505 ((!(methodID->flags & ACC_STATIC)) && (obj!=0)) )) {
506 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
510 if (obj && !builtin_instanceof(obj,methodID->class)) {
511 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
517 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
518 log_text("Too many arguments. CallObjectMethod does not support that");
523 blk = MNEW(jni_callblock,/* 4 */argcount+2);
525 fill_callblock(obj, methodID->parseddesc, blk, args, TYPE_LNG);
527 /* printf("parameter: obj: %p",blk[0].item); */
528 STATS(jnicallXmethodnvokation();)
529 ret = asm_calljavafunction2long(methodID,
531 (argcount + 1) * sizeof(jni_callblock),
534 MFREE(blk, jni_callblock, argcount + 1);
535 /* printf("(CallObjectMethodV)-->%p\n",ret); */
541 /*core function for float class methods (float,double)*/
542 static jdouble callFloatMethod(jobject obj, jmethodID methodID, va_list args,int retType)
544 int argcount = methodID->parseddesc->paramcount;
548 STATS(jniinvokation();)
551 log_text("JNI-Call: CallObjectMethodV");
552 utf_display(methodID->name);
553 utf_display(methodID->descriptor);
554 printf("\nParmaeter count: %d\n",argcount);
555 utf_display(obj->vftbl->class->name);
561 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
562 log_text("Too many arguments. CallObjectMethod does not support that");
567 blk = MNEW(jni_callblock, /*4 */ argcount+2);
569 fill_callblock(obj, methodID->parseddesc, blk, args, retType);
571 /* printf("parameter: obj: %p",blk[0].item); */
572 STATS(jnicallXmethodnvokation();)
573 ret = asm_calljavafunction2double(methodID,
575 (argcount + 1) * sizeof(jni_callblock),
578 MFREE(blk, jni_callblock, argcount + 1);
579 /* printf("(CallObjectMethodV)-->%p\n",ret); */
585 /*************************** function: jclass_findfield ****************************
587 searches for field with specified name and type in a 'classinfo'-structur
588 if no such field is found NULL is returned
590 ************************************************************************************/
592 static fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
595 STATS(jniinvokation();)
597 /* printf(" FieldCount: %d\n",c->fieldscount);
598 utf_display(c->name); */
599 for (i = 0; i < c->fieldscount; i++) {
600 /* utf_display(c->fields[i].name);
602 utf_display(c->fields[i].descriptor);
604 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
605 return &(c->fields[i]);
608 if (c->super.cls) return jclass_findfield(c->super.cls,name,desc);
614 /* GetVersion ******************************************************************
616 Returns the major version number in the higher 16 bits and the
617 minor version number in the lower 16 bits.
619 *******************************************************************************/
621 jint GetVersion(JNIEnv *env)
623 /* GNU classpath currently supports JNI 1.2 */
624 STATS(jniinvokation();)
625 return JNI_VERSION_1_2;
629 /* Class Operations ***********************************************************/
631 /* DefineClass *****************************************************************
633 Loads a class from a buffer of raw class data. The buffer
634 containing the raw class data is not referenced by the VM after the
635 DefineClass call returns, and it may be discarded if desired.
637 *******************************************************************************/
639 jclass DefineClass(JNIEnv *env, const char *name, jobject loader,
640 const jbyte *buf, jsize bufLen)
642 java_lang_ClassLoader *cl;
647 STATS(jniinvokation();)
649 cl = (java_lang_ClassLoader *) loader;
650 s = javastring_new_char(name);
651 ba = (java_bytearray *) buf;
653 c = (jclass) Java_java_lang_VMClassLoader_defineClass(env, NULL, cl, s, ba,
660 /* FindClass *******************************************************************
662 This function loads a locally-defined class. It searches the
663 directories and zip files specified by the CLASSPATH environment
664 variable for the class with the specified name.
666 *******************************************************************************/
668 jclass FindClass(JNIEnv *env, const char *name)
671 STATS(jniinvokation();)
673 if (!load_class_bootstrap(utf_new_char_classname((char *) name), &c))
679 use_class_as_object(c);
685 /*******************************************************************************
687 converts java.lang.reflect.Method or
688 java.lang.reflect.Constructor object to a method ID
690 *******************************************************************************/
692 jmethodID FromReflectedMethod(JNIEnv* env, jobject method_or_constr)
694 struct methodinfo *mi;
698 STATS(jniinvokation();)
700 if (method_or_constr==0) return 0;
702 if (builtin_instanceof(method_or_constr, class_java_lang_reflect_Method))
704 java_lang_reflect_Method *rm=(java_lang_reflect_Method*) method_or_constr;
706 c= (classinfo *) (rm->declaringClass);
708 else if (builtin_instanceof(method_or_constr, class_java_lang_reflect_Constructor))
710 java_lang_reflect_Constructor *rc=(java_lang_reflect_Constructor*) method_or_constr;
712 c= (classinfo*) (rc->clazz);
717 printf ("slot %d,methodscount %d\n",slot,c->methodscount);
718 if ((slot < 0) || (slot >= c->methodscount)) {
719 /*this usually means a severe internal cacao error or somebody
720 tempered around with the reflected method*/
721 log_text("error illegal slot for method in class(FromReflectedMethod)");
724 mi = &(c->methods[slot]);
729 /* GetSuperclass ***************************************************************
731 If clazz represents any class other than the class Object, then
732 this function returns the object that represents the superclass of
733 the class specified by clazz.
735 *******************************************************************************/
737 jclass GetSuperclass(JNIEnv *env, jclass sub)
740 STATS(jniinvokation();)
742 c = ((classinfo *) sub)->super.cls;
747 use_class_as_object(c);
753 /* IsAssignableFrom ************************************************************
755 Determines whether an object of sub can be safely cast to sup.
757 *******************************************************************************/
759 jboolean IsAssignableFrom(JNIEnv *env, jclass sub, jclass sup)
761 STATS(jniinvokation();)
762 return Java_java_lang_VMClass_isAssignableFrom(env,
764 (java_lang_Class *) sup,
765 (java_lang_Class *) sub);
769 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
771 jobject ToReflectedField(JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
773 log_text("JNI-Call: ToReflectedField: IMPLEMENT ME!!!");
774 STATS(jniinvokation();)
779 /* Throw ***********************************************************************
781 Causes a java.lang.Throwable object to be thrown.
783 *******************************************************************************/
785 jint Throw(JNIEnv *env, jthrowable obj)
787 *exceptionptr = (java_objectheader *) obj;
788 STATS(jniinvokation();)
794 /* ThrowNew ********************************************************************
796 Constructs an exception object from the specified class with the
797 message specified by message and causes that exception to be
800 *******************************************************************************/
802 jint ThrowNew(JNIEnv* env, jclass clazz, const char *msg)
804 java_lang_Throwable *o;
806 STATS(jniinvokation();)
808 s = (java_lang_String *) javastring_new_char(msg);
810 /* instantiate exception object */
812 o = (java_lang_Throwable *) native_new_and_init_string((classinfo *) clazz,
818 *exceptionptr = (java_objectheader *) o;
824 /* ExceptionOccurred ***********************************************************
826 Determines if an exception is being thrown. The exception stays
827 being thrown until either the native code calls ExceptionClear(),
828 or the Java code handles the exception.
830 *******************************************************************************/
832 jthrowable ExceptionOccurred(JNIEnv *env)
834 STATS(jniinvokation();)
835 return (jthrowable) *exceptionptr;
839 /* ExceptionDescribe ***********************************************************
841 Prints an exception and a backtrace of the stack to a system
842 error-reporting channel, such as stderr. This is a convenience
843 routine provided for debugging.
845 *******************************************************************************/
847 void ExceptionDescribe(JNIEnv *env)
849 java_objectheader *e;
851 STATS(jniinvokation();)
856 /* clear exception, because we are calling jit code again */
858 *exceptionptr = NULL;
860 /* get printStackTrace method from exception class */
862 m = class_resolveclassmethod(e->vftbl->class,
869 /* XXX what should we do? */
872 /* print the stacktrace */
874 asm_calljavafunction(m, e, NULL, NULL, NULL);
879 /* ExceptionClear **************************************************************
881 Clears any exception that is currently being thrown. If no
882 exception is currently being thrown, this routine has no effect.
884 *******************************************************************************/
886 void ExceptionClear(JNIEnv *env)
888 STATS(jniinvokation();)
889 *exceptionptr = NULL;
893 /* FatalError ******************************************************************
895 Raises a fatal error and does not expect the VM to recover. This
896 function does not return.
898 *******************************************************************************/
900 void FatalError(JNIEnv *env, const char *msg)
902 STATS(jniinvokation();)
903 throw_cacao_exception_exit(string_java_lang_InternalError, msg);
907 /******************* creates a new local reference frame **************************/
909 jint PushLocalFrame(JNIEnv* env, jint capacity)
911 log_text("JNI-Call: PushLocalFrame: IMPLEMENT ME!");
912 STATS(jniinvokation();)
917 /**************** Pops off the current local reference frame **********************/
919 jobject PopLocalFrame(JNIEnv* env, jobject result)
921 log_text("JNI-Call: PopLocalFrame: IMPLEMENT ME!");
922 STATS(jniinvokation();)
928 /* DeleteLocalRef **************************************************************
930 Deletes the local reference pointed to by localRef.
932 *******************************************************************************/
934 void DeleteLocalRef(JNIEnv *env, jobject localRef)
936 log_text("JNI-Call: DeleteLocalRef: IMPLEMENT ME!");
937 STATS(jniinvokation();)
942 /* IsSameObject ****************************************************************
944 Tests whether two references refer to the same Java object.
946 *******************************************************************************/
948 jboolean IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
950 STATS(jniinvokation();)
951 return (ref1 == ref2);
955 /* NewLocalRef *****************************************************************
957 Creates a new local reference that refers to the same object as ref.
959 *******************************************************************************/
961 jobject NewLocalRef(JNIEnv *env, jobject ref)
963 log_text("JNI-Call: NewLocalRef: IMPLEMENT ME!");
964 STATS(jniinvokation();)
968 /***********************************************************************************
970 Ensures that at least a given number of local references can
971 be created in the current thread
973 **********************************************************************************/
975 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
977 STATS(jniinvokation();)
978 return 0; /* return 0 on success */
982 /* AllocObject *****************************************************************
984 Allocates a new Java object without invoking any of the
985 constructors for the object. Returns a reference to the object.
987 *******************************************************************************/
989 jobject AllocObject(JNIEnv *env, jclass clazz)
991 java_objectheader *o;
992 STATS(jniinvokation();)
994 if ((clazz->flags & ACC_INTERFACE) || (clazz->flags & ACC_ABSTRACT)) {
996 new_exception_utfmessage(string_java_lang_InstantiationException,
1001 o = builtin_new(clazz);
1007 /* NewObject *******************************************************************
1009 Constructs a new Java object. The method ID indicates which
1010 constructor method to invoke. This ID must be obtained by calling
1011 GetMethodID() with <init> as the method name and void (V) as the
1014 *******************************************************************************/
1016 jobject NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1018 java_objectheader *o;
1020 int argcount=methodID->parseddesc->paramcount;
1023 STATS(jniinvokation();)
1027 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
1028 log_text("Too many arguments. NewObject does not support that");
1035 o = builtin_new(clazz);
1040 va_start(vaargs, methodID);
1041 for (i = 0; i < argcount; i++) {
1042 args[i] = va_arg(vaargs, void*);
1046 /* call constructor */
1048 asm_calljavafunction(methodID, o, args[0], args[1], args[2]);
1054 /***********************************************************************************
1056 Constructs a new Java object
1057 arguments that are to be passed to the constructor are placed in va_list args
1059 ***********************************************************************************/
1061 jobject NewObjectV(JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
1063 log_text("JNI-Call: NewObjectV");
1064 STATS(jniinvokation();)
1070 /***********************************************************************************
1072 Constructs a new Java object
1073 arguments that are to be passed to the constructor are placed in
1074 args array of jvalues
1076 ***********************************************************************************/
1078 jobject NewObjectA(JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
1080 log_text("JNI-Call: NewObjectA");
1081 STATS(jniinvokation();)
1087 /* GetObjectClass **************************************************************
1089 Returns the class of an object.
1091 *******************************************************************************/
1093 jclass GetObjectClass(JNIEnv *env, jobject obj)
1096 STATS(jniinvokation();)
1098 if (!obj || !obj->vftbl)
1101 c = obj->vftbl->class;
1102 use_class_as_object(c);
1107 /* IsInstanceOf ****************************************************************
1109 Tests whether an object is an instance of a class.
1111 *******************************************************************************/
1113 jboolean IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
1115 STATS(jniinvokation();)
1117 return Java_java_lang_VMClass_isInstance(env,
1119 (java_lang_Class *) clazz,
1120 (java_lang_Object *) obj);
1124 /***************** converts a java.lang.reflect.Field to a field ID ***************/
1126 jfieldID FromReflectedField(JNIEnv* env, jobject field)
1128 java_lang_reflect_Field *f;
1130 jfieldID fid; /* the JNI-fieldid of the wrapping object */
1131 STATS(jniinvokation();)
1132 /*log_text("JNI-Call: FromReflectedField");*/
1134 f=(java_lang_reflect_Field *)field;
1136 c=(classinfo*)(f->declaringClass);
1137 if ( (f->slot<0) || (f->slot>=c->fieldscount)) {
1138 /*this usually means a severe internal cacao error or somebody
1139 tempered around with the reflected method*/
1140 log_text("error illegal slot for field in class(FromReflectedField)");
1143 fid=&(c->fields[f->slot]);
1148 /**********************************************************************************
1150 converts a method ID to a java.lang.reflect.Method or
1151 java.lang.reflect.Constructor object
1153 **********************************************************************************/
1155 jobject ToReflectedMethod(JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
1157 log_text("JNI-Call: ToReflectedMethod");
1158 STATS(jniinvokation();)
1164 /* GetMethodID *****************************************************************
1166 returns the method ID for an instance method
1168 *******************************************************************************/
1170 jmethodID GetMethodID(JNIEnv* env, jclass clazz, const char *name, const char *sig)
1173 STATS(jniinvokation();)
1175 m = class_resolvemethod(clazz,
1176 utf_new_char((char *) name),
1177 utf_new_char((char *) sig));
1179 if (!m || (m->flags & ACC_STATIC)) {
1181 new_exception_message(string_java_lang_NoSuchMethodError, name);
1190 /******************** JNI-functions for calling instance methods ******************/
1192 jobject CallObjectMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1196 STATS(jniinvokation();)
1198 /* log_text("JNI-Call: CallObjectMethod");*/
1200 va_start(vaargs, methodID);
1201 ret = callObjectMethod(obj, methodID, vaargs);
1208 jobject CallObjectMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1210 STATS(jniinvokation();)
1211 return callObjectMethod(obj,methodID,args);
1215 jobject CallObjectMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1217 log_text("JNI-Call: CallObjectMethodA");
1218 STATS(jniinvokation();)
1226 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1230 STATS(jniinvokation();)
1232 /* log_text("JNI-Call: CallBooleanMethod");*/
1234 va_start(vaargs,methodID);
1235 ret = (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BOOLEAN,vaargs);
1241 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1243 STATS(jniinvokation();)
1245 return (jboolean)callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BOOLEAN,args);
1249 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1251 STATS(jniinvokation();)
1252 log_text("JNI-Call: CallBooleanMethodA");
1257 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
1261 STATS(jniinvokation();)
1263 /* log_text("JNI-Call: CallVyteMethod");*/
1265 va_start(vaargs,methodID);
1266 ret = callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_BYTE,vaargs);
1272 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1274 /* log_text("JNI-Call: CallByteMethodV");*/
1275 STATS(jniinvokation();)
1277 return callIntegerMethod(obj,methodID,PRIMITIVETYPE_BYTE,args);
1281 jbyte CallByteMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1283 log_text("JNI-Call: CallByteMethodA");
1284 STATS(jniinvokation();)
1290 jchar CallCharMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1294 STATS(jniinvokation();)
1296 /* log_text("JNI-Call: CallCharMethod");*/
1298 va_start(vaargs,methodID);
1299 ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_CHAR, vaargs);
1306 jchar CallCharMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1308 STATS(jniinvokation();)
1310 /* log_text("JNI-Call: CallCharMethodV");*/
1311 return callIntegerMethod(obj,get_virtual(obj,methodID),PRIMITIVETYPE_CHAR,args);
1315 jchar CallCharMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1317 STATS(jniinvokation();)
1319 log_text("JNI-Call: CallCharMethodA");
1325 jshort CallShortMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1329 STATS(jniinvokation();)
1331 /* log_text("JNI-Call: CallShortMethod");*/
1333 va_start(vaargs, methodID);
1334 ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_SHORT, vaargs);
1341 jshort CallShortMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1343 STATS(jniinvokation();)
1344 return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_SHORT, args);
1348 jshort CallShortMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1350 STATS(jniinvokation();)
1351 log_text("JNI-Call: CallShortMethodA");
1358 jint CallIntMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1362 STATS(jniinvokation();)
1364 va_start(vaargs,methodID);
1365 ret = callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, vaargs);
1372 jint CallIntMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1374 STATS(jniinvokation();)
1375 return callIntegerMethod(obj, get_virtual(obj, methodID),PRIMITIVETYPE_INT, args);
1379 jint CallIntMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1381 STATS(jniinvokation();)
1382 log_text("JNI-Call: CallIntMethodA");
1389 jlong CallLongMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1393 STATS(jniinvokation();)
1395 va_start(vaargs,methodID);
1396 ret = callLongMethod(obj,get_virtual(obj, methodID),vaargs);
1403 jlong CallLongMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1405 STATS(jniinvokation();)
1406 return callLongMethod(obj,get_virtual(obj, methodID),args);
1410 jlong CallLongMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1412 STATS(jniinvokation();)
1413 log_text("JNI-Call: CallLongMethodA");
1420 jfloat CallFloatMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1425 STATS(jniinvokation();)
1426 /* log_text("JNI-Call: CallFloatMethod");*/
1428 va_start(vaargs,methodID);
1429 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, PRIMITIVETYPE_FLOAT);
1436 jfloat CallFloatMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1438 STATS(jniinvokation();)
1439 log_text("JNI-Call: CallFloatMethodV");
1440 return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_FLOAT);
1444 jfloat CallFloatMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1446 STATS(jniinvokation();)
1447 log_text("JNI-Call: CallFloatMethodA");
1454 jdouble CallDoubleMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1458 STATS(jniinvokation();)
1460 /* log_text("JNI-Call: CallDoubleMethod");*/
1462 va_start(vaargs,methodID);
1463 ret = callFloatMethod(obj, get_virtual(obj, methodID), vaargs, PRIMITIVETYPE_DOUBLE);
1470 jdouble CallDoubleMethodV(JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1472 STATS(jniinvokation();)
1473 log_text("JNI-Call: CallDoubleMethodV");
1474 return callFloatMethod(obj, get_virtual(obj, methodID), args, PRIMITIVETYPE_DOUBLE);
1478 jdouble CallDoubleMethodA(JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
1480 STATS(jniinvokation();)
1481 log_text("JNI-Call: CallDoubleMethodA");
1487 void CallVoidMethod(JNIEnv *env, jobject obj, jmethodID methodID, ...)
1490 STATS(jniinvokation();)
1492 va_start(vaargs,methodID);
1493 (void) callIntegerMethod(obj, get_virtual(obj, methodID),TYPE_VOID, vaargs);
1498 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
1500 log_text("JNI-Call: CallVoidMethodV");
1501 STATS(jniinvokation();)
1502 (void)callIntegerMethod(obj,get_virtual(obj,methodID),TYPE_VOID,args);
1506 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
1508 STATS(jniinvokation();)
1509 log_text("JNI-Call: CallVoidMethodA");
1514 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1516 STATS(jniinvokation();)
1517 log_text("JNI-Call: CallNonvirtualObjectMethod");
1523 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1525 STATS(jniinvokation();)
1526 log_text("JNI-Call: CallNonvirtualObjectMethodV");
1532 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1534 STATS(jniinvokation();)
1535 log_text("JNI-Call: CallNonvirtualObjectMethodA");
1542 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1546 STATS(jniinvokation();)
1548 /* log_text("JNI-Call: CallNonvirtualBooleanMethod");*/
1550 va_start(vaargs,methodID);
1551 ret = (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,vaargs);
1558 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1560 STATS(jniinvokation();)
1561 /* log_text("JNI-Call: CallNonvirtualBooleanMethodV");*/
1562 return (jboolean)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BOOLEAN,args);
1566 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1568 STATS(jniinvokation();)
1569 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
1576 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1581 STATS(jniinvokation();)
1582 /* log_text("JNI-Call: CallNonvirutalByteMethod");*/
1584 va_start(vaargs,methodID);
1585 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,vaargs);
1591 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1593 STATS(jniinvokation();)
1594 /*log_text("JNI-Call: CallNonvirtualByteMethodV"); */
1595 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_BYTE,args);
1600 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1602 STATS(jniinvokation();)
1603 log_text("JNI-Call: CallNonvirtualByteMethodA");
1610 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1615 STATS(jniinvokation();)
1616 /* log_text("JNI-Call: CallNonVirtualCharMethod");*/
1618 va_start(vaargs,methodID);
1619 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,vaargs);
1625 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1627 STATS(jniinvokation();)
1628 /*log_text("JNI-Call: CallNonvirtualCharMethodV");*/
1629 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_CHAR,args);
1633 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1635 STATS(jniinvokation();)
1636 log_text("JNI-Call: CallNonvirtualCharMethodA");
1643 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1647 STATS(jniinvokation();)
1649 /*log_text("JNI-Call: CallNonvirtualShortMethod");*/
1651 va_start(vaargs,methodID);
1652 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,vaargs);
1658 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1660 STATS(jniinvokation();)
1661 /*log_text("JNI-Call: CallNonvirtualShortMethodV");*/
1662 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_SHORT,args);
1666 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1668 STATS(jniinvokation();)
1669 log_text("JNI-Call: CallNonvirtualShortMethodA");
1676 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1681 STATS(jniinvokation();)
1683 /*log_text("JNI-Call: CallNonvirtualIntMethod");*/
1685 va_start(vaargs,methodID);
1686 ret = callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,vaargs);
1692 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1694 STATS(jniinvokation();)
1695 /*log_text("JNI-Call: CallNonvirtualIntMethodV");*/
1696 return callIntegerMethod(obj,get_nonvirtual(clazz,methodID),PRIMITIVETYPE_INT,args);
1700 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1702 STATS(jniinvokation();)
1703 log_text("JNI-Call: CallNonvirtualIntMethodA");
1710 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1712 STATS(jniinvokation();)
1713 log_text("JNI-Call: CallNonvirtualLongMethod");
1719 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1721 STATS(jniinvokation();)
1722 log_text("JNI-Call: CallNonvirtualLongMethodV");
1728 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1730 STATS(jniinvokation();)
1731 log_text("JNI-Call: CallNonvirtualLongMethodA");
1738 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1742 STATS(jniinvokation();)
1744 /*log_text("JNI-Call: CallNonvirtualFloatMethod");*/
1747 va_start(vaargs,methodID);
1748 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_FLOAT);
1755 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1757 STATS(jniinvokation();)
1758 log_text("JNI-Call: CallNonvirtualFloatMethodV");
1759 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_FLOAT);
1763 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1765 STATS(jniinvokation();)
1766 log_text("JNI-Call: CallNonvirtualFloatMethodA");
1773 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1777 STATS(jniinvokation();)
1778 log_text("JNI-Call: CallNonvirtualDoubleMethod");
1780 va_start(vaargs,methodID);
1781 ret = callFloatMethod(obj,get_nonvirtual(clazz,methodID),vaargs,PRIMITIVETYPE_DOUBLE);
1788 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1790 STATS(jniinvokation();)
1791 /* log_text("JNI-Call: CallNonvirtualDoubleMethodV");*/
1792 return callFloatMethod(obj,get_nonvirtual(clazz,methodID),args,PRIMITIVETYPE_DOUBLE);
1796 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
1798 STATS(jniinvokation();)
1799 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
1806 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
1809 STATS(jniinvokation();)
1811 /* log_text("JNI-Call: CallNonvirtualVoidMethod");*/
1813 va_start(vaargs,methodID);
1814 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,vaargs);
1820 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
1822 /* log_text("JNI-Call: CallNonvirtualVoidMethodV");*/
1823 STATS(jniinvokation();)
1825 (void)callIntegerMethod(obj,get_nonvirtual(clazz,methodID),TYPE_VOID,args);
1830 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
1832 STATS(jniinvokation();)
1833 log_text("JNI-Call: CallNonvirtualVoidMethodA");
1836 /************************* JNI-functions for accessing fields ************************/
1838 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1841 STATS(jniinvokation();)
1843 /* log_text("========================= searching for:");
1846 f = jclass_findfield(clazz,
1847 utf_new_char ((char*) name),
1848 utf_new_char ((char*) sig)
1852 /*utf_display(clazz->name);
1855 *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);
1860 /*************************** retrieve fieldid, abort on error ************************/
1862 jfieldID getFieldID_critical(JNIEnv *env, jclass clazz, char *name, char *sig)
1864 jfieldID id = GetFieldID(env, clazz, name, sig);
1865 STATS(jniinvokation();)
1869 utf_display(clazz->name);
1870 log_text("\nfield:");
1875 log_text("setfield_critical failed");
1881 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
1884 jobject dbg,dretval,*dpretval;
1885 long int dli1, dli2, dli3;
1887 printf("GetObjectField(1): thread: %s obj: %p name: %s desc: %s \n",GetStringUTFChars(env,
1888 ((threadobject *) THREADOBJECT)->o
1890 ,obj,((fieldinfo*)fieldID)->name->text,(fieldID->descriptor)->text);
1892 dbg = getField(obj,jobject,fieldID);
1893 dli1 = (long int) obj;
1894 dli2 = (long int) fieldID->offset;
1896 dpretval = (jobject*) dli3;
1897 dretval = *dpretval;
1902 tmp = FindClass(env, "java/lang/Object");
1903 mid = GetMethodID(env,tmp,"toString","()Ljava/lang/String;");
1904 jstr = CallObjectMethod(env,dbg,mid);*/
1906 /* printf("GetObjectField(2): retval %p (obj: %#lx + offset: %#lx = %#lx (jobject*) %p (jobject) %p\n"
1907 ,dbg, dli1, dli2, dli3,dpretval, dretval);*/
1911 STATS(jniinvokation();)
1913 return getField(obj,jobject,fieldID);
1916 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
1918 STATS(jniinvokation();)
1919 return getField(obj,jboolean,fieldID);
1923 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
1925 STATS(jniinvokation();)
1926 return getField(obj,jbyte,fieldID);
1930 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
1932 STATS(jniinvokation();)
1933 return getField(obj,jchar,fieldID);
1937 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
1939 STATS(jniinvokation();)
1940 return getField(obj,jshort,fieldID);
1944 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
1946 STATS(jniinvokation();)
1947 return getField(obj,jint,fieldID);
1951 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
1953 STATS(jniinvokation();)
1954 return getField(obj,jlong,fieldID);
1958 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
1960 STATS(jniinvokation();)
1961 return getField(obj,jfloat,fieldID);
1965 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
1967 STATS(jniinvokation();)
1968 return getField(obj,jdouble,fieldID);
1971 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
1973 STATS(jniinvokation();)
1974 setField(obj,jobject,fieldID,val);
1978 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
1980 STATS(jniinvokation();)
1981 setField(obj,jboolean,fieldID,val);
1985 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
1987 STATS(jniinvokation();)
1988 setField(obj,jbyte,fieldID,val);
1992 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
1994 STATS(jniinvokation();)
1995 setField(obj,jchar,fieldID,val);
1999 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
2001 STATS(jniinvokation();)
2002 setField(obj,jshort,fieldID,val);
2006 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
2008 STATS(jniinvokation();)
2009 setField(obj,jint,fieldID,val);
2013 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
2015 STATS(jniinvokation();)
2016 setField(obj,jlong,fieldID,val);
2020 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
2022 STATS(jniinvokation();)
2023 setField(obj,jfloat,fieldID,val);
2027 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
2029 STATS(jniinvokation();)
2030 setField(obj,jdouble,fieldID,val);
2034 /**************** JNI-functions for calling static methods **********************/
2036 jmethodID GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
2039 STATS(jniinvokation();)
2041 m = class_resolvemethod(clazz,
2042 utf_new_char((char *) name),
2043 utf_new_char((char *) sig));
2045 if (!m || !(m->flags & ACC_STATIC)) {
2047 new_exception_message(string_java_lang_NoSuchMethodError, name);
2056 jobject CallStaticObjectMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2060 STATS(jniinvokation();)
2062 /* log_text("JNI-Call: CallStaticObjectMethod");*/
2064 va_start(vaargs, methodID);
2065 ret = callObjectMethod(0, methodID, vaargs);
2072 jobject CallStaticObjectMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2074 STATS(jniinvokation();)
2075 /* log_text("JNI-Call: CallStaticObjectMethodV"); */
2077 return callObjectMethod(0,methodID,args);
2081 jobject CallStaticObjectMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2083 STATS(jniinvokation();)
2084 log_text("JNI-Call: CallStaticObjectMethodA");
2090 jboolean CallStaticBooleanMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2094 STATS(jniinvokation();)
2096 va_start(vaargs, methodID);
2097 ret = (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, vaargs);
2104 jboolean CallStaticBooleanMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2106 STATS(jniinvokation();)
2107 return (jboolean) callIntegerMethod(0, methodID, PRIMITIVETYPE_BOOLEAN, args);
2111 jboolean CallStaticBooleanMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2113 STATS(jniinvokation();)
2114 log_text("JNI-Call: CallStaticBooleanMethodA");
2120 jbyte CallStaticByteMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2124 STATS(jniinvokation();)
2126 /* log_text("JNI-Call: CallStaticByteMethod");*/
2128 va_start(vaargs, methodID);
2129 ret = (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, vaargs);
2136 jbyte CallStaticByteMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2138 STATS(jniinvokation();)
2139 return (jbyte) callIntegerMethod(0, methodID, PRIMITIVETYPE_BYTE, args);
2143 jbyte CallStaticByteMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2145 STATS(jniinvokation();)
2146 log_text("JNI-Call: CallStaticByteMethodA");
2152 jchar CallStaticCharMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2156 STATS(jniinvokation();)
2158 /* log_text("JNI-Call: CallStaticByteMethod");*/
2160 va_start(vaargs, methodID);
2161 ret = (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, vaargs);
2168 jchar CallStaticCharMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2170 STATS(jniinvokation();)
2171 return (jchar) callIntegerMethod(0, methodID, PRIMITIVETYPE_CHAR, args);
2175 jchar CallStaticCharMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2177 STATS(jniinvokation();)
2178 log_text("JNI-Call: CallStaticCharMethodA");
2185 jshort CallStaticShortMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2189 STATS(jniinvokation();)
2191 /* log_text("JNI-Call: CallStaticByteMethod");*/
2193 va_start(vaargs, methodID);
2194 ret = (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, vaargs);
2201 jshort CallStaticShortMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2203 STATS(jniinvokation();)
2204 /*log_text("JNI-Call: CallStaticShortMethodV");*/
2205 return (jshort) callIntegerMethod(0, methodID, PRIMITIVETYPE_SHORT, args);
2209 jshort CallStaticShortMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2211 STATS(jniinvokation();)
2212 log_text("JNI-Call: CallStaticShortMethodA");
2219 jint CallStaticIntMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2223 STATS(jniinvokation();)
2225 /* log_text("JNI-Call: CallStaticIntMethod");*/
2227 va_start(vaargs, methodID);
2228 ret = callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, vaargs);
2235 jint CallStaticIntMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2237 STATS(jniinvokation();)
2238 log_text("JNI-Call: CallStaticIntMethodV");
2240 return callIntegerMethod(0, methodID, PRIMITIVETYPE_INT, args);
2244 jint CallStaticIntMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2246 STATS(jniinvokation();)
2247 log_text("JNI-Call: CallStaticIntMethodA");
2254 jlong CallStaticLongMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2258 STATS(jniinvokation();)
2260 /* log_text("JNI-Call: CallStaticLongMethod");*/
2262 va_start(vaargs, methodID);
2263 ret = callLongMethod(0, methodID, vaargs);
2270 jlong CallStaticLongMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2272 STATS(jniinvokation();)
2273 log_text("JNI-Call: CallStaticLongMethodV");
2275 return callLongMethod(0,methodID,args);
2279 jlong CallStaticLongMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2281 STATS(jniinvokation();)
2282 log_text("JNI-Call: CallStaticLongMethodA");
2289 jfloat CallStaticFloatMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2293 STATS(jniinvokation();)
2295 /* log_text("JNI-Call: CallStaticLongMethod");*/
2297 va_start(vaargs, methodID);
2298 ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_FLOAT);
2305 jfloat CallStaticFloatMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2307 STATS(jniinvokation();)
2309 return callFloatMethod(0, methodID, args, PRIMITIVETYPE_FLOAT);
2314 jfloat CallStaticFloatMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2316 STATS(jniinvokation();)
2317 log_text("JNI-Call: CallStaticFloatMethodA");
2324 jdouble CallStaticDoubleMethod(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
2328 STATS(jniinvokation();)
2330 /* log_text("JNI-Call: CallStaticDoubleMethod");*/
2332 va_start(vaargs,methodID);
2333 ret = callFloatMethod(0, methodID, vaargs, PRIMITIVETYPE_DOUBLE);
2340 jdouble CallStaticDoubleMethodV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
2342 STATS(jniinvokation();)
2343 log_text("JNI-Call: CallStaticDoubleMethodV");
2345 return callFloatMethod(0, methodID, args, PRIMITIVETYPE_DOUBLE);
2349 jdouble CallStaticDoubleMethodA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
2351 STATS(jniinvokation();)
2352 log_text("JNI-Call: CallStaticDoubleMethodA");
2358 void CallStaticVoidMethod(JNIEnv *env, jclass cls, jmethodID methodID, ...)
2361 STATS(jniinvokation();)
2363 va_start(vaargs, methodID);
2364 (void) callIntegerMethod(0, methodID, TYPE_VOID, vaargs);
2369 void CallStaticVoidMethodV(JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
2371 log_text("JNI-Call: CallStaticVoidMethodV");
2372 STATS(jniinvokation();)
2373 (void)callIntegerMethod(0, methodID, TYPE_VOID, args);
2377 void CallStaticVoidMethodA(JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
2379 STATS(jniinvokation();)
2380 log_text("JNI-Call: CallStaticVoidMethodA");
2384 /* Accessing Static Fields ****************************************************/
2386 /* GetStaticFieldID ************************************************************
2388 Returns the field ID for a static field of a class. The field is
2389 specified by its name and signature. The GetStatic<type>Field and
2390 SetStatic<type>Field families of accessor functions use field IDs
2391 to retrieve static fields.
2393 *******************************************************************************/
2395 jfieldID GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
2398 STATS(jniinvokation();)
2400 f = jclass_findfield(clazz,
2401 utf_new_char((char *) name),
2402 utf_new_char((char *) sig));
2405 *exceptionptr = new_exception(string_java_lang_NoSuchFieldError);
2411 /* GetStatic<type>Field ********************************************************
2413 This family of accessor routines returns the value of a static
2416 *******************************************************************************/
2418 jobject GetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2420 STATS(jniinvokation();)
2421 JWCLINITDEBUG(printf("GetStaticObjectField: calling initialize_class %s\n",clazz->name->text);)
2422 if (!initialize_class(clazz))
2425 return fieldID->value.a;
2429 jboolean GetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2431 STATS(jniinvokation();)
2432 JWCLINITDEBUG(printf("GetStaticBooleanField: calling initialize_class %s\n",clazz->name->text);)
2434 if (!initialize_class(clazz))
2437 return fieldID->value.i;
2441 jbyte GetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2443 STATS(jniinvokation();)
2444 JWCLINITDEBUG(printf("GetStaticByteField: calling initialize_class %s\n",clazz->name->text);)
2446 if (!initialize_class(clazz))
2449 return fieldID->value.i;
2453 jchar GetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2455 STATS(jniinvokation();)
2456 JWCLINITDEBUG(printf("GetStaticCharField: calling initialize_class %s\n",clazz->name->text);)
2458 if (!initialize_class(clazz))
2461 return fieldID->value.i;
2465 jshort GetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2467 STATS(jniinvokation();)
2468 JWCLINITDEBUG(printf("GetStaticShorttField: calling initialize_class %s\n",clazz->name->text);)
2469 if (!initialize_class(clazz))
2472 return fieldID->value.i;
2476 jint GetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2478 STATS(jniinvokation();)
2479 JWCLINITDEBUG(printf("GetStaticIntField: calling initialize_class %s\n",clazz->name->text);)
2480 if (!initialize_class(clazz))
2483 return fieldID->value.i;
2487 jlong GetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2489 STATS(jniinvokation();)
2490 JWCLINITDEBUG(printf("GetStaticLongField: calling initialize_class %s\n",clazz->name->text);)
2491 if (!initialize_class(clazz))
2494 return fieldID->value.l;
2498 jfloat GetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2500 STATS(jniinvokation();)
2501 JWCLINITDEBUG(printf("GetStaticFloatField: calling initialize_class %s\n",clazz->name->text);)
2502 if (!initialize_class(clazz))
2505 return fieldID->value.f;
2509 jdouble GetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID)
2511 STATS(jniinvokation();)
2512 JWCLINITDEBUG(printf("GetStaticDoubleField: calling initialize_class %s\n",clazz->name->text);)
2513 if (!initialize_class(clazz))
2516 return fieldID->value.d;
2520 /* SetStatic<type>Field *******************************************************
2522 This family of accessor routines sets the value of a static field
2525 *******************************************************************************/
2527 void SetStaticObjectField(JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
2529 STATS(jniinvokation();)
2530 JWCLINITDEBUG(printf("SetStaticObjectField: calling initialize_class %s\n",clazz->name->text);)
2531 if (!initialize_class(clazz))
2534 fieldID->value.a = value;
2538 void SetStaticBooleanField(JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
2540 STATS(jniinvokation();)
2541 JWCLINITDEBUG(printf("SetStaticBooleanField: calling initialize_class %s\n",clazz->name->text);)
2542 if (!initialize_class(clazz))
2545 fieldID->value.i = value;
2549 void SetStaticByteField(JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
2551 STATS(jniinvokation();)
2552 JWCLINITDEBUG(printf("SetStaticByteField: calling initialize_class %s\n",clazz->name->text);)
2553 if (!initialize_class(clazz))
2556 fieldID->value.i = value;
2560 void SetStaticCharField(JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
2562 STATS(jniinvokation();)
2563 JWCLINITDEBUG(printf("SetStaticCharField: calling initialize_class %s\n",clazz->name->text);)
2564 if (!initialize_class(clazz))
2567 fieldID->value.i = value;
2571 void SetStaticShortField(JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
2573 STATS(jniinvokation();)
2574 JWCLINITDEBUG(printf("SetStaticShortField: calling initialize_class %s\n",clazz->name->text);)
2575 if (!initialize_class(clazz))
2578 fieldID->value.i = value;
2582 void SetStaticIntField(JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
2584 STATS(jniinvokation();)
2585 JWCLINITDEBUG(printf("SetStaticIntField: calling initialize_class %s\n",clazz->name->text);)
2586 if (!initialize_class(clazz))
2589 fieldID->value.i = value;
2593 void SetStaticLongField(JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
2595 STATS(jniinvokation();)
2596 JWCLINITDEBUG(printf("SetStaticLongField: calling initialize_class %s\n",clazz->name->text);)
2597 if (!initialize_class(clazz))
2600 fieldID->value.l = value;
2604 void SetStaticFloatField(JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
2606 STATS(jniinvokation();)
2607 JWCLINITDEBUG(printf("SetStaticFloatField: calling initialize_class %s\n",clazz->name->text);)
2608 if (!initialize_class(clazz))
2611 fieldID->value.f = value;
2615 void SetStaticDoubleField(JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
2617 STATS(jniinvokation();)
2618 JWCLINITDEBUG(printf("SetStaticDoubleField: calling initialize_class %s\n",clazz->name->text);)
2619 if (!initialize_class(clazz))
2622 fieldID->value.d = value;
2626 /* NewString *******************************************************************
2628 Create new java.lang.String object from an array of Unicode
2631 *******************************************************************************/
2633 jstring NewString(JNIEnv *env, const jchar *buf, jsize len)
2635 java_lang_String *s;
2638 STATS(jniinvokation();)
2640 s = (java_lang_String *) builtin_new(class_java_lang_String);
2641 a = builtin_newarray_char(len);
2643 /* javastring or characterarray could not be created */
2648 for (i = 0; i < len; i++)
2649 a->data[i] = buf[i];
2659 static char emptyString[]="";
2660 static jchar emptyStringJ[]={0,0};
2662 /******************* returns the length of a Java string ***************************/
2664 jsize GetStringLength (JNIEnv *env, jstring str)
2666 return ((java_lang_String*) str)->count;
2670 /******************** convertes javastring to u2-array ****************************/
2672 u2 *javastring_tou2 (jstring so)
2674 java_lang_String *s = (java_lang_String*) so;
2678 STATS(jniinvokation();)
2680 if (!s) return NULL;
2683 if (!a) return NULL;
2685 /* allocate memory */
2686 stringbuffer = MNEW( u2 , s->count + 1 );
2689 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
2691 /* terminate string */
2692 stringbuffer[i] = '\0';
2694 return stringbuffer;
2697 /********* returns a pointer to an array of Unicode characters of the string *******/
2699 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
2701 jchar *jc=javastring_tou2(str);
2702 STATS(jniinvokation();)
2705 if (isCopy) *isCopy=JNI_TRUE;
2708 if (isCopy) *isCopy=JNI_TRUE;
2709 return emptyStringJ;
2712 /**************** native code no longer needs access to chars **********************/
2714 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
2716 STATS(jniinvokation();)
2717 if (chars==emptyStringJ) return;
2718 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
2722 /* NewStringUTF ****************************************************************
2724 Constructs a new java.lang.String object from an array of UTF-8 characters.
2726 *******************************************************************************/
2728 jstring NewStringUTF(JNIEnv *env, const char *bytes)
2730 STATS(jniinvokation();)
2731 return (jstring) javastring_new(utf_new_char(bytes));
2735 /****************** returns the utf8 length in bytes of a string *******************/
2737 jsize GetStringUTFLength (JNIEnv *env, jstring string)
2739 java_lang_String *s = (java_lang_String*) string;
2740 STATS(jniinvokation();)
2742 return (jsize) u2_utflength(s->value->data, s->count);
2746 /************ converts a Javastring to an array of UTF-8 characters ****************/
2748 const char* GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
2751 STATS(jniinvokation();)
2753 u = javastring_toutf((java_lang_String *) string, false);
2756 *isCopy = JNI_FALSE;
2766 /***************** native code no longer needs access to utf ***********************/
2768 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
2770 STATS(jniinvokation();)
2772 /*we don't release utf chars right now, perhaps that should be done later. Since there is always one reference
2773 the garbage collector will never get them*/
2775 log_text("JNI-Call: ReleaseStringUTFChars");
2776 utf_display(utf_new_char(chars));
2780 /************************** array operations ***************************************/
2782 jsize GetArrayLength(JNIEnv *env, jarray array)
2784 STATS(jniinvokation();)
2790 /* NewObjectArray **************************************************************
2792 Constructs a new array holding objects in class elementClass. All
2793 elements are initially set to initialElement.
2795 *******************************************************************************/
2797 jobjectArray NewObjectArray(JNIEnv *env, jsize length, jclass elementClass, jobject initialElement)
2799 java_objectarray *oa;
2801 STATS(jniinvokation();)
2804 *exceptionptr = new_negativearraysizeexception();
2808 oa = builtin_anewarray(length, elementClass);
2813 /* set all elements to initialElement */
2815 for (i = 0; i < length; i++)
2816 oa->data[i] = initialElement;
2822 jobject GetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index)
2825 STATS(jniinvokation();)
2827 if (index < array->header.size)
2828 j = array->data[index];
2830 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2836 void SetObjectArrayElement(JNIEnv *env, jobjectArray array, jsize index, jobject val)
2838 STATS(jniinvokation();)
2839 if (index >= array->header.size)
2840 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
2843 /* check if the class of value is a subclass of the element class of the array */
2844 if (!builtin_canstore((java_objectarray *) array, (java_objectheader *) val))
2845 *exceptionptr = new_exception(string_java_lang_ArrayStoreException);
2848 array->data[index] = val;
2854 jbooleanArray NewBooleanArray(JNIEnv *env, jsize len)
2856 java_booleanarray *j;
2857 STATS(jniinvokation();)
2860 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2864 j = builtin_newarray_boolean(len);
2870 jbyteArray NewByteArray(JNIEnv *env, jsize len)
2873 STATS(jniinvokation();)
2876 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2880 j = builtin_newarray_byte(len);
2886 jcharArray NewCharArray(JNIEnv *env, jsize len)
2889 STATS(jniinvokation();)
2892 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2896 j = builtin_newarray_char(len);
2902 jshortArray NewShortArray(JNIEnv *env, jsize len)
2905 STATS(jniinvokation();)
2908 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2912 j = builtin_newarray_short(len);
2918 jintArray NewIntArray(JNIEnv *env, jsize len)
2921 STATS(jniinvokation();)
2924 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2928 j = builtin_newarray_int(len);
2934 jlongArray NewLongArray(JNIEnv *env, jsize len)
2937 STATS(jniinvokation();)
2940 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2944 j = builtin_newarray_long(len);
2950 jfloatArray NewFloatArray(JNIEnv *env, jsize len)
2953 STATS(jniinvokation();)
2956 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2960 j = builtin_newarray_float(len);
2966 jdoubleArray NewDoubleArray(JNIEnv *env, jsize len)
2968 java_doublearray *j;
2969 STATS(jniinvokation();)
2972 *exceptionptr = new_exception(string_java_lang_NegativeArraySizeException);
2976 j = builtin_newarray_double(len);
2982 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
2984 STATS(jniinvokation();)
2985 if (isCopy) *isCopy = JNI_FALSE;
2990 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
2992 STATS(jniinvokation();)
2993 if (isCopy) *isCopy = JNI_FALSE;
2998 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
3000 STATS(jniinvokation();)
3001 if (isCopy) *isCopy = JNI_FALSE;
3006 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
3008 STATS(jniinvokation();)
3009 if (isCopy) *isCopy = JNI_FALSE;
3014 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
3016 STATS(jniinvokation();)
3017 if (isCopy) *isCopy = JNI_FALSE;
3022 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
3024 STATS(jniinvokation();)
3025 if (isCopy) *isCopy = JNI_FALSE;
3030 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
3032 STATS(jniinvokation();)
3033 if (isCopy) *isCopy = JNI_FALSE;
3038 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
3040 STATS(jniinvokation();)
3041 if (isCopy) *isCopy = JNI_FALSE;
3047 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
3049 STATS(jniinvokation();)
3054 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
3056 STATS(jniinvokation();)
3061 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
3067 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
3069 STATS(jniinvokation();)
3074 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
3076 STATS(jniinvokation();)
3081 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
3083 STATS(jniinvokation();)
3088 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
3090 STATS(jniinvokation();)
3095 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
3097 STATS(jniinvokation();)
3102 void GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
3104 STATS(jniinvokation();)
3105 if (start < 0 || len < 0 || start + len > array->header.size)
3106 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3109 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3113 void GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
3115 STATS(jniinvokation();)
3116 if (start < 0 || len < 0 || start + len > array->header.size)
3117 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3120 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3124 void GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
3126 STATS(jniinvokation();)
3127 if (start < 0 || len < 0 || start + len > array->header.size)
3128 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3131 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3135 void GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
3137 STATS(jniinvokation();)
3138 if (start < 0 || len < 0 || start + len > array->header.size)
3139 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3142 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3146 void GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
3148 STATS(jniinvokation();)
3149 if (start < 0 || len < 0 || start + len > array->header.size)
3150 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3153 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3157 void GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
3159 STATS(jniinvokation();)
3160 if (start < 0 || len < 0 || start + len > array->header.size)
3161 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3164 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3168 void GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
3170 STATS(jniinvokation();)
3171 if (start < 0 || len < 0 || start + len > array->header.size)
3172 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3175 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3179 void GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
3181 STATS(jniinvokation();)
3182 if (start < 0 || len < 0 || start+len>array->header.size)
3183 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3186 memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
3190 void SetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
3192 STATS(jniinvokation();)
3193 if (start < 0 || len < 0 || start + len > array->header.size)
3194 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3197 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3201 void SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
3203 STATS(jniinvokation();)
3204 if (start < 0 || len < 0 || start + len > array->header.size)
3205 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3208 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3212 void SetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
3214 STATS(jniinvokation();)
3215 if (start < 0 || len < 0 || start + len > array->header.size)
3216 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3219 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3224 void SetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
3226 STATS(jniinvokation();)
3227 if (start < 0 || len < 0 || start + len > array->header.size)
3228 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3231 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3235 void SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
3237 STATS(jniinvokation();)
3238 if (start < 0 || len < 0 || start + len > array->header.size)
3239 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3242 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3247 void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
3249 STATS(jniinvokation();)
3250 if (start < 0 || len < 0 || start + len > array->header.size)
3251 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3254 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3259 void SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
3261 STATS(jniinvokation();)
3262 if (start < 0 || len < 0 || start + len > array->header.size)
3263 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3266 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3271 void SetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
3273 STATS(jniinvokation();)
3274 if (start < 0 || len < 0 || start + len > array->header.size)
3275 *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
3278 memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
3282 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
3284 STATS(jniinvokation();)
3285 log_text("JNI-Call: RegisterNatives");
3290 jint UnregisterNatives (JNIEnv* env, jclass clazz)
3292 STATS(jniinvokation();)
3293 log_text("JNI-Call: UnregisterNatives");
3298 /* Monitor Operations *********************************************************/
3300 /* MonitorEnter ****************************************************************
3302 Enters the monitor associated with the underlying Java object
3305 *******************************************************************************/
3307 jint MonitorEnter(JNIEnv *env, jobject obj)
3309 STATS(jniinvokation();)
3311 *exceptionptr = new_nullpointerexception();
3315 #if defined(USE_THREADS)
3316 builtin_monitorenter(obj);
3323 /* MonitorExit *****************************************************************
3325 The current thread must be the owner of the monitor associated with
3326 the underlying Java object referred to by obj. The thread
3327 decrements the counter indicating the number of times it has
3328 entered this monitor. If the value of the counter becomes zero, the
3329 current thread releases the monitor.
3331 *******************************************************************************/
3333 jint MonitorExit(JNIEnv *env, jobject obj)
3335 STATS(jniinvokation();)
3337 *exceptionptr = new_nullpointerexception();
3341 #if defined(USE_THREADS)
3342 builtin_monitorexit(obj);
3349 /* JavaVM Interface ***********************************************************/
3351 /* GetJavaVM *******************************************************************
3353 Returns the Java VM interface (used in the Invocation API)
3354 associated with the current thread. The result is placed at the
3355 location pointed to by the second argument, vm.
3357 *******************************************************************************/
3359 jint GetJavaVM(JNIEnv *env, JavaVM **vm)
3361 STATS(jniinvokation();)
3368 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
3370 STATS(jniinvokation();)
3371 log_text("JNI-Call: GetStringRegion");
3375 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
3377 STATS(jniinvokation();)
3378 log_text("JNI-Call: GetStringUTFRegion");
3382 /************** obtain direct pointer to array elements ***********************/
3384 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
3386 java_objectheader *s = (java_objectheader*) array;
3387 arraydescriptor *desc = s->vftbl->arraydesc;
3389 STATS(jniinvokation();)
3391 if (!desc) return NULL;
3393 return ((u1*)s) + desc->dataoffset;
3397 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
3399 STATS(jniinvokation();)
3400 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
3405 /**** returns a pointer to an array of Unicode characters of the string *******/
3407 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
3409 STATS(jniinvokation();)
3410 log_text("JNI-Call: GetStringCritical");
3412 return GetStringChars(env,string,isCopy);
3415 /*********** native code no longer needs access to chars **********************/
3417 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
3419 STATS(jniinvokation();)
3420 log_text("JNI-Call: ReleaseStringCritical");
3422 ReleaseStringChars(env,string,cstring);
3426 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
3428 STATS(jniinvokation();)
3429 log_text("JNI-Call: NewWeakGlobalRef");
3435 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
3437 STATS(jniinvokation();)
3438 log_text("JNI-Call: DeleteWeakGlobalRef");
3444 /** Creates a new global reference to the object referred to by the obj argument **/
3446 jobject NewGlobalRef(JNIEnv* env, jobject lobj)
3451 STATS(jniinvokation();)
3453 MonitorEnter(env, *global_ref_table);
3455 refcount = CallObjectMethod(env, *global_ref_table, getmid, lobj);
3456 val = (refcount == NULL) ? 0 : CallIntMethod(env, refcount, intvalue);
3457 newval = NewObject(env, intclass, newint, val + 1);
3459 if (newval != NULL) {
3460 CallObjectMethod(env, *global_ref_table, putmid, lobj, newval);
3461 MonitorExit(env, *global_ref_table);
3465 log_text("JNI-NewGlobalRef: unable to create new java.lang.Integer");
3466 MonitorExit(env, *global_ref_table);
3471 /************* Deletes the global reference pointed to by globalRef **************/
3473 void DeleteGlobalRef(JNIEnv* env, jobject gref)
3477 STATS(jniinvokation();)
3479 MonitorEnter(env, *global_ref_table);
3480 refcount = CallObjectMethod(env, *global_ref_table, getmid, gref);
3482 if (refcount == NULL) {
3483 log_text("JNI-DeleteGlobalRef: unable to find global reference");
3487 val = CallIntMethod(env, refcount, intvalue);
3491 CallObjectMethod(env, *global_ref_table, removemid,refcount);
3494 jobject newval = NewObject(env, intclass, newint, val);
3496 if (newval != NULL) {
3497 CallObjectMethod(env,*global_ref_table, putmid,newval);
3500 log_text("JNI-DeleteGlobalRef: unable to create new java.lang.Integer");
3504 MonitorExit(env,*global_ref_table);
3508 /* ExceptionCheck **************************************************************
3510 Returns JNI_TRUE when there is a pending exception; otherwise,
3513 *******************************************************************************/
3515 jboolean ExceptionCheck(JNIEnv *env)
3517 STATS(jniinvokation();)
3518 return *exceptionptr ? JNI_TRUE : JNI_FALSE;
3522 /* New JNI 1.4 functions ******************************************************/
3524 /* NewDirectByteBuffer *********************************************************
3526 Allocates and returns a direct java.nio.ByteBuffer referring to the
3527 block of memory starting at the memory address address and
3528 extending capacity bytes.
3530 *******************************************************************************/
3532 jobject NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
3534 STATS(jniinvokation();)
3535 log_text("NewDirectByteBuffer: IMPLEMENT ME!");
3541 /* GetDirectBufferAddress ******************************************************
3543 Fetches and returns the starting address of the memory region
3544 referenced by the given direct java.nio.Buffer.
3546 *******************************************************************************/
3548 void *GetDirectBufferAddress(JNIEnv *env, jobject buf)
3550 STATS(jniinvokation();)
3551 log_text("GetDirectBufferAddress: IMPLEMENT ME!");
3557 /* GetDirectBufferCapacity *****************************************************
3559 Fetches and returns the capacity in bytes of the memory region
3560 referenced by the given direct java.nio.Buffer.
3562 *******************************************************************************/
3564 jlong GetDirectBufferCapacity(JNIEnv* env, jobject buf)
3566 STATS(jniinvokation();)
3567 log_text("GetDirectBufferCapacity: IMPLEMENT ME!");
3573 jint DestroyJavaVM(JavaVM *vm)
3575 STATS(jniinvokation();)
3576 log_text("DestroyJavaVM called");
3582 jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
3584 STATS(jniinvokation();)
3585 log_text("AttachCurrentThread called");
3587 #if !defined(HAVE___THREAD)
3588 /* cacao_thread_attach();*/
3590 #error "No idea how to implement that. Perhaps Stefan knows"
3598 jint DetachCurrentThread(JavaVM *vm)
3600 STATS(jniinvokation();)
3601 log_text("DetachCurrentThread called");
3607 jint GetEnv(JavaVM *vm, void **env, jint version)
3609 STATS(jniinvokation();)
3610 if ((version != JNI_VERSION_1_1) && (version != JNI_VERSION_1_2) &&
3611 (version != JNI_VERSION_1_4)) {
3613 return JNI_EVERSION;
3617 TODO: If the current thread is not attached to the VM...
3620 return JNI_EDETACHED;
3630 jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
3632 STATS(jniinvokation();)
3633 log_text("AttachCurrentThreadAsDaemon called");
3638 /************* JNI Initialization ****************************************************/
3640 jobject jni_init1(JNIEnv* env, jobject lobj) {
3641 #if defined(USE_THREADS)
3642 while (initrunning) {yieldThread();} /* wait until init is done */
3644 if (global_ref_table == NULL) {
3647 #if defined(USE_THREADS)
3649 /* wait until jni_init is done */
3650 MonitorEnter(env, *global_ref_table) ;
3651 MonitorExit(env, *global_ref_table);
3654 return NewGlobalRef(env, lobj);
3656 void jni_init2(JNIEnv* env, jobject gref) {
3657 log_text("DeleteGlobalref called before NewGlobalref");
3658 #if defined(USE_THREADS)
3659 while (initrunning) {yieldThread();} /* wait until init is done */
3661 if (global_ref_table == NULL) {
3664 #if defined(USE_THREADS)
3666 /* wait until jni_init is done */
3667 MonitorEnter(env, *global_ref_table) ;
3668 MonitorExit(env, *global_ref_table);
3671 DeleteGlobalRef(env, gref);
3678 log_text("JNI-Init: initialize global_ref_table");
3679 /* initalize global reference table */
3680 ihmclass = FindClass(NULL, "java/util/IdentityHashMap");
3682 if (ihmclass == NULL) {
3683 log_text("JNI-Init: unable to find java.util.IdentityHashMap");
3686 mid = GetMethodID(NULL, ihmclass, "<init>","()V");
3688 log_text("JNI-Init: unable to find constructor in java.util.IdentityHashMap");
3691 global_ref_table = (jobject*)heap_allocate(sizeof(jobject),true,NULL);
3693 *global_ref_table = NewObject(NULL,ihmclass,mid);
3695 if (*global_ref_table == NULL) {
3696 log_text("JNI-Init: unable to create new global_ref_table");
3699 initrunning = false;
3701 getmid = GetMethodID(NULL, ihmclass, "get","(Ljava/lang/Object;)Ljava/lang/Object;");
3703 log_text("JNI-Init: unable to find method \"get\" in java.util.IdentityHashMap");
3706 getmid = GetMethodID(NULL ,ihmclass, "get","(Ljava/lang/Object;)Ljava/lang/Object;");
3707 if (getmid == NULL) {
3708 log_text("JNI-Init: unable to find method \"get\" in java.util.IdentityHashMap");
3711 putmid = GetMethodID(NULL, ihmclass, "put","(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
3712 if (putmid == NULL) {
3713 log_text("JNI-Init: unable to find method \"put\" in java.util.IdentityHashMap");
3716 intclass = FindClass(NULL, "java/lang/Integer");
3717 if (intclass == NULL) {
3718 log_text("JNI-Init: unable to find java.lang.Integer");
3721 newint = GetMethodID(NULL, intclass, "<init>","(I)V");
3722 if (newint == NULL) {
3723 log_text("JNI-Init: unable to find constructor in java.lang.Integer");
3726 intvalue = GetMethodID(NULL, intclass, "intValue","()I");
3727 if (intvalue == NULL) {
3728 log_text("JNI-Init: unable to find method \"intValue\" in java.lang.Integer");
3731 removemid = GetMethodID(NULL, ihmclass, "remove","(Ljava/lang/Object;)Ljava/lang/Object;");
3732 if (removemid == NULL) {
3733 log_text("JNI-DeleteGlobalRef: unable to find method \"remove\" in java.lang.Object");
3736 /* set NewGlobalRef, DeleteGlobalRef envTable entry to real implementation */
3738 JNI_JNIEnvTable.NewGlobalRef = &NewGlobalRef;
3739 JNI_JNIEnvTable.DeleteGlobalRef = &DeleteGlobalRef;
3743 /* JNI invocation table *******************************************************/
3745 const struct JNIInvokeInterface JNI_JavaVMTable = {
3751 AttachCurrentThread,
3752 DetachCurrentThread,
3754 AttachCurrentThreadAsDaemon
3758 /* JNI function table *********************************************************/
3760 struct JNINativeInterface JNI_JNIEnvTable = {
3769 &FromReflectedMethod,
3770 &FromReflectedField,
3785 &jni_init1, /* &NewGlobalRef, initialize Global_Ref_Table*/
3786 &jni_init2, /* &DeleteGlobalRef,*/
3790 &EnsureLocalCapacity,
3806 &CallBooleanMethodV,
3807 &CallBooleanMethodA,
3833 &CallNonvirtualObjectMethod,
3834 &CallNonvirtualObjectMethodV,
3835 &CallNonvirtualObjectMethodA,
3836 &CallNonvirtualBooleanMethod,
3837 &CallNonvirtualBooleanMethodV,
3838 &CallNonvirtualBooleanMethodA,
3839 &CallNonvirtualByteMethod,
3840 &CallNonvirtualByteMethodV,
3841 &CallNonvirtualByteMethodA,
3842 &CallNonvirtualCharMethod,
3843 &CallNonvirtualCharMethodV,
3844 &CallNonvirtualCharMethodA,
3845 &CallNonvirtualShortMethod,
3846 &CallNonvirtualShortMethodV,
3847 &CallNonvirtualShortMethodA,
3848 &CallNonvirtualIntMethod,
3849 &CallNonvirtualIntMethodV,
3850 &CallNonvirtualIntMethodA,
3851 &CallNonvirtualLongMethod,
3852 &CallNonvirtualLongMethodV,
3853 &CallNonvirtualLongMethodA,
3854 &CallNonvirtualFloatMethod,
3855 &CallNonvirtualFloatMethodV,
3856 &CallNonvirtualFloatMethodA,
3857 &CallNonvirtualDoubleMethod,
3858 &CallNonvirtualDoubleMethodV,
3859 &CallNonvirtualDoubleMethodA,
3860 &CallNonvirtualVoidMethod,
3861 &CallNonvirtualVoidMethodV,
3862 &CallNonvirtualVoidMethodA,
3887 &CallStaticObjectMethod,
3888 &CallStaticObjectMethodV,
3889 &CallStaticObjectMethodA,
3890 &CallStaticBooleanMethod,
3891 &CallStaticBooleanMethodV,
3892 &CallStaticBooleanMethodA,
3893 &CallStaticByteMethod,
3894 &CallStaticByteMethodV,
3895 &CallStaticByteMethodA,
3896 &CallStaticCharMethod,
3897 &CallStaticCharMethodV,
3898 &CallStaticCharMethodA,
3899 &CallStaticShortMethod,
3900 &CallStaticShortMethodV,
3901 &CallStaticShortMethodA,
3902 &CallStaticIntMethod,
3903 &CallStaticIntMethodV,
3904 &CallStaticIntMethodA,
3905 &CallStaticLongMethod,
3906 &CallStaticLongMethodV,
3907 &CallStaticLongMethodA,
3908 &CallStaticFloatMethod,
3909 &CallStaticFloatMethodV,
3910 &CallStaticFloatMethodA,
3911 &CallStaticDoubleMethod,
3912 &CallStaticDoubleMethodV,
3913 &CallStaticDoubleMethodA,
3914 &CallStaticVoidMethod,
3915 &CallStaticVoidMethodV,
3916 &CallStaticVoidMethodA,
3920 &GetStaticObjectField,
3921 &GetStaticBooleanField,
3922 &GetStaticByteField,
3923 &GetStaticCharField,
3924 &GetStaticShortField,
3926 &GetStaticLongField,
3927 &GetStaticFloatField,
3928 &GetStaticDoubleField,
3929 &SetStaticObjectField,
3930 &SetStaticBooleanField,
3931 &SetStaticByteField,
3932 &SetStaticCharField,
3933 &SetStaticShortField,
3935 &SetStaticLongField,
3936 &SetStaticFloatField,
3937 &SetStaticDoubleField,
3942 &ReleaseStringChars,
3945 &GetStringUTFLength,
3947 &ReleaseStringUTFChars,
3952 &GetObjectArrayElement,
3953 &SetObjectArrayElement,
3964 &GetBooleanArrayElements,
3965 &GetByteArrayElements,
3966 &GetCharArrayElements,
3967 &GetShortArrayElements,
3968 &GetIntArrayElements,
3969 &GetLongArrayElements,
3970 &GetFloatArrayElements,
3971 &GetDoubleArrayElements,
3973 &ReleaseBooleanArrayElements,
3974 &ReleaseByteArrayElements,
3975 &ReleaseCharArrayElements,
3976 &ReleaseShortArrayElements,
3977 &ReleaseIntArrayElements,
3978 &ReleaseLongArrayElements,
3979 &ReleaseFloatArrayElements,
3980 &ReleaseDoubleArrayElements,
3982 &GetBooleanArrayRegion,
3983 &GetByteArrayRegion,
3984 &GetCharArrayRegion,
3985 &GetShortArrayRegion,
3987 &GetLongArrayRegion,
3988 &GetFloatArrayRegion,
3989 &GetDoubleArrayRegion,
3990 &SetBooleanArrayRegion,
3991 &SetByteArrayRegion,
3992 &SetCharArrayRegion,
3993 &SetShortArrayRegion,
3995 &SetLongArrayRegion,
3996 &SetFloatArrayRegion,
3997 &SetDoubleArrayRegion,
4007 /* new JNI 1.2 functions */
4010 &GetStringUTFRegion,
4012 &GetPrimitiveArrayCritical,
4013 &ReleasePrimitiveArrayCritical,
4016 &ReleaseStringCritical,
4019 &DeleteWeakGlobalRef,
4023 /* new JNI 1.4 functions */
4025 &NewDirectByteBuffer,
4026 &GetDirectBufferAddress,
4027 &GetDirectBufferCapacity
4031 /* Invocation API Functions ***************************************************/
4033 /* JNI_GetDefaultJavaVMInitArgs ************************************************
4035 Returns a default configuration for the Java VM.
4037 *******************************************************************************/
4039 jint JNI_GetDefaultJavaVMInitArgs(void *vm_args)
4041 JDK1_1InitArgs *_vm_args = (JDK1_1InitArgs *) vm_args;
4043 /* GNU classpath currently supports JNI 1.2 */
4045 _vm_args->version = JNI_VERSION_1_2;
4051 /* JNI_GetCreatedJavaVMs *******************************************************
4053 Returns all Java VMs that have been created. Pointers to VMs are written in
4054 the buffer vmBuf in the order they are created. At most bufLen number of
4055 entries will be written. The total number of created VMs is returned in
4058 *******************************************************************************/
4060 jint JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
4062 log_text("JNI_GetCreatedJavaVMs: IMPLEMENT ME!!!");
4068 /* JNI_CreateJavaVM ************************************************************
4070 Loads and initializes a Java VM. The current thread becomes the main thread.
4071 Sets the env argument to the JNI interface pointer of the main thread.
4073 *******************************************************************************/
4075 jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args)
4077 *p_vm = (JavaVM *) &JNI_JavaVMTable;
4078 *p_env = (JNIEnv *) &JNI_JNIEnvTable;
4084 jobject *jni_method_invokeNativeHelper(JNIEnv *env, struct methodinfo *methodID, jobject obj, java_objectarray *params)
4091 if (methodID == 0) {
4092 *exceptionptr = new_exception(string_java_lang_NoSuchMethodError);
4096 argcount = methodID->parseddesc->paramcount;
4098 /* if method is non-static, remove the `this' pointer */
4100 if (!(methodID->flags & ACC_STATIC))
4103 /* the method is an instance method the obj has to be an instance of the
4104 class the method belongs to. For static methods the obj parameter
4107 if (!(methodID->flags & ACC_STATIC) && obj &&
4108 (!builtin_instanceof((java_objectheader *) obj, methodID->class))) {
4110 new_exception_message(string_java_lang_IllegalArgumentException,
4111 "Object parameter of wrong type in Java_java_lang_reflect_Method_invokeNative");
4118 *exceptionptr = new_exception(string_java_lang_IllegalArgumentException);
4119 log_text("Too many arguments. invokeNativeHelper does not support that");
4124 if (((params == NULL) && (argcount != 0)) ||
4125 (params && (params->header.size != argcount))) {
4127 new_exception(string_java_lang_IllegalArgumentException);
4132 if (!(methodID->flags & ACC_STATIC) && !obj) {
4134 new_exception_message(string_java_lang_NullPointerException,
4135 "Static mismatch in Java_java_lang_reflect_Method_invokeNative");
4139 if ((methodID->flags & ACC_STATIC) && (obj))
4143 if ((methodID->flags & ACC_ABSTRACT) ||
4144 (methodID->class->flags & ACC_INTERFACE) ) {
4145 methodID = get_virtual(obj, methodID);
4149 blk = MNEW(jni_callblock, /*4 */argcount + 2);
4151 if (!fill_callblock_objA(obj, methodID->parseddesc, blk, params, &retT))
4152 return NULL; /* exception */
4156 (void) asm_calljavafunction2(methodID,
4158 (argcount + 1) * sizeof(jni_callblock),
4160 retVal = NULL; /*native_new_and_init(loader_load(utf_new_char("java/lang/Void")));*/
4163 case PRIMITIVETYPE_INT: {
4165 intVal = asm_calljavafunction2int(methodID,
4167 (argcount + 1) * sizeof(jni_callblock),
4169 retVal = builtin_new(class_java_lang_Integer);
4172 class_resolvemethod(retVal->vftbl->class,
4179 case PRIMITIVETYPE_BYTE: {
4181 intVal = asm_calljavafunction2int(methodID,
4183 (argcount + 1) * sizeof(jni_callblock),
4185 retVal = builtin_new(class_java_lang_Byte);
4188 class_resolvemethod(retVal->vftbl->class,
4195 case PRIMITIVETYPE_CHAR: {
4197 intVal = asm_calljavafunction2int(methodID,
4199 (argcount + 1) * sizeof(jni_callblock),
4201 retVal = builtin_new(class_java_lang_Character);
4204 class_resolvemethod(retVal->vftbl->class,
4211 case PRIMITIVETYPE_SHORT: {
4213 intVal = asm_calljavafunction2int(methodID,
4215 (argcount + 1) * sizeof(jni_callblock),
4217 retVal = builtin_new(class_java_lang_Short);
4220 class_resolvemethod(retVal->vftbl->class,
4227 case PRIMITIVETYPE_BOOLEAN: {
4229 intVal = asm_calljavafunction2int(methodID,
4231 (argcount + 1) * sizeof(jni_callblock),
4233 retVal = builtin_new(class_java_lang_Boolean);
4236 class_resolvemethod(retVal->vftbl->class,
4245 longVal = asm_calljavafunction2long(methodID,
4247 (argcount + 1) * sizeof(jni_callblock),
4249 retVal = builtin_new(class_java_lang_Long);
4252 class_resolvemethod(retVal->vftbl->class,
4259 case PRIMITIVETYPE_FLOAT: {
4261 floatVal = asm_calljavafunction2float(methodID,
4263 (argcount + 1) * sizeof(jni_callblock),
4265 retVal = builtin_new(class_java_lang_Float);
4268 class_resolvemethod(retVal->vftbl->class,
4275 case PRIMITIVETYPE_DOUBLE: {
4277 doubleVal = asm_calljavafunction2double(methodID,
4279 (argcount + 1) * sizeof(jni_callblock),
4281 retVal = builtin_new(class_java_lang_Double);
4284 class_resolvemethod(retVal->vftbl->class,
4292 retVal = asm_calljavafunction2(methodID,
4294 (argcount + 1) * sizeof(jni_callblock),
4299 /* if this happens the acception has already been set by fill_callblock_objA*/
4300 MFREE(blk, jni_callblock, /*4 */ argcount+2);
4301 return (jobject *) 0;
4304 MFREE(blk, jni_callblock, /* 4 */ argcount+2);
4306 if (*exceptionptr) {
4307 java_objectheader *exceptionToWrap = *exceptionptr;
4309 java_objectheader *ivte;
4311 *exceptionptr = NULL;
4312 if (load_class_bootstrap(utf_new_char("java/lang/reflect/InvocationTargetException"),
4315 ivte = builtin_new(ivtec);
4316 asm_calljavafunction(class_resolvemethod(ivtec,
4318 utf_new_char("(Ljava/lang/Throwable;)V")),
4325 if (*exceptionptr != NULL) {
4326 log_text("jni.c: error while creating InvocationTargetException wrapper");
4330 *exceptionptr = ivte;
4333 return (jobject *) retVal;
4340 * These are local overrides for various environment variables in Emacs.
4341 * Please do not remove this and leave it at the end of the file, where
4342 * Emacs will automagically detect them.
4343 * ---------------------------------------------------------------------
4346 * indent-tabs-mode: t