1 /* jni.c - implementation of JNI functions
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5 M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6 P. Tomsich, J. Wenninger
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
29 $Id: jni.c 557 2003-11-02 22:51:59Z twisti $
35 #include "toolbox/memory.h"
38 #define JNI_VERSION 0x00010002
41 /********************* accessing instance-fields **********************************/
43 #define setField(obj,typ,var,val) *((typ*) ((long int) obj + (long int) var->offset))=val;
44 #define getField(obj,typ,var) *((typ*) ((long int) obj + (long int) var->offset))
45 #define setfield_critical(clazz,obj,name,sig,jdatatype,val) setField(obj,jdatatype,getFieldID_critical(env,clazz,name,sig),val);
47 /*************************** function: jclass_findfield ****************************
49 searches for field with specified name and type in a 'classinfo'-structur
50 if no such field is found NULL is returned
52 ************************************************************************************/
54 fieldinfo *jclass_findfield (classinfo *c, utf *name, utf *desc)
57 for (i = 0; i < c->fieldscount; i++) {
58 if ((c->fields[i].name == name) && (c->fields[i].descriptor == desc))
59 return &(c->fields[i]);
65 /********************* returns version of native method interface *****************/
67 jint GetVersion (JNIEnv* env)
72 /****************** loads a class from a buffer of raw class data *****************/
74 jclass DefineClass(JNIEnv* env, const char *name, jobject loader, const jbyte *buf, jsize len)
78 /* change suck-mode, so subsequent class_load will read from memory-buffer */
79 classload_buffer( (u1*) buf,len);
81 clazz = loader_load(utf_new_char ((char *) name));
83 /* restore old suck-mode */
84 classload_buffer(NULL,0);
90 /*************** loads locally defined class with the specified name **************/
92 jclass FindClass (JNIEnv* env, const char *name)
96 c = loader_load(utf_new_char ((char *) name));
98 if (!c) exceptionptr = native_new_and_init(class_java_lang_ClassFormatError);
104 /***********************************************************************************
106 converts java.lang.reflect.Method or
107 java.lang.reflect.Constructor object to a method ID
109 **********************************************************************************/
111 jmethodID FromReflectedMethod (JNIEnv* env, jobject method)
113 log_text("JNI-Call: FromReflectedMethod");
117 /*************** return superclass of the class represented by sub ****************/
119 jclass GetSuperclass (JNIEnv* env, jclass sub)
123 c = ((classinfo*) sub) -> super;
126 use_class_as_object (c);
131 /*********************** check whether sub can be cast to sup ********************/
133 jboolean IsAssignableForm (JNIEnv* env, jclass sub, jclass sup)
135 return builtin_isanysubclass(sub,sup);
139 /***** converts a field ID derived from cls to a java.lang.reflect.Field object ***/
141 jobject ToReflectedField (JNIEnv* env, jclass cls, jfieldID fieldID, jboolean isStatic)
143 log_text("JNI-Call: ToReflectedField");
147 /***************** throw java.lang.Throwable object ******************************/
149 jint Throw (JNIEnv* env, jthrowable obj)
151 exceptionptr = (java_objectheader*) obj;
156 /***********************************************************************************
158 create exception object from the class clazz with the
159 specified message and cause it to be thrown
161 **********************************************************************************/
164 jint ThrowNew (JNIEnv* env, jclass clazz, const char *msg)
166 java_lang_Throwable *o;
168 /* instantiate exception object */
169 o = (java_lang_Throwable *) native_new_and_init ((classinfo*) clazz);
173 o->detailMessage = (java_lang_String*) javastring_new_char((char *) msg);
175 exceptionptr = (java_objectheader*) o;
179 /************************* check if exception occured *****************************/
181 jthrowable ExceptionOccurred (JNIEnv* env)
183 return (jthrowable) exceptionptr;
186 /********** print exception and a backtrace of the stack (for debugging) **********/
188 void ExceptionDescribe (JNIEnv* env)
190 utf_display(exceptionptr->vftbl->class->name);
196 /******************* clear any exception currently being thrown *******************/
198 void ExceptionClear (JNIEnv* env)
204 /********** raises a fatal error and does not expect the VM to recover ************/
206 void FatalError (JNIEnv* env, const char *msg)
211 /******************* creates a new local reference frame **************************/
213 jint PushLocalFrame (JNIEnv* env, jint capacity)
218 /**************** Pops off the current local reference frame **********************/
220 jobject PopLocalFrame (JNIEnv* env, jobject result)
226 /** Creates a new global reference to the object referred to by the obj argument **/
228 jobject NewGlobalRef (JNIEnv* env, jobject lobj)
230 heap_addreference ( (void**) &lobj);
234 /************* Deletes the global reference pointed to by globalRef **************/
236 void DeleteGlobalRef (JNIEnv* env, jobject gref)
242 /*************** Deletes the local reference pointed to by localRef ***************/
244 void DeleteLocalRef (JNIEnv* env, jobject localRef)
249 /********** Tests whether two references refer to the same Java object ************/
251 jboolean IsSameObject (JNIEnv* env, jobject obj1, jobject obj2)
256 /***** Creates a new local reference that refers to the same object as ref *******/
258 jobject NewLocalRef (JNIEnv* env, jobject ref)
263 /***********************************************************************************
265 Ensures that at least a given number of local references can
266 be created in the current thread
268 **********************************************************************************/
270 jint EnsureLocalCapacity (JNIEnv* env, jint capacity)
272 return 0; /* return 0 on success */
276 /********* Allocates a new Java object without invoking a constructor *************/
278 jobject AllocObject (JNIEnv* env, jclass clazz)
280 java_objectheader *o = builtin_new(clazz);
285 /***********************************************************************************
287 Constructs a new Java object
288 arguments that are to be passed to the constructor are placed after methodID
290 ***********************************************************************************/
292 jobject NewObject (JNIEnv* env, jclass clazz, jmethodID methodID, ...)
294 log_text("JNI-Call: NewObject");
297 /***********************************************************************************
299 Constructs a new Java object
300 arguments that are to be passed to the constructor are placed in va_list args
302 ***********************************************************************************/
304 jobject NewObjectV (JNIEnv* env, jclass clazz, jmethodID methodID, va_list args)
306 log_text("JNI-Call: NewObjectV");
309 /***********************************************************************************
311 Constructs a new Java object
312 arguments that are to be passed to the constructor are placed in
313 args array of jvalues
315 ***********************************************************************************/
317 jobject NewObjectA (JNIEnv* env, jclass clazz, jmethodID methodID, jvalue *args)
319 log_text("JNI-Call: NewObjectA");
323 /************************ returns the class of an object **************************/
325 jclass GetObjectClass (JNIEnv* env, jobject obj)
327 classinfo *c = obj->vftbl -> class;
328 use_class_as_object (c);
332 /************* tests whether an object is an instance of a class ******************/
334 jboolean IsInstanceOf (JNIEnv* env, jobject obj, jclass clazz)
336 return builtin_instanceof(obj,clazz);
340 /***************** converts a java.lang.reflect.Field to a field ID ***************/
342 jfieldID FromReflectedField (JNIEnv* env, jobject field)
344 log_text("JNI-Call: FromReflectedField");
347 /**********************************************************************************
349 converts a method ID to a java.lang.reflect.Method or
350 java.lang.reflect.Constructor object
352 **********************************************************************************/
354 jobject ToReflectedMethod (JNIEnv* env, jclass cls, jmethodID methodID, jboolean isStatic)
356 log_text("JNI-Call: ToReflectedMethod");
359 /**************** returns the method ID for an instance method ********************/
361 jmethodID GetMethodID (JNIEnv* env, jclass clazz, const char *name, const char *sig)
365 m = class_resolvemethod (
367 utf_new_char ((char*) name),
368 utf_new_char ((char*) sig)
371 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
376 /******************** JNI-functions for calling instance methods ******************/
378 jobject CallObjectMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
380 log_text("JNI-Call: CallObjectMethod");
386 jobject CallObjectMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
388 log_text("JNI-Call: CallObjectMethodV");
394 jobject CallObjectMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
396 log_text("JNI-Call: CallObjectMethodA");
402 jboolean CallBooleanMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
404 log_text("JNI-Call: CallBooleanMethod");
409 jboolean CallBooleanMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
411 log_text("JNI-Call: CallBooleanMethodV");
416 jboolean CallBooleanMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
418 log_text("JNI-Call: CallBooleanMethodA");
423 jbyte CallByteMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
425 log_text("JNI-Call: CallByteMethod");
430 jbyte CallByteMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
432 log_text("JNI-Call: CallByteMethodV");
438 jbyte CallByteMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
440 log_text("JNI-Call: CallByteMethodA");
446 jchar CallCharMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
448 log_text("JNI-Call: CallCharMethod");
453 jchar CallCharMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
455 log_text("JNI-Call: CallCharMethodV");
461 jchar CallCharMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
463 log_text("JNI-Call: CallCharMethodA");
469 jshort CallShortMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
471 log_text("JNI-Call: CallShortMethod");
477 jshort CallShortMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
479 log_text("JNI-Call: CallShortMethodV");
485 jshort CallShortMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
487 log_text("JNI-Call: CallShortMethodA");
494 jint CallIntMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
496 log_text("JNI-Call: CallIntMethod");
502 jint CallIntMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
504 log_text("JNI-Call: CallIntMethodV");
510 jint CallIntMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
512 log_text("JNI-Call: CallIntMethodA");
519 jlong CallLongMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
521 log_text("JNI-Call: CallLongMethod");
527 jlong CallLongMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
529 log_text("JNI-Call: CallLongMethodV");
535 jlong CallLongMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
537 log_text("JNI-Call: CallLongMethodA");
544 jfloat CallFloatMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
546 log_text("JNI-Call: CallFloatMethod");
552 jfloat CallFloatMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
554 log_text("JNI-Call: CallFloatMethodV");
560 jfloat CallFloatMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
562 log_text("JNI-Call: CallFloatMethodA");
569 jdouble CallDoubleMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
571 log_text("JNI-Call: CallDoubleMethod");
577 jdouble CallDoubleMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
579 log_text("JNI-Call: CallDoubleMethodV");
585 jdouble CallDoubleMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue *args)
587 log_text("JNI-Call: CallDoubleMethodA");
594 void CallVoidMethod (JNIEnv *env, jobject obj, jmethodID methodID, ...)
596 log_text("JNI-Call: CallVoidMethod");
601 void CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID methodID, va_list args)
603 log_text("JNI-Call: CallVoidMethodV");
608 void CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID methodID, jvalue * args)
610 log_text("JNI-Call: CallVoidMethodA");
616 jobject CallNonvirtualObjectMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
618 log_text("JNI-Call: CallNonvirtualObjectMethod");
624 jobject CallNonvirtualObjectMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
626 log_text("JNI-Call: CallNonvirtualObjectMethodV");
632 jobject CallNonvirtualObjectMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
634 log_text("JNI-Call: CallNonvirtualObjectMethodA");
641 jboolean CallNonvirtualBooleanMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
643 log_text("JNI-Call: CallNonvirtualBooleanMethod");
649 jboolean CallNonvirtualBooleanMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
651 log_text("JNI-Call: CallNonvirtualBooleanMethodV");
657 jboolean CallNonvirtualBooleanMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
659 log_text("JNI-Call: CallNonvirtualBooleanMethodA");
666 jbyte CallNonvirtualByteMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
668 log_text("JNI-Call: CallNonvirtualByteMethod");
674 jbyte CallNonvirtualByteMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
676 log_text("JNI-Call: CallNonvirtualByteMethodV");
682 jbyte CallNonvirtualByteMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
684 log_text("JNI-Call: CallNonvirtualByteMethodA");
691 jchar CallNonvirtualCharMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
693 log_text("JNI-Call: CallNonvirtualCharMethod");
699 jchar CallNonvirtualCharMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
701 log_text("JNI-Call: CallNonvirtualCharMethodV");
707 jchar CallNonvirtualCharMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
709 log_text("JNI-Call: CallNonvirtualCharMethodA");
716 jshort CallNonvirtualShortMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
718 log_text("JNI-Call: CallNonvirtualShortMethod");
724 jshort CallNonvirtualShortMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
726 log_text("JNI-Call: CallNonvirtualShortMethodV");
732 jshort CallNonvirtualShortMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
734 log_text("JNI-Call: CallNonvirtualShortMethodA");
741 jint CallNonvirtualIntMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
743 log_text("JNI-Call: CallNonvirtualIntMethod");
749 jint CallNonvirtualIntMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
751 log_text("JNI-Call: CallNonvirtualIntMethodV");
757 jint CallNonvirtualIntMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
759 log_text("JNI-Call: CallNonvirtualIntMethodA");
766 jlong CallNonvirtualLongMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
768 log_text("JNI-Call: CallNonvirtualLongMethod");
774 jlong CallNonvirtualLongMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
776 log_text("JNI-Call: CallNonvirtualLongMethodV");
782 jlong CallNonvirtualLongMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
784 log_text("JNI-Call: CallNonvirtualLongMethodA");
791 jfloat CallNonvirtualFloatMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
793 log_text("JNI-Call: CallNonvirtualFloatMethod");
799 jfloat CallNonvirtualFloatMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
801 log_text("JNI-Call: CallNonvirtualFloatMethodV");
807 jfloat CallNonvirtualFloatMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
809 log_text("JNI-Call: CallNonvirtualFloatMethodA");
816 jdouble CallNonvirtualDoubleMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
818 log_text("JNI-Call: CallNonvirtualDoubleMethod");
824 jdouble CallNonvirtualDoubleMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
826 log_text("JNI-Call: CallNonvirtualDoubleMethodV");
832 jdouble CallNonvirtualDoubleMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue *args)
834 log_text("JNI-Call: CallNonvirtualDoubleMethodA");
841 void CallNonvirtualVoidMethod (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, ...)
843 log_text("JNI-Call: CallNonvirtualVoidMethod");
847 void CallNonvirtualVoidMethodV (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, va_list args)
849 log_text("JNI-Call: CallNonvirtualVoidMethodV");
853 void CallNonvirtualVoidMethodA (JNIEnv *env, jobject obj, jclass clazz, jmethodID methodID, jvalue * args)
855 log_text("JNI-Call: CallNonvirtualVoidMethodA");
858 /************************* JNI-functions for accessing fields ************************/
860 jfieldID GetFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
864 f = jclass_findfield(clazz,
865 utf_new_char ((char*) name),
866 utf_new_char ((char*) sig)
869 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
874 /*************************** retrieve fieldid, abort on error ************************/
876 jfieldID getFieldID_critical(JNIEnv *env,jclass clazz,const char *name,const char *sig)
878 jfieldID id = env->GetFieldID(env,clazz,name,sig);
879 if (!id) panic("setfield_critical failed");
883 jobject GetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID)
885 return getField(obj,jobject,fieldID);
888 jboolean GetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID)
890 return getField(obj,jboolean,fieldID);
894 jbyte GetByteField (JNIEnv *env, jobject obj, jfieldID fieldID)
896 return getField(obj,jbyte,fieldID);
900 jchar GetCharField (JNIEnv *env, jobject obj, jfieldID fieldID)
902 return getField(obj,jchar,fieldID);
906 jshort GetShortField (JNIEnv *env, jobject obj, jfieldID fieldID)
908 return getField(obj,jshort,fieldID);
912 jint GetIntField (JNIEnv *env, jobject obj, jfieldID fieldID)
914 return getField(obj,jint,fieldID);
918 jlong GetLongField (JNIEnv *env, jobject obj, jfieldID fieldID)
920 return getField(obj,jlong,fieldID);
924 jfloat GetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID)
926 return getField(obj,jfloat,fieldID);
930 jdouble GetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID)
932 return getField(obj,jdouble,fieldID);
935 void SetObjectField (JNIEnv *env, jobject obj, jfieldID fieldID, jobject val)
937 setField(obj,jobject,fieldID,val);
941 void SetBooleanField (JNIEnv *env, jobject obj, jfieldID fieldID, jboolean val)
943 setField(obj,jboolean,fieldID,val);
947 void SetByteField (JNIEnv *env, jobject obj, jfieldID fieldID, jbyte val)
949 setField(obj,jbyte,fieldID,val);
953 void SetCharField (JNIEnv *env, jobject obj, jfieldID fieldID, jchar val)
955 setField(obj,jchar,fieldID,val);
959 void SetShortField (JNIEnv *env, jobject obj, jfieldID fieldID, jshort val)
961 setField(obj,jshort,fieldID,val);
965 void SetIntField (JNIEnv *env, jobject obj, jfieldID fieldID, jint val)
967 setField(obj,jint,fieldID,val);
971 void SetLongField (JNIEnv *env, jobject obj, jfieldID fieldID, jlong val)
973 setField(obj,jlong,fieldID,val);
977 void SetFloatField (JNIEnv *env, jobject obj, jfieldID fieldID, jfloat val)
979 setField(obj,jfloat,fieldID,val);
983 void SetDoubleField (JNIEnv *env, jobject obj, jfieldID fieldID, jdouble val)
985 setField(obj,jdouble,fieldID,val);
988 /**************** JNI-functions for calling static methods **********************/
990 jmethodID GetStaticMethodID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
994 m = class_resolvemethod (
996 utf_new_char ((char*) name),
997 utf_new_char ((char*) sig)
1000 if (!m) exceptionptr = native_new_and_init(class_java_lang_NoSuchMethodError);
1005 jobject CallStaticObjectMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1007 log_text("JNI-Call: CallStaticObjectMethod");
1013 jobject CallStaticObjectMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1015 log_text("JNI-Call: CallStaticObjectMethodV");
1021 jobject CallStaticObjectMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1023 log_text("JNI-Call: CallStaticObjectMethodA");
1029 jboolean CallStaticBooleanMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1031 log_text("JNI-Call: CallStaticBooleanMethod");
1037 jboolean CallStaticBooleanMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1039 log_text("JNI-Call: CallStaticBooleanMethodV");
1045 jboolean CallStaticBooleanMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1047 log_text("JNI-Call: CallStaticBooleanMethodA");
1053 jbyte CallStaticByteMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1055 log_text("JNI-Call: CallStaticByteMethod");
1061 jbyte CallStaticByteMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1063 log_text("JNI-Call: CallStaticByteMethodV");
1069 jbyte CallStaticByteMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1071 log_text("JNI-Call: CallStaticByteMethodA");
1076 jchar CallStaticCharMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1078 log_text("JNI-Call: CallStaticCharMethod");
1084 jchar CallStaticCharMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1086 log_text("JNI-Call: CallStaticCharMethodV");
1092 jchar CallStaticCharMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1094 log_text("JNI-Call: CallStaticCharMethodA");
1101 jshort CallStaticShortMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1103 log_text("JNI-Call: CallStaticShortMethod");
1109 jshort CallStaticShortMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1111 log_text("JNI-Call: CallStaticShortMethodV");
1117 jshort CallStaticShortMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1119 log_text("JNI-Call: CallStaticShortMethodA");
1126 jint CallStaticIntMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1128 log_text("JNI-Call: CallStaticIntMethod");
1134 jint CallStaticIntMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1136 log_text("JNI-Call: CallStaticIntMethodV");
1142 jint CallStaticIntMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1144 log_text("JNI-Call: CallStaticIntMethodA");
1151 jlong CallStaticLongMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1153 log_text("JNI-Call: CallStaticLongMethod");
1159 jlong CallStaticLongMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1161 log_text("JNI-Call: CallStaticLongMethodV");
1167 jlong CallStaticLongMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1169 log_text("JNI-Call: CallStaticLongMethodA");
1176 jfloat CallStaticFloatMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1178 log_text("JNI-Call: CallStaticFloatMethod");
1184 jfloat CallStaticFloatMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1186 log_text("JNI-Call: CallStaticFloatMethodV");
1192 jfloat CallStaticFloatMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1194 log_text("JNI-Call: CallStaticFloatMethodA");
1201 jdouble CallStaticDoubleMethod (JNIEnv *env, jclass clazz, jmethodID methodID, ...)
1203 log_text("JNI-Call: CallStaticDoubleMethod");
1209 jdouble CallStaticDoubleMethodV (JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
1211 log_text("JNI-Call: CallStaticDoubleMethodV");
1217 jdouble CallStaticDoubleMethodA (JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
1219 log_text("JNI-Call: CallStaticDoubleMethodA");
1226 void CallStaticVoidMethod (JNIEnv *env, jclass cls, jmethodID methodID, ...)
1228 log_text("JNI-Call: CallStaticVoidMethod");
1233 void CallStaticVoidMethodV (JNIEnv *env, jclass cls, jmethodID methodID, va_list args)
1235 log_text("JNI-Call: CallStaticVoidMethodV");
1240 void CallStaticVoidMethodA (JNIEnv *env, jclass cls, jmethodID methodID, jvalue * args)
1242 log_text("JNI-Call: CallStaticVoidMethodA");
1246 /****************** JNI-functions for accessing static fields ********************/
1248 jfieldID GetStaticFieldID (JNIEnv *env, jclass clazz, const char *name, const char *sig)
1252 f = jclass_findfield(clazz,
1253 utf_new_char ((char*) name),
1254 utf_new_char ((char*) sig)
1257 if (!f) exceptionptr = native_new_and_init(class_java_lang_NoSuchFieldError);
1263 jobject GetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1266 return fieldID->value.a;
1270 jboolean GetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1273 return fieldID->value.i;
1277 jbyte GetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1280 return fieldID->value.i;
1284 jchar GetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1287 return fieldID->value.i;
1291 jshort GetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1294 return fieldID->value.i;
1298 jint GetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1301 return fieldID->value.i;
1305 jlong GetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1308 return fieldID->value.l;
1312 jfloat GetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1315 return fieldID->value.f;
1319 jdouble GetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID)
1322 return fieldID->value.d;
1327 void SetStaticObjectField (JNIEnv *env, jclass clazz, jfieldID fieldID, jobject value)
1330 fieldID->value.a = value;
1334 void SetStaticBooleanField (JNIEnv *env, jclass clazz, jfieldID fieldID, jboolean value)
1337 fieldID->value.i = value;
1341 void SetStaticByteField (JNIEnv *env, jclass clazz, jfieldID fieldID, jbyte value)
1344 fieldID->value.i = value;
1348 void SetStaticCharField (JNIEnv *env, jclass clazz, jfieldID fieldID, jchar value)
1351 fieldID->value.i = value;
1355 void SetStaticShortField (JNIEnv *env, jclass clazz, jfieldID fieldID, jshort value)
1358 fieldID->value.i = value;
1362 void SetStaticIntField (JNIEnv *env, jclass clazz, jfieldID fieldID, jint value)
1365 fieldID->value.i = value;
1369 void SetStaticLongField (JNIEnv *env, jclass clazz, jfieldID fieldID, jlong value)
1372 fieldID->value.l = value;
1376 void SetStaticFloatField (JNIEnv *env, jclass clazz, jfieldID fieldID, jfloat value)
1379 fieldID->value.f = value;
1383 void SetStaticDoubleField (JNIEnv *env, jclass clazz, jfieldID fieldID, jdouble value)
1386 fieldID->value.d = value;
1390 /***** create new java.lang.String object from an array of Unicode characters ****/
1392 jstring NewString (JNIEnv *env, const jchar *buf, jsize len)
1395 java_lang_String *s;
1398 s = (java_lang_String*) builtin_new (class_java_lang_String);
1399 a = builtin_newarray_char (len);
1401 /* javastring or characterarray could not be created */
1402 if ( (!a) || (!s) ) return NULL;
1405 for (i=0; i<len; i++) a->data[i] = buf[i];
1413 /******************* returns the length of a Java string ***************************/
1415 jsize GetStringLength (JNIEnv *env, jstring str)
1417 return ((java_lang_String*) str)->count;
1421 /******************** convertes javastring to u2-array ****************************/
1423 u2 *javastring_tou2 (jstring so)
1425 java_lang_String *s = (java_lang_String*) so;
1430 if (!s) return NULL;
1433 if (!a) return NULL;
1435 /* allocate memory */
1436 stringbuffer = MNEW( u2 , s->count + 1 );
1439 for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
1441 /* terminate string */
1442 stringbuffer[i] = '\0';
1444 return stringbuffer;
1447 /********* returns a pointer to an array of Unicode characters of the string *******/
1449 const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
1451 return javastring_tou2(str);
1454 /**************** native code no longer needs access to chars **********************/
1456 void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
1458 MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count);
1461 /************ create new java.lang.String object from utf8-characterarray **********/
1463 jstring NewStringUTF (JNIEnv *env, const char *utf)
1465 log_text("NewStringUTF called");
1468 /****************** returns the utf8 length in bytes of a string *******************/
1470 jsize GetStringUTFLength (JNIEnv *env, jstring string)
1472 java_lang_String *s = (java_lang_String*) string;
1474 return (jsize) u2_utflength(s->value->data, s->count);
1477 /************ converts a Javastring to an array of UTF-8 characters ****************/
1479 const char* GetStringUTFChars (JNIEnv *env, jstring string, jboolean *isCopy)
1481 return javastring_toutf((java_lang_String*) string,false)->text;
1484 /***************** native code no longer needs access to utf ***********************/
1486 void ReleaseStringUTFChars (JNIEnv *env, jstring str, const char* chars)
1488 log_text("JNI-Call: ReleaseStringUTFChars");
1491 /************************** array operations ***************************************/
1493 jsize GetArrayLength (JNIEnv *env, jarray array)
1498 jobjectArray NewObjectArray (JNIEnv *env, jsize len, jclass clazz, jobject init)
1500 java_objectarray *j = builtin_anewarray (len, clazz);
1501 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1505 jobject GetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index)
1509 if (index<array->header.size)
1510 j = array->data[index];
1512 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1517 void SetObjectArrayElement (JNIEnv *env, jobjectArray array, jsize index, jobject val)
1519 if (index>=array->header.size)
1520 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1523 /* check if the class of value is a subclass of the element class of the array */
1525 if (!builtin_instanceof(val, array->elementtype))
1526 exceptionptr = proto_java_lang_ArrayStoreException;
1528 array->data[index] = val;
1534 jbooleanArray NewBooleanArray (JNIEnv *env, jsize len)
1536 java_booleanarray *j = builtin_newarray_boolean(len);
1537 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1542 jbyteArray NewByteArray (JNIEnv *env, jsize len)
1544 java_bytearray *j = builtin_newarray_byte(len);
1545 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1550 jcharArray NewCharArray (JNIEnv *env, jsize len)
1552 java_chararray *j = builtin_newarray_char(len);
1553 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1558 jshortArray NewShortArray (JNIEnv *env, jsize len)
1560 java_shortarray *j = builtin_newarray_short(len);
1561 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1566 jintArray NewIntArray (JNIEnv *env, jsize len)
1568 java_intarray *j = builtin_newarray_int(len);
1569 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1574 jlongArray NewLongArray (JNIEnv *env, jsize len)
1576 java_longarray *j = builtin_newarray_long(len);
1577 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1582 jfloatArray NewFloatArray (JNIEnv *env, jsize len)
1584 java_floatarray *j = builtin_newarray_float(len);
1585 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1590 jdoubleArray NewDoubleArray (JNIEnv *env, jsize len)
1592 java_doublearray *j = builtin_newarray_double(len);
1593 if (!j) exceptionptr = proto_java_lang_OutOfMemoryError;
1598 jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
1600 if (isCopy) *isCopy = JNI_FALSE;
1605 jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
1607 if (isCopy) *isCopy = JNI_FALSE;
1612 jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
1614 if (isCopy) *isCopy = JNI_FALSE;
1619 jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
1621 if (isCopy) *isCopy = JNI_FALSE;
1626 jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
1628 if (isCopy) *isCopy = JNI_FALSE;
1633 jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
1635 if (isCopy) *isCopy = JNI_FALSE;
1640 jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
1642 if (isCopy) *isCopy = JNI_FALSE;
1647 jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
1649 if (isCopy) *isCopy = JNI_FALSE;
1655 void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
1661 void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
1667 void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
1673 void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
1679 void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
1685 void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
1691 void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
1697 void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
1702 void GetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
1704 if (start<0 || len<0 || start+len>array->header.size)
1705 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1707 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1711 void GetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
1713 if (start<0 || len<0 || start+len>array->header.size)
1714 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1716 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1720 void GetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
1722 if (start<0 || len<0 || start+len>array->header.size)
1723 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1725 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1729 void GetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
1731 if (start<0 || len<0 || start+len>array->header.size)
1732 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1734 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1738 void GetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
1740 if (start<0 || len<0 || start+len>array->header.size)
1741 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1743 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1747 void GetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
1749 if (start<0 || len<0 || start+len>array->header.size)
1750 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1752 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1756 void GetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
1758 if (start<0 || len<0 || start+len>array->header.size)
1759 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1761 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1765 void GetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
1767 if (start<0 || len<0 || start+len>array->header.size)
1768 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1770 memcpy(buf,&array->data[start],len*sizeof(array->data[0]));
1774 void SetBooleanArrayRegion (JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
1776 if (start<0 || len<0 || start+len>array->header.size)
1777 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1779 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1783 void SetByteArrayRegion (JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
1785 if (start<0 || len<0 || start+len>array->header.size)
1786 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1788 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1792 void SetCharArrayRegion (JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
1794 if (start<0 || len<0 || start+len>array->header.size)
1795 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1797 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1802 void SetShortArrayRegion (JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
1804 if (start<0 || len<0 || start+len>array->header.size)
1805 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1807 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1811 void SetIntArrayRegion (JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
1813 if (start<0 || len<0 || start+len>array->header.size)
1814 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1816 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1820 void SetLongArrayRegion (JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
1822 if (start<0 || len<0 || start+len>array->header.size)
1823 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1825 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1829 void SetFloatArrayRegion (JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
1831 if (start<0 || len<0 || start+len>array->header.size)
1832 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1834 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1838 void SetDoubleArrayRegion (JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
1840 if (start<0 || len<0 || start+len>array->header.size)
1841 exceptionptr = proto_java_lang_ArrayIndexOutOfBoundsException;
1843 memcpy(&array->data[start],buf,len*sizeof(array->data[0]));
1846 jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
1848 log_text("JNI-Call: RegisterNatives");
1853 jint UnregisterNatives (JNIEnv* env, jclass clazz)
1855 log_text("JNI-Call: UnregisterNatives");
1859 /******************************* monitor operations ********************************/
1861 jint MonitorEnter (JNIEnv* env, jobject obj)
1863 builtin_monitorenter(obj);
1868 jint MonitorExit (JNIEnv* env, jobject obj)
1870 builtin_monitorexit(obj);
1875 /************************************* JavaVM interface ****************************/
1877 jint GetJavaVM (JNIEnv* env, JavaVM **vm)
1879 log_text("JNI-Call: GetJavaVM");
1883 void GetStringRegion (JNIEnv* env, jstring str, jsize start, jsize len, jchar *buf)
1885 log_text("JNI-Call: GetStringRegion");
1889 void GetStringUTFRegion (JNIEnv* env, jstring str, jsize start, jsize len, char *buf)
1891 log_text("JNI-Call: GetStringUTFRegion");
1895 /****************** obtain direct pointer to array elements ***********************/
1897 void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
1899 java_arrayheader *s = (java_arrayheader*) array;
1901 switch (s->arraytype) {
1902 case ARRAYTYPE_BYTE: return (((java_bytearray*) array)->data);
1903 case ARRAYTYPE_BOOLEAN: return (((java_booleanarray*) array)->data);
1904 case ARRAYTYPE_CHAR: return (((java_chararray*) array)->data);
1905 case ARRAYTYPE_SHORT: return (((java_shortarray*) array)->data);
1906 case ARRAYTYPE_INT: return (((java_intarray*) array)->data);
1907 case ARRAYTYPE_LONG: return (((java_longarray*) array)->data);
1908 case ARRAYTYPE_FLOAT: return (((java_floatarray*) array)->data);
1909 case ARRAYTYPE_DOUBLE: return (((java_doublearray*) array)->data);
1910 case ARRAYTYPE_OBJECT: return (((java_objectarray*) array)->data);
1911 case ARRAYTYPE_ARRAY: return (((java_arrayarray*) array)->data);
1918 void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
1920 log_text("JNI-Call: ReleasePrimitiveArrayCritical");
1925 /********* returns a pointer to an array of Unicode characters of the string *******/
1927 const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
1929 log_text("JNI-Call: GetStringCritical");
1931 return GetStringChars(env,string,isCopy);
1934 /**************** native code no longer needs access to chars **********************/
1936 void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
1938 log_text("JNI-Call: ReleaseStringCritical");
1940 ReleaseStringChars(env,string,cstring);
1944 jweak NewWeakGlobalRef (JNIEnv* env, jobject obj)
1946 log_text("JNI-Call: NewWeakGlobalRef");
1952 void DeleteWeakGlobalRef (JNIEnv* env, jweak ref)
1954 log_text("JNI-Call: DeleteWeakGlobalRef");
1960 /******************************* check for pending exception ***********************/
1963 jboolean ExceptionCheck (JNIEnv* env)
1965 log_text("JNI-Call: ExceptionCheck");
1967 return exceptionptr ? JNI_TRUE : JNI_FALSE;
1970 /********************************* JNI function table ******************************/
1980 &FromReflectedMethod,
1981 &FromReflectedField,
1999 &EnsureLocalCapacity,
2011 &CallBooleanMethodV,
2012 &CallBooleanMethodA,
2037 &CallNonvirtualObjectMethod,
2038 &CallNonvirtualObjectMethodV,
2039 &CallNonvirtualObjectMethodA,
2040 &CallNonvirtualBooleanMethod,
2041 &CallNonvirtualBooleanMethodV,
2042 &CallNonvirtualBooleanMethodA,
2043 &CallNonvirtualByteMethod,
2044 &CallNonvirtualByteMethodV,
2045 &CallNonvirtualByteMethodA,
2046 &CallNonvirtualCharMethod,
2047 &CallNonvirtualCharMethodV,
2048 &CallNonvirtualCharMethodA,
2049 &CallNonvirtualShortMethod,
2050 &CallNonvirtualShortMethodV,
2051 &CallNonvirtualShortMethodA,
2052 &CallNonvirtualIntMethod,
2053 &CallNonvirtualIntMethodV,
2054 &CallNonvirtualIntMethodA,
2055 &CallNonvirtualLongMethod,
2056 &CallNonvirtualLongMethodV,
2057 &CallNonvirtualLongMethodA,
2058 &CallNonvirtualFloatMethod,
2059 &CallNonvirtualFloatMethodV,
2060 &CallNonvirtualFloatMethodA,
2061 &CallNonvirtualDoubleMethod,
2062 &CallNonvirtualDoubleMethodV,
2063 &CallNonvirtualDoubleMethodA,
2064 &CallNonvirtualVoidMethod,
2065 &CallNonvirtualVoidMethodV,
2066 &CallNonvirtualVoidMethodA,
2087 &CallStaticObjectMethod,
2088 &CallStaticObjectMethodV,
2089 &CallStaticObjectMethodA,
2090 &CallStaticBooleanMethod,
2091 &CallStaticBooleanMethodV,
2092 &CallStaticBooleanMethodA,
2093 &CallStaticByteMethod,
2094 &CallStaticByteMethodV,
2095 &CallStaticByteMethodA,
2096 &CallStaticCharMethod,
2097 &CallStaticCharMethodV,
2098 &CallStaticCharMethodA,
2099 &CallStaticShortMethod,
2100 &CallStaticShortMethodV,
2101 &CallStaticShortMethodA,
2102 &CallStaticIntMethod,
2103 &CallStaticIntMethodV,
2104 &CallStaticIntMethodA,
2105 &CallStaticLongMethod,
2106 &CallStaticLongMethodV,
2107 &CallStaticLongMethodA,
2108 &CallStaticFloatMethod,
2109 &CallStaticFloatMethodV,
2110 &CallStaticFloatMethodA,
2111 &CallStaticDoubleMethod,
2112 &CallStaticDoubleMethodV,
2113 &CallStaticDoubleMethodA,
2114 &CallStaticVoidMethod,
2115 &CallStaticVoidMethodV,
2116 &CallStaticVoidMethodA,
2118 &GetStaticObjectField,
2119 &GetStaticBooleanField,
2120 &GetStaticByteField,
2121 &GetStaticCharField,
2122 &GetStaticShortField,
2124 &GetStaticLongField,
2125 &GetStaticFloatField,
2126 &GetStaticDoubleField,
2127 &SetStaticObjectField,
2128 &SetStaticBooleanField,
2129 &SetStaticByteField,
2130 &SetStaticCharField,
2131 &SetStaticShortField,
2133 &SetStaticLongField,
2134 &SetStaticFloatField,
2135 &SetStaticDoubleField,
2139 &ReleaseStringChars,
2141 &GetStringUTFLength,
2143 &ReleaseStringUTFChars,
2146 &GetObjectArrayElement,
2147 &SetObjectArrayElement,
2156 &GetBooleanArrayElements,
2157 &GetByteArrayElements,
2158 &GetCharArrayElements,
2159 &GetShortArrayElements,
2160 &GetIntArrayElements,
2161 &GetLongArrayElements,
2162 &GetFloatArrayElements,
2163 &GetDoubleArrayElements,
2164 &ReleaseBooleanArrayElements,
2165 &ReleaseByteArrayElements,
2166 &ReleaseCharArrayElements,
2167 &ReleaseShortArrayElements,
2168 &ReleaseIntArrayElements,
2169 &ReleaseLongArrayElements,
2170 &ReleaseFloatArrayElements,
2171 &ReleaseDoubleArrayElements,
2172 &GetBooleanArrayRegion,
2173 &GetByteArrayRegion,
2174 &GetCharArrayRegion,
2175 &GetShortArrayRegion,
2177 &GetLongArrayRegion,
2178 &GetFloatArrayRegion,
2179 &GetDoubleArrayRegion,
2180 &SetBooleanArrayRegion,
2181 &SetByteArrayRegion,
2182 &SetCharArrayRegion,
2183 &SetShortArrayRegion,
2185 &SetLongArrayRegion,
2186 &SetFloatArrayRegion,
2187 &SetDoubleArrayRegion,
2194 &GetStringUTFRegion,
2195 &GetPrimitiveArrayCritical,
2196 &ReleasePrimitiveArrayCritical,
2198 &ReleaseStringCritical,
2200 &DeleteWeakGlobalRef,
2206 * These are local overrides for various environment variables in Emacs.
2207 * Please do not remove this and leave it at the end of the file, where
2208 * Emacs will automagically detect them.
2209 * ---------------------------------------------------------------------
2212 * indent-tabs-mode: t