1 // jni.cc - JNI implementation, including the jump table.
3 /* Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
5 This file is part of libgcj.
7 This software is copyrighted work licensed under the terms of the
8 Libgcj License. Please consult the file "LIBGCJ_LICENSE" for
11 // Note: currently we take the approach of not checking most
12 // arguments. Instead we could do more checking conditionally (e.g.,
13 // if DEBUG is defined). That might be beneficial in some cases,
14 // though to me it seems that one could just as easily use the
21 // Define this before including jni.h.
22 #define __GCJ_JNI_IMPL__
26 #include <java-assert.h>
29 #include <java/lang/Class.h>
30 #include <java/lang/ClassLoader.h>
31 #include <java/lang/Throwable.h>
32 #include <java/lang/ArrayIndexOutOfBoundsException.h>
33 #include <java/lang/StringIndexOutOfBoundsException.h>
34 #include <java/lang/InstantiationException.h>
35 #include <java/lang/NoSuchFieldError.h>
36 #include <java/lang/NoSuchMethodError.h>
37 #include <java/lang/reflect/Constructor.h>
38 #include <java/lang/reflect/Method.h>
39 #include <java/lang/reflect/Modifier.h>
41 #include <gcj/method.h>
42 #include <gcj/field.h>
44 #define ClassClass _CL_Q34java4lang5Class
45 extern java::lang::Class ClassClass;
46 #define ObjectClass _CL_Q34java4lang6Object
47 extern java::lang::Class ObjectClass;
49 #define MethodClass _CL_Q44java4lang7reflect6Method
50 extern java::lang::Class MethodClass;
52 // This enum is used to select different template instantiations in
53 // the invocation code.
62 // Forward declaration.
63 extern struct JNINativeInterface _Jv_JNIFunctions;
67 // Tell the GC that a certain pointer is live.
76 unmark_for_gc (void *)
84 _Jv_JNI_GetVersion (JNIEnv *)
86 return JNI_VERSION_1_2;
90 _Jv_JNI_DefineClass (JNIEnv *, jobject loader,
91 const jbyte *buf, jsize bufLen)
93 jbyteArray bytes = JvNewByteArray (bufLen);
94 jbyte *elts = elements (bytes);
95 memcpy (elts, buf, bufLen * sizeof (jbyte));
97 java::lang::ClassLoader *l
98 = reinterpret_cast<java::lang::ClassLoader *> (loader);
100 // FIXME: exception processing.
101 jclass result = l->defineClass (bytes, 0, bufLen);
106 _Jv_JNI_FindClass (JNIEnv *env, const char *name)
108 // FIXME: assume that NAME isn't too long.
109 int len = strlen (name);
111 for (int i = 0; i <= len; ++i)
112 s[i] = (name[i] == '/') ? '.' : name[i];
113 jstring n = JvNewStringUTF (s);
115 java::lang::ClassLoader *loader;
116 if (env->klass == NULL)
118 // FIXME: should use getBaseClassLoader, but we don't have that
120 loader = java::lang::ClassLoader::getSystemClassLoader ();
123 loader = env->klass->getClassLoader ();
125 // FIXME: exception processing.
126 jclass r = loader->findClass (n);
132 _Jv_JNI_GetSuperclass (JNIEnv *, jclass clazz)
134 return clazz->getSuperclass ();
138 _Jv_JNI_IsAssignableFrom(JNIEnv *, jclass clazz1, jclass clazz2)
140 return clazz1->isAssignableFrom (clazz2);
144 _Jv_JNI_Throw (JNIEnv *env, jthrowable obj)
151 _Jv_JNI_ThrowNew (JNIEnv *env, jclass clazz, const char *message)
153 using namespace java::lang::reflect;
155 JArray<jclass> *argtypes
156 = (JArray<jclass> *) JvNewObjectArray (1, &ClassClass, NULL);
158 jclass *elts = elements (argtypes);
159 elts[0] = &StringClass;
161 // FIXME: exception processing.
162 Constructor *cons = clazz->getConstructor (argtypes);
164 jobjectArray values = JvNewObjectArray (1, &StringClass, NULL);
165 jobject *velts = elements (values);
166 velts[0] = JvNewStringUTF (message);
168 // FIXME: exception processing.
169 jobject obj = cons->newInstance (values);
171 env->ex = reinterpret_cast<jthrowable> (obj);
176 _Jv_JNI_ExceptionOccurred (JNIEnv *env)
178 // FIXME: create local reference.
183 _Jv_JNI_ExceptionDescribe (JNIEnv *env)
186 env->ex->printStackTrace();
190 _Jv_JNI_ExceptionClear (JNIEnv *env)
196 _Jv_JNI_ExceptionCheck (JNIEnv *env)
198 return env->ex != NULL;
202 _Jv_JNI_FatalError (JNIEnv *, const char *message)
208 _Jv_JNI_IsSameObject (JNIEnv *, jobject obj1, jobject obj2)
214 _Jv_JNI_AllocObject (JNIEnv *env, jclass clazz)
217 using namespace java::lang::reflect;
218 if (clazz->isInterface() || Modifier::isAbstract(clazz->getModifiers()))
219 env->ex = new java::lang::InstantiationException ();
222 // FIXME: exception processing.
223 // FIXME: will this work for String?
224 obj = JvAllocObject (clazz);
231 _Jv_JNI_GetObjectClass (JNIEnv *, jobject obj)
233 return obj->getClass();
237 _Jv_JNI_IsInstanceOf (JNIEnv *, jobject obj, jclass clazz)
239 return clazz->isInstance(obj);
245 // This section concerns method invocation.
248 template<jboolean is_static>
250 _Jv_JNI_GetAnyMethodID (JNIEnv *env, jclass clazz,
251 const char *name, const char *sig)
253 // FIXME: exception processing.
254 _Jv_InitClass (clazz);
256 _Jv_Utf8Const *name_u = _Jv_makeUtf8Const ((char *) name, -1);
257 _Jv_Utf8Const *sig_u = _Jv_makeUtf8Const ((char *) sig, -1);
259 JvAssert (! clazz->isPrimitive());
261 using namespace java::lang::reflect;
263 while (clazz != NULL)
265 jint count = JvNumMethods (clazz);
266 jmethodID meth = JvGetFirstMethod (clazz);
268 for (jint i = 0; i < count; ++i)
270 if (((is_static && Modifier::isStatic (meth->accflags))
271 || (! is_static && ! Modifier::isStatic (meth->accflags)))
272 && _Jv_equalUtf8Consts (meth->name, name_u)
273 && _Jv_equalUtf8Consts (meth->signature, sig_u))
276 meth = meth->getNextMethod();
279 clazz = clazz->getSuperclass ();
282 env->ex = new java::lang::NoSuchMethodError ();
286 // This is a helper function which turns a va_list into an array of
287 // `jvalue's. It needs signature information in order to do its work.
288 // The array of values must already be allocated.
290 array_from_valist (jvalue *values, JArray<jclass> *arg_types, va_list vargs)
292 jclass *arg_elts = elements (arg_types);
293 for (int i = 0; i < arg_types->length; ++i)
295 if (arg_elts[i] == JvPrimClass (byte))
296 values[i].b = va_arg (vargs, jbyte);
297 else if (arg_elts[i] == JvPrimClass (short))
298 values[i].s = va_arg (vargs, jshort);
299 else if (arg_elts[i] == JvPrimClass (int))
300 values[i].i = va_arg (vargs, jint);
301 else if (arg_elts[i] == JvPrimClass (long))
302 values[i].j = va_arg (vargs, jlong);
303 else if (arg_elts[i] == JvPrimClass (float))
304 values[i].f = va_arg (vargs, jfloat);
305 else if (arg_elts[i] == JvPrimClass (double))
306 values[i].d = va_arg (vargs, jdouble);
307 else if (arg_elts[i] == JvPrimClass (boolean))
308 values[i].z = va_arg (vargs, jboolean);
309 else if (arg_elts[i] == JvPrimClass (char))
310 values[i].c = va_arg (vargs, jchar);
314 values[i].l = va_arg (vargs, jobject);
319 // This can call any sort of method: virtual, "nonvirtual", static, or
321 template<typename T, invocation_type style>
323 _Jv_JNI_CallAnyMethodV (JNIEnv *env, jobject obj, jclass klass,
324 jmethodID id, va_list vargs)
327 id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
329 jclass decl_class = klass ? klass : obj->getClass ();
330 JvAssert (decl_class != NULL);
333 JArray<jclass> *arg_types;
334 // FIXME: exception processing.
335 _Jv_GetTypesFromSignature (id, decl_class,
336 &arg_types, &return_type);
338 jvalue args[arg_types->length];
339 array_from_valist (args, arg_types, vargs);
342 jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id,
343 style == constructor,
344 arg_types, args, &result);
349 // We cheat a little here. FIXME.
350 return * (T *) &result;
353 template<typename T, invocation_type style>
355 _Jv_JNI_CallAnyMethod (JNIEnv *env, jobject obj, jclass klass,
356 jmethodID method, ...)
361 va_start (args, method);
362 result = _Jv_JNI_CallAnyMethodV<T, style> (env, obj, klass, method, args);
368 template<typename T, invocation_type style>
370 _Jv_JNI_CallAnyMethodA (JNIEnv *env, jobject obj, jclass klass,
371 jmethodID id, jvalue *args)
374 id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
376 jclass decl_class = klass ? klass : obj->getClass ();
377 JvAssert (decl_class != NULL);
380 JArray<jclass> *arg_types;
381 // FIXME: exception processing.
382 _Jv_GetTypesFromSignature (id, decl_class,
383 &arg_types, &return_type);
386 jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id,
387 style == constructor,
388 arg_types, args, &result);
393 // We cheat a little here. FIXME.
394 return * (T *) &result;
397 template<invocation_type style>
399 _Jv_JNI_CallAnyVoidMethodV (JNIEnv *env, jobject obj, jclass klass,
400 jmethodID id, va_list vargs)
403 id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
405 jclass decl_class = klass ? klass : obj->getClass ();
406 JvAssert (decl_class != NULL);
409 JArray<jclass> *arg_types;
410 // FIXME: exception processing.
411 _Jv_GetTypesFromSignature (id, decl_class,
412 &arg_types, &return_type);
414 jvalue args[arg_types->length];
415 array_from_valist (args, arg_types, vargs);
417 jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id,
418 style == constructor,
419 arg_types, args, NULL);
425 template<invocation_type style>
427 _Jv_JNI_CallAnyVoidMethod (JNIEnv *env, jobject obj, jclass klass,
428 jmethodID method, ...)
432 va_start (args, method);
433 _Jv_JNI_CallAnyVoidMethodV<style> (env, obj, klass, method, args);
437 template<invocation_type style>
439 _Jv_JNI_CallAnyVoidMethodA (JNIEnv *env, jobject obj, jclass klass,
440 jmethodID id, jvalue *args)
443 id = _Jv_LookupDeclaredMethod (obj->getClass (), id->name, id->signature);
445 jclass decl_class = klass ? klass : obj->getClass ();
446 JvAssert (decl_class != NULL);
449 JArray<jclass> *arg_types;
450 // FIXME: exception processing.
451 _Jv_GetTypesFromSignature (id, decl_class,
452 &arg_types, &return_type);
454 jthrowable ex = _Jv_CallAnyMethodA (obj, return_type, id,
455 style == constructor,
456 arg_types, args, NULL);
462 // Functions with this signature are used to implement functions in
463 // the CallMethod family.
466 _Jv_JNI_CallMethodV (JNIEnv *env, jobject obj, jmethodID id, va_list args)
468 return _Jv_JNI_CallAnyMethodV<T, normal> (env, obj, NULL, id, args);
471 // Functions with this signature are used to implement functions in
472 // the CallMethod family.
475 _Jv_JNI_CallMethod (JNIEnv *env, jobject obj, jmethodID id, ...)
481 result = _Jv_JNI_CallAnyMethodV<T, normal> (env, obj, NULL, id, args);
487 // Functions with this signature are used to implement functions in
488 // the CallMethod family.
491 _Jv_JNI_CallMethodA (JNIEnv *env, jobject obj, jmethodID id, jvalue *args)
493 return _Jv_JNI_CallAnyMethodA<T, normal> (env, obj, NULL, id, args);
497 _Jv_JNI_CallVoidMethodV (JNIEnv *env, jobject obj, jmethodID id, va_list args)
499 _Jv_JNI_CallAnyVoidMethodV<normal> (env, obj, NULL, id, args);
503 _Jv_JNI_CallVoidMethod (JNIEnv *env, jobject obj, jmethodID id, ...)
508 _Jv_JNI_CallAnyVoidMethodV<normal> (env, obj, NULL, id, args);
513 _Jv_JNI_CallVoidMethodA (JNIEnv *env, jobject obj, jmethodID id, jvalue *args)
515 _Jv_JNI_CallAnyVoidMethodA<normal> (env, obj, NULL, id, args);
518 // Functions with this signature are used to implement functions in
519 // the CallStaticMethod family.
522 _Jv_JNI_CallStaticMethodV (JNIEnv *env, jclass klass,
523 jmethodID id, va_list args)
525 return _Jv_JNI_CallAnyMethodV<T, static_type> (env, NULL, klass, id, args);
528 // Functions with this signature are used to implement functions in
529 // the CallStaticMethod family.
532 _Jv_JNI_CallStaticMethod (JNIEnv *env, jclass klass, jmethodID id, ...)
538 result = _Jv_JNI_CallAnyMethodV<T, static_type> (env, NULL, klass,
545 // Functions with this signature are used to implement functions in
546 // the CallStaticMethod family.
549 _Jv_JNI_CallStaticMethodA (JNIEnv *env, jclass klass, jmethodID id,
552 return _Jv_JNI_CallAnyMethodA<T, static_type> (env, NULL, klass, id, args);
556 _Jv_JNI_CallStaticVoidMethodV (JNIEnv *env, jclass klass, jmethodID id,
559 _Jv_JNI_CallAnyVoidMethodV<static_type> (env, NULL, klass, id, args);
563 _Jv_JNI_CallStaticVoidMethod (JNIEnv *env, jclass klass, jmethodID id, ...)
568 _Jv_JNI_CallAnyVoidMethodV<static_type> (env, NULL, klass, id, args);
573 _Jv_JNI_CallStaticVoidMethodA (JNIEnv *env, jclass klass, jmethodID id,
576 _Jv_JNI_CallAnyVoidMethodA<static_type> (env, NULL, klass, id, args);
580 _Jv_JNI_NewObjectV (JNIEnv *env, jclass klass,
581 jmethodID id, va_list args)
583 return _Jv_JNI_CallAnyMethodV<jobject, constructor> (env, NULL, klass,
588 _Jv_JNI_NewObject (JNIEnv *env, jclass klass, jmethodID id, ...)
594 result = _Jv_JNI_CallAnyMethodV<jobject, constructor> (env, NULL, klass,
602 _Jv_JNI_NewObjectA (JNIEnv *env, jclass klass, jmethodID id,
605 return _Jv_JNI_CallAnyMethodA<jobject, constructor> (env, NULL, klass,
613 _Jv_JNI_GetField (JNIEnv *, jobject obj, jfieldID field)
615 T *ptr = (T *) ((char *) obj + field->getOffset ());
621 _Jv_JNI_SetField (JNIEnv *, jobject obj, jfieldID field, T value)
623 T *ptr = (T *) ((char *) obj + field->getOffset ());
627 template<jboolean is_static>
629 _Jv_JNI_GetAnyFieldID (JNIEnv *env, jclass clazz,
630 const char *name, const char *sig)
632 // FIXME: exception processing.
633 _Jv_InitClass (clazz);
635 _Jv_Utf8Const *a_name = _Jv_makeUtf8Const ((char *) name, -1);
637 jclass field_class = NULL;
639 field_class = _Jv_FindClassFromSignature ((char *) sig, NULL);
642 _Jv_Utf8Const *sig_u = _Jv_makeUtf8Const ((char *) sig, -1);
643 field_class = _Jv_FindClass (sig_u, NULL);
646 // FIXME: what if field_class == NULL?
648 while (clazz != NULL)
650 jint count = (is_static
651 ? JvNumStaticFields (clazz)
652 : JvNumInstanceFields (clazz));
653 jfieldID field = (is_static
654 ? JvGetFirstStaticField (clazz)
655 : JvGetFirstInstanceField (clazz));
656 for (jint i = 0; i < count; ++i)
658 // The field is resolved as a side effect of class
660 JvAssert (field->isResolved ());
662 _Jv_Utf8Const *f_name = field->getNameUtf8Const(clazz);
664 if (_Jv_equalUtf8Consts (f_name, a_name)
665 && field->getClass() == field_class)
668 field = field->getNextField ();
671 clazz = clazz->getSuperclass ();
674 env->ex = new java::lang::NoSuchFieldError ();
680 _Jv_JNI_GetStaticField (JNIEnv *, jclass, jfieldID field)
682 T *ptr = (T *) field->u.addr;
688 _Jv_JNI_SetStaticField (JNIEnv *, jclass, jfieldID field, T value)
690 T *ptr = (T *) field->u.addr;
695 _Jv_JNI_NewString (JNIEnv *, const jchar *unichars, jsize len)
697 // FIXME: exception processing.
698 jstring r = _Jv_NewString (unichars, len);
703 _Jv_JNI_GetStringLength (JNIEnv *, jstring string)
705 return string->length();
709 _Jv_JNI_GetStringChars (JNIEnv *, jstring string, jboolean *isCopy)
711 jchar *result = _Jv_GetStringChars (string);
712 mark_for_gc (result);
715 return (const jchar *) result;
719 _Jv_JNI_ReleaseStringChars (JNIEnv *, jstring, const jchar *chars)
721 unmark_for_gc ((void *) chars);
725 _Jv_JNI_NewStringUTF (JNIEnv *, const char *bytes)
727 // FIXME: exception processing.
728 jstring r = JvNewStringUTF (bytes);
733 _Jv_JNI_GetStringUTFLength (JNIEnv *, jstring string)
735 return JvGetStringUTFLength (string);
739 _Jv_JNI_GetStringUTFChars (JNIEnv *, jstring string, jboolean *isCopy)
741 jsize len = JvGetStringUTFLength (string);
742 // FIXME: exception processing.
743 char *r = (char *) _Jv_Malloc (len + 1);
744 JvGetStringUTFRegion (string, 0, len, r);
750 return (const char *) r;
754 _Jv_JNI_ReleaseStringUTFChars (JNIEnv *, jstring, const char *utf)
756 _Jv_Free ((void *) utf);
760 _Jv_JNI_GetStringRegion (JNIEnv *env, jstring string, jsize start, jsize len,
763 jchar *result = _Jv_GetStringChars (string);
764 if (start < 0 || start > string->length ()
765 || len < 0 || start + len > string->length ())
766 env->ex = new java::lang::StringIndexOutOfBoundsException ();
768 memcpy (buf, &result[start], len * sizeof (jchar));
772 _Jv_JNI_GetStringUTFRegion (JNIEnv *env, jstring str, jsize start,
773 jsize len, char *buf)
775 if (start < 0 || start > str->length ()
776 || len < 0 || start + len > str->length ())
777 env->ex = new java::lang::StringIndexOutOfBoundsException ();
779 _Jv_GetStringUTFRegion (str, start, len, buf);
783 _Jv_JNI_GetStringCritical (JNIEnv *, jstring str, jboolean *isCopy)
785 jchar *result = _Jv_GetStringChars (str);
792 _Jv_JNI_ReleaseStringCritical (JNIEnv *, jstring, const jchar *)
798 _Jv_JNI_GetArrayLength (JNIEnv *, jarray array)
800 return array->length;
804 _Jv_JNI_NewObjectArray (JNIEnv *, jsize length, jclass elementClass,
807 // FIXME: exception processing.
808 jarray result = JvNewObjectArray (length, elementClass, init);
813 _Jv_JNI_GetObjectArrayElement (JNIEnv *, jobjectArray array, jsize index)
815 jobject *elts = elements (array);
820 _Jv_JNI_SetObjectArrayElement (JNIEnv *, jobjectArray array, jsize index,
823 // FIXME: exception processing.
824 _Jv_CheckArrayStore (array, value);
825 jobject *elts = elements (array);
829 template<typename T, jclass K>
831 _Jv_JNI_NewPrimitiveArray (JNIEnv *, jsize length)
833 return (JArray<T> *) _Jv_NewPrimArray (K, length);
838 _Jv_JNI_GetPrimitiveArrayElements (JNIEnv *, JArray<T> *array,
841 T *elts = elements (array);
844 // We elect never to copy.
853 _Jv_JNI_ReleasePrimitiveArrayElements (JNIEnv *, JArray<T> *,
854 T *elems, jint /* mode */)
856 // Note that we ignore MODE. We can do this because we never copy
857 // the array elements. My reading of the JNI documentation is that
858 // this is an option for the implementor.
859 unmark_for_gc (elems);
864 _Jv_JNI_GetPrimitiveArrayRegion (JNIEnv *env, JArray<T> *array,
865 jsize start, jsize len,
868 if (start < 0 || len >= array->length || start + len >= array->length)
871 env->ex = new java::lang::ArrayIndexOutOfBoundsException ();
875 T *elts = elements (array) + start;
876 memcpy (buf, elts, len * sizeof (T));
882 _Jv_JNI_SetPrimitiveArrayRegion (JNIEnv *env, JArray<T> *array,
883 jsize start, jsize len, T *buf)
885 if (start < 0 || len >= array->length || start + len >= array->length)
888 env->ex = new java::lang::ArrayIndexOutOfBoundsException ();
892 T *elts = elements (array) + start;
893 memcpy (elts, buf, len * sizeof (T));
898 _Jv_JNI_GetPrimitiveArrayCritical (JNIEnv *, jarray array,
901 // FIXME: does this work?
902 jclass klass = array->getClass()->getComponentType();
903 JvAssert (klass->isPrimitive ());
904 char *r = _Jv_GetArrayElementFromElementType (array, klass);
911 _Jv_JNI_ReleasePrimitiveArrayCritical (JNIEnv *, jarray, void *, jint)
917 _Jv_JNI_MonitorEnter (JNIEnv *, jobject obj)
919 // FIXME: exception processing.
920 jint r = _Jv_MonitorEnter (obj);
925 _Jv_JNI_MonitorExit (JNIEnv *, jobject obj)
927 // FIXME: exception processing.
928 jint r = _Jv_MonitorExit (obj);
934 _Jv_JNI_ToReflectedField (JNIEnv *, jclass cls, jfieldID fieldID,
937 // FIXME: exception processing.
938 java::lang::reflect::Field *field = new java::lang::reflect::Field();
939 field->declaringClass = cls;
940 field->offset = (char*) fieldID - (char *) cls->fields;
941 field->name = _Jv_NewStringUtf8Const (fieldID->getNameUtf8Const (cls));
942 // FIXME: make a local reference.
948 _Jv_JNI_FromReflectedField (JNIEnv *, jobject f)
950 using namespace java::lang::reflect;
952 Field *field = reinterpret_cast<Field *> (f);
953 return _Jv_FromReflectedField (field);
957 _Jv_JNI_ToReflectedMethod (JNIEnv *, jclass klass, jmethodID id,
960 using namespace java::lang::reflect;
963 static _Jv_Utf8Const *init_name = _Jv_makeUtf8Const ("<init>", 6);
966 if (_Jv_equalUtf8Consts (id->name, init_name))
969 Constructor *cons = new Constructor ();
970 cons->offset = (char *) id - (char *) &klass->methods;
971 cons->declaringClass = klass;
976 Method *meth = new Method ();
977 meth->offset = (char *) id - (char *) &klass->methods;
978 meth->declaringClass = klass;
982 // FIXME: make a local reference.
987 _Jv_JNI_FromReflectedMethod (JNIEnv *, jobject method)
989 using namespace java::lang::reflect;
990 if ((&MethodClass)->isInstance (method))
991 return _Jv_FromReflectedMethod (reinterpret_cast<Method *> (method));
993 _Jv_FromReflectedConstructor (reinterpret_cast<Constructor *> (method));
998 // This function is the stub which is used to turn an ordinary (CNI)
999 // method call into a JNI call.
1001 template<typename T>
1003 _Jv_JNI_conversion_call (fixme)
1007 env.p = &_Jv_JNIFunctions;
1011 T result = FIXME_ffi_call (args);
1022 #define NOT_IMPL NULL
1023 #define RESERVED NULL
1025 struct JNINativeInterface _Jv_JNIFunctions =
1032 _Jv_JNI_DefineClass,
1034 _Jv_JNI_FromReflectedMethod,
1035 _Jv_JNI_FromReflectedField,
1036 _Jv_JNI_ToReflectedMethod,
1037 _Jv_JNI_GetSuperclass,
1038 _Jv_JNI_IsAssignableFrom,
1039 _Jv_JNI_ToReflectedField,
1042 _Jv_JNI_ExceptionOccurred,
1043 _Jv_JNI_ExceptionDescribe,
1044 _Jv_JNI_ExceptionClear,
1048 NOT_IMPL /* NewGlobalRef */,
1049 NOT_IMPL /* DeleteGlobalRef */,
1050 NOT_IMPL /* DeleteLocalRef */,
1051 _Jv_JNI_IsSameObject,
1054 _Jv_JNI_AllocObject,
1058 _Jv_JNI_GetObjectClass,
1059 _Jv_JNI_IsInstanceOf,
1060 _Jv_JNI_GetAnyMethodID<false>,
1062 _Jv_JNI_CallMethod<jobject>,
1063 _Jv_JNI_CallMethodV<jobject>,
1064 _Jv_JNI_CallMethodA<jobject>,
1065 _Jv_JNI_CallMethod<jboolean>,
1066 _Jv_JNI_CallMethodV<jboolean>,
1067 _Jv_JNI_CallMethodA<jboolean>,
1068 _Jv_JNI_CallMethod<jbyte>,
1069 _Jv_JNI_CallMethodV<jbyte>,
1070 _Jv_JNI_CallMethodA<jbyte>,
1071 _Jv_JNI_CallMethod<jchar>,
1072 _Jv_JNI_CallMethodV<jchar>,
1073 _Jv_JNI_CallMethodA<jchar>,
1074 _Jv_JNI_CallMethod<jshort>,
1075 _Jv_JNI_CallMethodV<jshort>,
1076 _Jv_JNI_CallMethodA<jshort>,
1077 _Jv_JNI_CallMethod<jint>,
1078 _Jv_JNI_CallMethodV<jint>,
1079 _Jv_JNI_CallMethodA<jint>,
1080 _Jv_JNI_CallMethod<jlong>,
1081 _Jv_JNI_CallMethodV<jlong>,
1082 _Jv_JNI_CallMethodA<jlong>,
1083 _Jv_JNI_CallMethod<jfloat>,
1084 _Jv_JNI_CallMethodV<jfloat>,
1085 _Jv_JNI_CallMethodA<jfloat>,
1086 _Jv_JNI_CallMethod<jdouble>,
1087 _Jv_JNI_CallMethodV<jdouble>,
1088 _Jv_JNI_CallMethodA<jdouble>,
1089 _Jv_JNI_CallVoidMethod,
1090 _Jv_JNI_CallVoidMethodV,
1091 _Jv_JNI_CallVoidMethodA,
1093 // Nonvirtual method invocation functions follow.
1094 _Jv_JNI_CallAnyMethod<jobject, nonvirtual>,
1095 _Jv_JNI_CallAnyMethodV<jobject, nonvirtual>,
1096 _Jv_JNI_CallAnyMethodA<jobject, nonvirtual>,
1097 _Jv_JNI_CallAnyMethod<jboolean, nonvirtual>,
1098 _Jv_JNI_CallAnyMethodV<jboolean, nonvirtual>,
1099 _Jv_JNI_CallAnyMethodA<jboolean, nonvirtual>,
1100 _Jv_JNI_CallAnyMethod<jbyte, nonvirtual>,
1101 _Jv_JNI_CallAnyMethodV<jbyte, nonvirtual>,
1102 _Jv_JNI_CallAnyMethodA<jbyte, nonvirtual>,
1103 _Jv_JNI_CallAnyMethod<jchar, nonvirtual>,
1104 _Jv_JNI_CallAnyMethodV<jchar, nonvirtual>,
1105 _Jv_JNI_CallAnyMethodA<jchar, nonvirtual>,
1106 _Jv_JNI_CallAnyMethod<jshort, nonvirtual>,
1107 _Jv_JNI_CallAnyMethodV<jshort, nonvirtual>,
1108 _Jv_JNI_CallAnyMethodA<jshort, nonvirtual>,
1109 _Jv_JNI_CallAnyMethod<jint, nonvirtual>,
1110 _Jv_JNI_CallAnyMethodV<jint, nonvirtual>,
1111 _Jv_JNI_CallAnyMethodA<jint, nonvirtual>,
1112 _Jv_JNI_CallAnyMethod<jlong, nonvirtual>,
1113 _Jv_JNI_CallAnyMethodV<jlong, nonvirtual>,
1114 _Jv_JNI_CallAnyMethodA<jlong, nonvirtual>,
1115 _Jv_JNI_CallAnyMethod<jfloat, nonvirtual>,
1116 _Jv_JNI_CallAnyMethodV<jfloat, nonvirtual>,
1117 _Jv_JNI_CallAnyMethodA<jfloat, nonvirtual>,
1118 _Jv_JNI_CallAnyMethod<jdouble, nonvirtual>,
1119 _Jv_JNI_CallAnyMethodV<jdouble, nonvirtual>,
1120 _Jv_JNI_CallAnyMethodA<jdouble, nonvirtual>,
1121 _Jv_JNI_CallAnyVoidMethod<nonvirtual>,
1122 _Jv_JNI_CallAnyVoidMethodV<nonvirtual>,
1123 _Jv_JNI_CallAnyVoidMethodA<nonvirtual>,
1125 _Jv_JNI_GetAnyFieldID<false>,
1126 _Jv_JNI_GetField<jobject>,
1127 _Jv_JNI_GetField<jboolean>,
1128 _Jv_JNI_GetField<jbyte>,
1129 _Jv_JNI_GetField<jchar>,
1130 _Jv_JNI_GetField<jshort>,
1131 _Jv_JNI_GetField<jint>,
1132 _Jv_JNI_GetField<jlong>,
1133 _Jv_JNI_GetField<jfloat>,
1134 _Jv_JNI_GetField<jdouble>,
1144 _Jv_JNI_GetAnyMethodID<true>,
1146 _Jv_JNI_CallStaticMethod<jobject>,
1147 _Jv_JNI_CallStaticMethodV<jobject>,
1148 _Jv_JNI_CallStaticMethodA<jobject>,
1149 _Jv_JNI_CallStaticMethod<jboolean>,
1150 _Jv_JNI_CallStaticMethodV<jboolean>,
1151 _Jv_JNI_CallStaticMethodA<jboolean>,
1152 _Jv_JNI_CallStaticMethod<jbyte>,
1153 _Jv_JNI_CallStaticMethodV<jbyte>,
1154 _Jv_JNI_CallStaticMethodA<jbyte>,
1155 _Jv_JNI_CallStaticMethod<jchar>,
1156 _Jv_JNI_CallStaticMethodV<jchar>,
1157 _Jv_JNI_CallStaticMethodA<jchar>,
1158 _Jv_JNI_CallStaticMethod<jshort>,
1159 _Jv_JNI_CallStaticMethodV<jshort>,
1160 _Jv_JNI_CallStaticMethodA<jshort>,
1161 _Jv_JNI_CallStaticMethod<jint>,
1162 _Jv_JNI_CallStaticMethodV<jint>,
1163 _Jv_JNI_CallStaticMethodA<jint>,
1164 _Jv_JNI_CallStaticMethod<jlong>,
1165 _Jv_JNI_CallStaticMethodV<jlong>,
1166 _Jv_JNI_CallStaticMethodA<jlong>,
1167 _Jv_JNI_CallStaticMethod<jfloat>,
1168 _Jv_JNI_CallStaticMethodV<jfloat>,
1169 _Jv_JNI_CallStaticMethodA<jfloat>,
1170 _Jv_JNI_CallStaticMethod<jdouble>,
1171 _Jv_JNI_CallStaticMethodV<jdouble>,
1172 _Jv_JNI_CallStaticMethodA<jdouble>,
1173 _Jv_JNI_CallStaticVoidMethod,
1174 _Jv_JNI_CallStaticVoidMethodV,
1175 _Jv_JNI_CallStaticVoidMethodA,
1177 _Jv_JNI_GetAnyFieldID<true>,
1178 _Jv_JNI_GetStaticField<jobject>,
1179 _Jv_JNI_GetStaticField<jboolean>,
1180 _Jv_JNI_GetStaticField<jbyte>,
1181 _Jv_JNI_GetStaticField<jchar>,
1182 _Jv_JNI_GetStaticField<jshort>,
1183 _Jv_JNI_GetStaticField<jint>,
1184 _Jv_JNI_GetStaticField<jlong>,
1185 _Jv_JNI_GetStaticField<jfloat>,
1186 _Jv_JNI_GetStaticField<jdouble>,
1187 _Jv_JNI_SetStaticField,
1188 _Jv_JNI_SetStaticField,
1189 _Jv_JNI_SetStaticField,
1190 _Jv_JNI_SetStaticField,
1191 _Jv_JNI_SetStaticField,
1192 _Jv_JNI_SetStaticField,
1193 _Jv_JNI_SetStaticField,
1194 _Jv_JNI_SetStaticField,
1195 _Jv_JNI_SetStaticField,
1197 _Jv_JNI_GetStringLength,
1198 _Jv_JNI_GetStringChars,
1199 _Jv_JNI_ReleaseStringChars,
1200 _Jv_JNI_NewStringUTF,
1201 _Jv_JNI_GetStringUTFLength,
1202 _Jv_JNI_GetStringUTFChars,
1203 _Jv_JNI_ReleaseStringUTFChars,
1204 _Jv_JNI_GetArrayLength,
1205 _Jv_JNI_NewObjectArray,
1206 _Jv_JNI_GetObjectArrayElement,
1207 _Jv_JNI_SetObjectArrayElement,
1208 _Jv_JNI_NewPrimitiveArray<jboolean, JvPrimClass (boolean)>,
1209 _Jv_JNI_NewPrimitiveArray<jbyte, JvPrimClass (byte)>,
1210 _Jv_JNI_NewPrimitiveArray<jchar, JvPrimClass (char)>,
1211 _Jv_JNI_NewPrimitiveArray<jshort, JvPrimClass (short)>,
1212 _Jv_JNI_NewPrimitiveArray<jint, JvPrimClass (int)>,
1213 _Jv_JNI_NewPrimitiveArray<jlong, JvPrimClass (long)>,
1214 _Jv_JNI_NewPrimitiveArray<jfloat, JvPrimClass (float)>,
1215 _Jv_JNI_NewPrimitiveArray<jdouble, JvPrimClass (double)>,
1216 _Jv_JNI_GetPrimitiveArrayElements,
1217 _Jv_JNI_GetPrimitiveArrayElements,
1218 _Jv_JNI_GetPrimitiveArrayElements,
1219 _Jv_JNI_GetPrimitiveArrayElements,
1220 _Jv_JNI_GetPrimitiveArrayElements,
1221 _Jv_JNI_GetPrimitiveArrayElements,
1222 _Jv_JNI_GetPrimitiveArrayElements,
1223 _Jv_JNI_GetPrimitiveArrayElements,
1224 _Jv_JNI_ReleasePrimitiveArrayElements,
1225 _Jv_JNI_ReleasePrimitiveArrayElements,
1226 _Jv_JNI_ReleasePrimitiveArrayElements,
1227 _Jv_JNI_ReleasePrimitiveArrayElements,
1228 _Jv_JNI_ReleasePrimitiveArrayElements,
1229 _Jv_JNI_ReleasePrimitiveArrayElements,
1230 _Jv_JNI_ReleasePrimitiveArrayElements,
1231 _Jv_JNI_ReleasePrimitiveArrayElements,
1232 _Jv_JNI_GetPrimitiveArrayRegion,
1233 _Jv_JNI_GetPrimitiveArrayRegion,
1234 _Jv_JNI_GetPrimitiveArrayRegion,
1235 _Jv_JNI_GetPrimitiveArrayRegion,
1236 _Jv_JNI_GetPrimitiveArrayRegion,
1237 _Jv_JNI_GetPrimitiveArrayRegion,
1238 _Jv_JNI_GetPrimitiveArrayRegion,
1239 _Jv_JNI_GetPrimitiveArrayRegion,
1240 _Jv_JNI_SetPrimitiveArrayRegion,
1241 _Jv_JNI_SetPrimitiveArrayRegion,
1242 _Jv_JNI_SetPrimitiveArrayRegion,
1243 _Jv_JNI_SetPrimitiveArrayRegion,
1244 _Jv_JNI_SetPrimitiveArrayRegion,
1245 _Jv_JNI_SetPrimitiveArrayRegion,
1246 _Jv_JNI_SetPrimitiveArrayRegion,
1247 _Jv_JNI_SetPrimitiveArrayRegion,
1248 NOT_IMPL /* RegisterNatives */,
1249 NOT_IMPL /* UnregisterNatives */,
1250 _Jv_JNI_MonitorEnter,
1251 _Jv_JNI_MonitorExit,
1252 NOT_IMPL /* GetJavaVM */,
1254 _Jv_JNI_GetStringRegion,
1255 _Jv_JNI_GetStringUTFRegion,
1256 _Jv_JNI_GetPrimitiveArrayCritical,
1257 _Jv_JNI_ReleasePrimitiveArrayCritical,
1258 _Jv_JNI_GetStringCritical,
1259 _Jv_JNI_ReleaseStringCritical,
1261 NOT_IMPL /* newweakglobalref */,
1262 NOT_IMPL /* deleteweakglobalref */,
1264 _Jv_JNI_ExceptionCheck