aoqi@0: /* aoqi@0: * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: * aoqi@0: */ aoqi@0: aoqi@1: /* aoqi@1: * This file has been modified by Loongson Technology in 2015. These aoqi@1: * modifications are Copyright (c) 2015 Loongson Technology, and are made aoqi@1: * available on the same license terms set forth above. aoqi@1: */ aoqi@1: aoqi@0: #include "precompiled.hpp" aoqi@0: #include "classfile/systemDictionary.hpp" aoqi@0: #include "classfile/vmSymbols.hpp" aoqi@0: #include "oops/instanceKlass.hpp" aoqi@0: #include "oops/oop.inline.hpp" aoqi@0: #include "oops/symbol.hpp" aoqi@0: #include "prims/jni.h" aoqi@0: #include "prims/jniCheck.hpp" aoqi@0: #include "prims/jvm_misc.hpp" aoqi@0: #include "runtime/fieldDescriptor.hpp" aoqi@0: #include "runtime/handles.hpp" aoqi@0: #include "runtime/interfaceSupport.hpp" aoqi@0: #include "runtime/jfieldIDWorkaround.hpp" aoqi@0: #include "runtime/thread.hpp" aoqi@0: #ifdef TARGET_ARCH_x86 aoqi@0: # include "jniTypes_x86.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_ARCH_sparc aoqi@0: # include "jniTypes_sparc.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_ARCH_zero aoqi@0: # include "jniTypes_zero.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_ARCH_arm aoqi@0: # include "jniTypes_arm.hpp" aoqi@0: #endif aoqi@0: #ifdef TARGET_ARCH_ppc aoqi@0: # include "jniTypes_ppc.hpp" aoqi@0: #endif aoqi@1: #ifdef TARGET_ARCH_mips aoqi@1: # include "jniTypes_mips.hpp" aoqi@1: #endif aoqi@0: aoqi@0: aoqi@0: // Heap objects are allowed to be directly referenced only in VM code, aoqi@0: // not in native code. aoqi@0: aoqi@0: #define ASSERT_OOPS_ALLOWED \ aoqi@0: assert(JavaThread::current()->thread_state() == _thread_in_vm, \ aoqi@0: "jniCheck examining oops in bad state.") aoqi@0: aoqi@0: aoqi@0: // Execute the given block of source code with the thread in VM state. aoqi@0: // To do this, transition from the NATIVE state to the VM state, execute aoqi@0: // the code, and transtition back. The ThreadInVMfromNative constructor aoqi@0: // performs the transition to VM state, its destructor restores the aoqi@0: // NATIVE state. aoqi@0: aoqi@0: #define IN_VM(source_code) { \ aoqi@0: { \ aoqi@0: ThreadInVMfromNative __tiv(thr); \ aoqi@0: source_code \ aoqi@0: } \ aoqi@0: } aoqi@0: aoqi@0: aoqi@0: /* aoqi@0: * DECLARATIONS aoqi@0: */ aoqi@0: aoqi@0: static struct JNINativeInterface_ * unchecked_jni_NativeInterface; aoqi@0: aoqi@0: aoqi@0: /* aoqi@0: * MACRO DEFINITIONS aoqi@0: */ aoqi@0: aoqi@0: // All JNI checked functions here use JNI_ENTRY_CHECKED() instead of the aoqi@0: // QUICK_ENTRY or LEAF variants found in jni.cpp. This allows handles aoqi@0: // to be created if a fatal error should occur. aoqi@0: aoqi@0: // Check for thread not attached to VM; need to catch this before aoqi@0: // assertions in the wrapper routines might fire aoqi@0: aoqi@0: // Check for env being the one value appropriate for this thread. aoqi@0: aoqi@0: #define JNI_ENTRY_CHECKED(result_type, header) \ aoqi@0: extern "C" { \ aoqi@0: result_type JNICALL header { \ aoqi@0: JavaThread* thr = (JavaThread*)ThreadLocalStorage::get_thread_slow();\ aoqi@0: if (thr == NULL || !thr->is_Java_thread()) { \ aoqi@0: tty->print_cr("%s", fatal_using_jnienv_in_nonjava); \ aoqi@0: os::abort(true); \ aoqi@0: } \ aoqi@0: JNIEnv* xenv = thr->jni_environment(); \ aoqi@0: if (env != xenv) { \ aoqi@0: NativeReportJNIFatalError(thr, warn_wrong_jnienv); \ aoqi@0: } \ aoqi@0: VM_ENTRY_BASE(result_type, header, thr) aoqi@0: aoqi@0: aoqi@0: #define UNCHECKED() (unchecked_jni_NativeInterface) aoqi@0: aoqi@0: static const char * warn_wrong_jnienv = "Using JNIEnv in the wrong thread"; aoqi@0: static const char * warn_bad_class_descriptor = "JNI FindClass received a bad class descriptor \"%s\". A correct class descriptor " \ aoqi@0: "has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases."; aoqi@0: static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread"; aoqi@0: static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \ aoqi@0: "Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical"; aoqi@0: static const char * fatal_bad_ref_to_jni = "Bad global or local ref passed to JNI"; aoqi@0: static const char * fatal_received_null_class = "JNI received a null class"; aoqi@0: static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class"; aoqi@0: static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass"; aoqi@0: static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call"; aoqi@0: static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call"; aoqi@0: static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations"; aoqi@0: static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation"; aoqi@0: static const char * fatal_prim_type_array_expected = "Primitive type array expected but not received for JNI array operation"; aoqi@0: static const char * fatal_non_array = "Non-array passed to JNI array operations"; aoqi@0: static const char * fatal_element_type_mismatch = "Array element type mismatch in JNI"; aoqi@0: static const char * fatal_should_be_static = "Non-static field ID passed to JNI"; aoqi@0: static const char * fatal_wrong_static_field = "Wrong static field ID passed to JNI"; aoqi@0: static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations"; aoqi@0: static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations"; aoqi@0: static const char * fatal_should_be_nonstatic = "Static field ID passed to JNI"; aoqi@0: static const char * fatal_null_object = "Null object passed to JNI"; aoqi@0: static const char * fatal_wrong_field = "Wrong field ID passed to JNI"; aoqi@0: static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations"; aoqi@0: static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations"; aoqi@0: static const char * fatal_non_string = "JNI string operation received a non-string"; aoqi@0: aoqi@0: aoqi@0: // When in VM state: aoqi@0: static void ReportJNIWarning(JavaThread* thr, const char *msg) { aoqi@0: tty->print_cr("WARNING in native method: %s", msg); aoqi@0: thr->print_stack(); aoqi@0: } aoqi@0: aoqi@0: // When in NATIVE state: aoqi@0: static void NativeReportJNIFatalError(JavaThread* thr, const char *msg) { aoqi@0: IN_VM( aoqi@0: ReportJNIFatalError(thr, msg); aoqi@0: ) aoqi@0: } aoqi@0: aoqi@0: static void NativeReportJNIWarning(JavaThread* thr, const char *msg) { aoqi@0: IN_VM( aoqi@0: ReportJNIWarning(thr, msg); aoqi@0: ) aoqi@0: } aoqi@0: aoqi@0: aoqi@0: aoqi@0: aoqi@0: /* aoqi@0: * SUPPORT FUNCTIONS aoqi@0: */ aoqi@0: aoqi@0: static inline void aoqi@0: functionEnterCritical(JavaThread* thr) aoqi@0: { aoqi@0: if (thr->has_pending_exception()) { aoqi@0: NativeReportJNIWarning(thr, "JNI call made with exception pending"); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: functionEnterCriticalExceptionAllowed(JavaThread* thr) aoqi@0: { aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: functionEnter(JavaThread* thr) aoqi@0: { aoqi@0: if (thr->in_critical()) { aoqi@0: tty->print_cr("%s", warn_other_function_in_critical); aoqi@0: } aoqi@0: if (thr->has_pending_exception()) { aoqi@0: NativeReportJNIWarning(thr, "JNI call made with exception pending"); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: functionEnterExceptionAllowed(JavaThread* thr) aoqi@0: { aoqi@0: if (thr->in_critical()) { aoqi@0: tty->print_cr("%s", warn_other_function_in_critical); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: functionExit(JNIEnv *env) aoqi@0: { aoqi@0: /* nothing to do at this time */ aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype) aoqi@0: { aoqi@0: fieldDescriptor fd; aoqi@0: aoqi@0: /* make sure it is a static field */ aoqi@0: if (!jfieldIDWorkaround::is_static_jfieldID(fid)) aoqi@0: ReportJNIFatalError(thr, fatal_should_be_static); aoqi@0: aoqi@0: /* validate the class being passed */ aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: Klass* k_oop = jniCheck::validate_class(thr, cls, false); aoqi@0: aoqi@0: /* check for proper subclass hierarchy */ aoqi@0: JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid); aoqi@0: Klass* f_oop = id->holder(); aoqi@0: if (!InstanceKlass::cast(k_oop)->is_subtype_of(f_oop)) aoqi@0: ReportJNIFatalError(thr, fatal_wrong_static_field); aoqi@0: aoqi@0: /* check for proper field type */ aoqi@0: if (!id->find_local_field(&fd)) aoqi@0: ReportJNIFatalError(thr, fatal_static_field_not_found); aoqi@0: if ((fd.field_type() != ftype) && aoqi@0: !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) { aoqi@0: ReportJNIFatalError(thr, fatal_static_field_mismatch); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype) aoqi@0: { aoqi@0: fieldDescriptor fd; aoqi@0: aoqi@0: /* make sure it is an instance field */ aoqi@0: if (jfieldIDWorkaround::is_static_jfieldID(fid)) aoqi@0: ReportJNIFatalError(thr, fatal_should_be_nonstatic); aoqi@0: aoqi@0: /* validate the object being passed and then get its class */ aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: oop oopObj = jniCheck::validate_object(thr, obj); aoqi@0: if (!oopObj) { aoqi@0: ReportJNIFatalError(thr, fatal_null_object); aoqi@0: } aoqi@0: Klass* k_oop = oopObj->klass(); aoqi@0: aoqi@0: if (!jfieldIDWorkaround::is_valid_jfieldID(k_oop, fid)) { aoqi@0: ReportJNIFatalError(thr, fatal_wrong_field); aoqi@0: } aoqi@0: aoqi@0: /* make sure the field exists */ aoqi@0: int offset = jfieldIDWorkaround::from_instance_jfieldID(k_oop, fid); aoqi@0: if (!InstanceKlass::cast(k_oop)->contains_field_offset(offset)) aoqi@0: ReportJNIFatalError(thr, fatal_wrong_field); aoqi@0: aoqi@0: /* check for proper field type */ aoqi@0: if (!InstanceKlass::cast(k_oop)->find_field_from_offset(offset, aoqi@0: false, &fd)) aoqi@0: ReportJNIFatalError(thr, fatal_instance_field_not_found); aoqi@0: aoqi@0: if ((fd.field_type() != ftype) && aoqi@0: !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) { aoqi@0: ReportJNIFatalError(thr, fatal_instance_field_mismatch); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: checkString(JavaThread* thr, jstring js) aoqi@0: { aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: oop s = jniCheck::validate_object(thr, js); aoqi@0: if (!s || !java_lang_String::is_instance(s)) aoqi@0: ReportJNIFatalError(thr, fatal_non_string); aoqi@0: } aoqi@0: aoqi@0: static inline arrayOop aoqi@0: check_is_array(JavaThread* thr, jarray jArray) aoqi@0: { aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: arrayOop aOop; aoqi@0: aoqi@0: aOop = (arrayOop)jniCheck::validate_object(thr, jArray); aoqi@0: if (aOop == NULL || !aOop->is_array()) { aoqi@0: ReportJNIFatalError(thr, fatal_non_array); aoqi@0: } aoqi@0: return aOop; aoqi@0: } aoqi@0: aoqi@0: static inline arrayOop aoqi@0: check_is_primitive_array(JavaThread* thr, jarray jArray) { aoqi@0: arrayOop aOop = check_is_array(thr, jArray); aoqi@0: aoqi@0: if (!aOop->is_typeArray()) { aoqi@0: ReportJNIFatalError(thr, fatal_prim_type_array_expected); aoqi@0: } aoqi@0: return aOop; aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType) aoqi@0: { aoqi@0: BasicType array_type; aoqi@0: arrayOop aOop; aoqi@0: aoqi@0: aOop = check_is_primitive_array(thr, jArray); aoqi@0: array_type = TypeArrayKlass::cast(aOop->klass())->element_type(); aoqi@0: if (array_type != elementType) { aoqi@0: ReportJNIFatalError(thr, fatal_element_type_mismatch); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: static inline void aoqi@0: check_is_obj_array(JavaThread* thr, jarray jArray) { aoqi@0: arrayOop aOop = check_is_array(thr, jArray); aoqi@0: if (!aOop->is_objArray()) { aoqi@0: ReportJNIFatalError(thr, fatal_object_array_expected); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: oop jniCheck::validate_handle(JavaThread* thr, jobject obj) { aoqi@0: if (JNIHandles::is_frame_handle(thr, obj) || aoqi@0: JNIHandles::is_local_handle(thr, obj) || aoqi@0: JNIHandles::is_global_handle(obj) || aoqi@0: JNIHandles::is_weak_global_handle(obj)) { aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: return JNIHandles::resolve_external_guard(obj); aoqi@0: } aoqi@0: ReportJNIFatalError(thr, fatal_bad_ref_to_jni); aoqi@0: return NULL; aoqi@0: } aoqi@0: aoqi@0: aoqi@0: Method* jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) { aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: // do the fast jmethodID check first aoqi@0: Method* moop = Method::checked_resolve_jmethod_id(method_id); aoqi@0: if (moop == NULL) { aoqi@0: ReportJNIFatalError(thr, fatal_wrong_class_or_method); aoqi@0: } aoqi@0: // jmethodIDs are supposed to be weak handles in the class loader data, aoqi@0: // but that can be expensive so check it last aoqi@0: else if (!Method::is_method_id(method_id)) { aoqi@0: ReportJNIFatalError(thr, fatal_non_weak_method); aoqi@0: } aoqi@0: return moop; aoqi@0: } aoqi@0: aoqi@0: aoqi@0: oop jniCheck::validate_object(JavaThread* thr, jobject obj) { aoqi@0: if (!obj) aoqi@0: return NULL; aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: oop oopObj = jniCheck::validate_handle(thr, obj); aoqi@0: if (!oopObj) { aoqi@0: ReportJNIFatalError(thr, fatal_bad_ref_to_jni); aoqi@0: } aoqi@0: return oopObj; aoqi@0: } aoqi@0: aoqi@0: // Warn if a class descriptor is in decorated form; class descriptors aoqi@0: // passed to JNI findClass should not be decorated unless they are aoqi@0: // array descriptors. aoqi@0: void jniCheck::validate_class_descriptor(JavaThread* thr, const char* name) { aoqi@0: if (name == NULL) return; // implementation accepts NULL so just return aoqi@0: aoqi@0: size_t len = strlen(name); aoqi@0: aoqi@0: if (len >= 2 && aoqi@0: name[0] == JVM_SIGNATURE_CLASS && // 'L' aoqi@0: name[len-1] == JVM_SIGNATURE_ENDCLASS ) { // ';' aoqi@0: char msg[JVM_MAXPATHLEN]; aoqi@0: jio_snprintf(msg, JVM_MAXPATHLEN, warn_bad_class_descriptor, name); aoqi@0: ReportJNIWarning(thr, msg); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: Klass* jniCheck::validate_class(JavaThread* thr, jclass clazz, bool allow_primitive) { aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: oop mirror = jniCheck::validate_handle(thr, clazz); aoqi@0: if (!mirror) { aoqi@0: ReportJNIFatalError(thr, fatal_received_null_class); aoqi@0: } aoqi@0: aoqi@0: if (mirror->klass() != SystemDictionary::Class_klass()) { aoqi@0: ReportJNIFatalError(thr, fatal_class_not_a_class); aoqi@0: } aoqi@0: aoqi@0: Klass* k = java_lang_Class::as_Klass(mirror); aoqi@0: // Make allowances for primitive classes ... aoqi@0: if (!(k != NULL || allow_primitive && java_lang_Class::is_primitive(mirror))) { aoqi@0: ReportJNIFatalError(thr, fatal_class_not_a_class); aoqi@0: } aoqi@0: return k; aoqi@0: } aoqi@0: aoqi@0: void jniCheck::validate_throwable_klass(JavaThread* thr, Klass* klass) { aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: assert(klass != NULL, "klass argument must have a value"); aoqi@0: aoqi@0: if (!klass->oop_is_instance() || aoqi@0: !InstanceKlass::cast(klass)->is_subclass_of(SystemDictionary::Throwable_klass())) { aoqi@0: ReportJNIFatalError(thr, fatal_class_not_a_throwable_class); aoqi@0: } aoqi@0: } aoqi@0: aoqi@0: void jniCheck::validate_call_object(JavaThread* thr, jobject obj, jmethodID method_id) { aoqi@0: /* validate the object being passed */ aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: jniCheck::validate_jmethod_id(thr, method_id); aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: } aoqi@0: aoqi@0: void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id) { aoqi@0: /* validate the class being passed */ aoqi@0: ASSERT_OOPS_ALLOWED; aoqi@0: jniCheck::validate_jmethod_id(thr, method_id); aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: } aoqi@0: aoqi@0: aoqi@0: /* aoqi@0: * IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE aoqi@0: */ aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jclass, aoqi@0: checked_jni_DefineClass(JNIEnv *env, aoqi@0: const char *name, aoqi@0: jobject loader, aoqi@0: const jbyte *buf, aoqi@0: jsize len)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, loader); aoqi@0: ) aoqi@0: jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jclass, aoqi@0: checked_jni_FindClass(JNIEnv *env, aoqi@0: const char *name)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class_descriptor(thr, name); aoqi@0: ) aoqi@0: jclass result = UNCHECKED()->FindClass(env, name); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jmethodID, aoqi@0: checked_jni_FromReflectedMethod(JNIEnv *env, aoqi@0: jobject method)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, method); aoqi@0: ) aoqi@0: jmethodID result = UNCHECKED()->FromReflectedMethod(env, method); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jfieldID, aoqi@0: checked_jni_FromReflectedField(JNIEnv *env, aoqi@0: jobject field)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, field); aoqi@0: ) aoqi@0: jfieldID result = UNCHECKED()->FromReflectedField(env, field); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_ToReflectedMethod(JNIEnv *env, aoqi@0: jclass cls, aoqi@0: jmethodID methodID, aoqi@0: jboolean isStatic)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, cls, false); aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID, aoqi@0: isStatic); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jclass, aoqi@0: checked_jni_GetSuperclass(JNIEnv *env, aoqi@0: jclass sub)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, sub, true); aoqi@0: ) aoqi@0: jclass result = UNCHECKED()->GetSuperclass(env, sub); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jboolean, aoqi@0: checked_jni_IsAssignableFrom(JNIEnv *env, aoqi@0: jclass sub, aoqi@0: jclass sup)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, sub, true); aoqi@0: jniCheck::validate_class(thr, sup, true); aoqi@0: ) aoqi@0: jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_ToReflectedField(JNIEnv *env, aoqi@0: jclass cls, aoqi@0: jfieldID fieldID, aoqi@0: jboolean isStatic)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, cls, false); aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID, aoqi@0: isStatic); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_Throw(JNIEnv *env, aoqi@0: jthrowable obj)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: oop oopObj = jniCheck::validate_object(thr, obj); aoqi@0: if (oopObj == NULL) { aoqi@0: // Unchecked Throw tolerates a NULL obj, so just warn aoqi@0: ReportJNIWarning(thr, "JNI Throw called with NULL throwable"); aoqi@0: } else { aoqi@0: jniCheck::validate_throwable_klass(thr, oopObj->klass()); aoqi@0: } aoqi@0: ) aoqi@0: jint result = UNCHECKED()->Throw(env, obj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_ThrowNew(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: const char *msg)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: Klass* k = jniCheck::validate_class(thr, clazz, false); aoqi@0: assert(k != NULL, "validate_class shouldn't return NULL Klass*"); aoqi@0: jniCheck::validate_throwable_klass(thr, k); aoqi@0: ) aoqi@0: jint result = UNCHECKED()->ThrowNew(env, clazz, msg); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jthrowable, aoqi@0: checked_jni_ExceptionOccurred(JNIEnv *env)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: jthrowable result = UNCHECKED()->ExceptionOccurred(env); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_ExceptionDescribe(JNIEnv *env)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: UNCHECKED()->ExceptionDescribe(env); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_ExceptionClear(JNIEnv *env)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: UNCHECKED()->ExceptionClear(env); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_FatalError(JNIEnv *env, aoqi@0: const char *msg)) aoqi@0: functionEnter(thr); aoqi@0: UNCHECKED()->FatalError(env, msg); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_PushLocalFrame(JNIEnv *env, aoqi@0: jint capacity)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: if (capacity < 0) aoqi@0: NativeReportJNIFatalError(thr, "negative capacity"); aoqi@0: jint result = UNCHECKED()->PushLocalFrame(env, capacity); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_PopLocalFrame(JNIEnv *env, aoqi@0: jobject result)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: jobject res = UNCHECKED()->PopLocalFrame(env, result); aoqi@0: functionExit(env); aoqi@0: return res; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_NewGlobalRef(JNIEnv *env, aoqi@0: jobject lobj)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: if (lobj != NULL) { aoqi@0: jniCheck::validate_handle(thr, lobj); aoqi@0: } aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->NewGlobalRef(env,lobj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_DeleteGlobalRef(JNIEnv *env, aoqi@0: jobject gref)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, gref); aoqi@0: if (gref && !JNIHandles::is_global_handle(gref)) { aoqi@0: ReportJNIFatalError(thr, aoqi@0: "Invalid global JNI handle passed to DeleteGlobalRef"); aoqi@0: } aoqi@0: ) aoqi@0: UNCHECKED()->DeleteGlobalRef(env,gref); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_DeleteLocalRef(JNIEnv *env, aoqi@0: jobject obj)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: if (obj && !(JNIHandles::is_local_handle(thr, obj) || aoqi@0: JNIHandles::is_frame_handle(thr, obj))) aoqi@0: ReportJNIFatalError(thr, aoqi@0: "Invalid local JNI handle passed to DeleteLocalRef"); aoqi@0: ) aoqi@0: UNCHECKED()->DeleteLocalRef(env, obj); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jboolean, aoqi@0: checked_jni_IsSameObject(JNIEnv *env, aoqi@0: jobject obj1, aoqi@0: jobject obj2)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: /* This JNI function can be used to compare weak global references aoqi@0: * to NULL objects. If the handles are valid, but contain NULL, aoqi@0: * then don't attempt to validate the object. aoqi@0: */ aoqi@0: if (obj1 != NULL && jniCheck::validate_handle(thr, obj1) != NULL) { aoqi@0: jniCheck::validate_object(thr, obj1); aoqi@0: } aoqi@0: if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) { aoqi@0: jniCheck::validate_object(thr, obj2); aoqi@0: } aoqi@0: ) aoqi@0: jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_NewLocalRef(JNIEnv *env, aoqi@0: jobject ref)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: if (ref != NULL) { aoqi@0: jniCheck::validate_handle(thr, ref); aoqi@0: } aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->NewLocalRef(env, ref); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_EnsureLocalCapacity(JNIEnv *env, aoqi@0: jint capacity)) aoqi@0: functionEnter(thr); aoqi@0: if (capacity < 0) { aoqi@0: NativeReportJNIFatalError(thr, "negative capacity"); aoqi@0: } aoqi@0: jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_AllocObject(JNIEnv *env, aoqi@0: jclass clazz)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->AllocObject(env,clazz); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_NewObject(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: jmethodID methodID, aoqi@0: ...)) aoqi@0: functionEnter(thr); aoqi@0: va_list args; aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: ) aoqi@0: va_start(args, methodID); aoqi@0: jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args); aoqi@0: va_end(args); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_NewObjectV(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: jmethodID methodID, aoqi@0: va_list args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_NewObjectA(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: jmethodID methodID, aoqi@0: const jvalue *args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jclass, aoqi@0: checked_jni_GetObjectClass(JNIEnv *env, aoqi@0: jobject obj)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: ) aoqi@0: jclass result = UNCHECKED()->GetObjectClass(env,obj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jboolean, aoqi@0: checked_jni_IsInstanceOf(JNIEnv *env, aoqi@0: jobject obj, aoqi@0: jclass clazz)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: jniCheck::validate_class(thr, clazz, true); aoqi@0: ) aoqi@0: jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jmethodID, aoqi@0: checked_jni_GetMethodID(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: const char *name, aoqi@0: const char *sig)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: ) aoqi@0: jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: #define WRAPPER_CallMethod(ResultType, Result) \ aoqi@0: JNI_ENTRY_CHECKED(ResultType, \ aoqi@0: checked_jni_Call##Result##Method(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jmethodID methodID, \ aoqi@0: ...)) \ aoqi@0: functionEnter(thr); \ aoqi@0: va_list args; \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); \ aoqi@0: ) \ aoqi@0: va_start(args,methodID); \ aoqi@0: ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \ aoqi@0: args); \ aoqi@0: va_end(args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END \ aoqi@0: \ aoqi@0: JNI_ENTRY_CHECKED(ResultType, \ aoqi@0: checked_jni_Call##Result##MethodV(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jmethodID methodID, \ aoqi@0: va_list args)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM(\ aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); \ aoqi@0: ) \ aoqi@0: ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\ aoqi@0: args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END \ aoqi@0: \ aoqi@0: JNI_ENTRY_CHECKED(ResultType, \ aoqi@0: checked_jni_Call##Result##MethodA(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jmethodID methodID, \ aoqi@0: const jvalue * args)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); \ aoqi@0: ) \ aoqi@0: ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\ aoqi@0: args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_CallMethod(jobject,Object) aoqi@0: WRAPPER_CallMethod(jboolean,Boolean) aoqi@0: WRAPPER_CallMethod(jbyte,Byte) aoqi@0: WRAPPER_CallMethod(jshort,Short) aoqi@0: WRAPPER_CallMethod(jchar,Char) aoqi@0: WRAPPER_CallMethod(jint,Int) aoqi@0: WRAPPER_CallMethod(jlong,Long) aoqi@0: WRAPPER_CallMethod(jfloat,Float) aoqi@0: WRAPPER_CallMethod(jdouble,Double) aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallVoidMethod(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jmethodID methodID, \ aoqi@0: ...)) aoqi@0: functionEnter(thr); aoqi@0: va_list args; aoqi@0: IN_VM( aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); aoqi@0: ) aoqi@0: va_start(args,methodID); aoqi@0: UNCHECKED()->CallVoidMethodV(env,obj,methodID,args); aoqi@0: va_end(args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallVoidMethodV(JNIEnv *env, aoqi@0: jobject obj, aoqi@0: jmethodID methodID, aoqi@0: va_list args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); aoqi@0: ) aoqi@0: UNCHECKED()->CallVoidMethodV(env,obj,methodID,args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallVoidMethodA(JNIEnv *env, aoqi@0: jobject obj, aoqi@0: jmethodID methodID, aoqi@0: const jvalue * args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); aoqi@0: ) aoqi@0: UNCHECKED()->CallVoidMethodA(env,obj,methodID,args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: #define WRAPPER_CallNonvirtualMethod(ResultType, Result) \ aoqi@0: JNI_ENTRY_CHECKED(ResultType, \ aoqi@0: checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jclass clazz, \ aoqi@0: jmethodID methodID, \ aoqi@0: ...)) \ aoqi@0: functionEnter(thr); \ aoqi@0: va_list args; \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); \ aoqi@0: jniCheck::validate_call_class(thr, clazz, methodID); \ aoqi@0: ) \ aoqi@0: va_start(args,methodID); \ aoqi@0: ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \ aoqi@0: obj, \ aoqi@0: clazz, \ aoqi@0: methodID,\ aoqi@0: args); \ aoqi@0: va_end(args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END \ aoqi@0: \ aoqi@0: JNI_ENTRY_CHECKED(ResultType, \ aoqi@0: checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jclass clazz, \ aoqi@0: jmethodID methodID, \ aoqi@0: va_list args)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); \ aoqi@0: jniCheck::validate_call_class(thr, clazz, methodID); \ aoqi@0: ) \ aoqi@0: ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \ aoqi@0: obj, \ aoqi@0: clazz, \ aoqi@0: methodID,\ aoqi@0: args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END \ aoqi@0: \ aoqi@0: JNI_ENTRY_CHECKED(ResultType, \ aoqi@0: checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jclass clazz, \ aoqi@0: jmethodID methodID, \ aoqi@0: const jvalue * args)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); \ aoqi@0: jniCheck::validate_call_class(thr, clazz, methodID); \ aoqi@0: ) \ aoqi@0: ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \ aoqi@0: obj, \ aoqi@0: clazz, \ aoqi@0: methodID,\ aoqi@0: args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_CallNonvirtualMethod(jobject,Object) aoqi@0: WRAPPER_CallNonvirtualMethod(jboolean,Boolean) aoqi@0: WRAPPER_CallNonvirtualMethod(jbyte,Byte) aoqi@0: WRAPPER_CallNonvirtualMethod(jshort,Short) aoqi@0: WRAPPER_CallNonvirtualMethod(jchar,Char) aoqi@0: WRAPPER_CallNonvirtualMethod(jint,Int) aoqi@0: WRAPPER_CallNonvirtualMethod(jlong,Long) aoqi@0: WRAPPER_CallNonvirtualMethod(jfloat,Float) aoqi@0: WRAPPER_CallNonvirtualMethod(jdouble,Double) aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallNonvirtualVoidMethod(JNIEnv *env, aoqi@0: jobject obj, aoqi@0: jclass clazz, aoqi@0: jmethodID methodID, aoqi@0: ...)) aoqi@0: functionEnter(thr); aoqi@0: va_list args; aoqi@0: IN_VM( aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); aoqi@0: jniCheck::validate_call_class(thr, clazz, methodID); aoqi@0: ) aoqi@0: va_start(args,methodID); aoqi@0: UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args); aoqi@0: va_end(args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env, aoqi@0: jobject obj, aoqi@0: jclass clazz, aoqi@0: jmethodID methodID, aoqi@0: va_list args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); aoqi@0: jniCheck::validate_call_class(thr, clazz, methodID); aoqi@0: ) aoqi@0: UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env, aoqi@0: jobject obj, aoqi@0: jclass clazz, aoqi@0: jmethodID methodID, aoqi@0: const jvalue * args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_call_object(thr, obj, methodID); aoqi@0: jniCheck::validate_call_class(thr, clazz, methodID); aoqi@0: ) aoqi@0: UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jfieldID, aoqi@0: checked_jni_GetFieldID(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: const char *name, aoqi@0: const char *sig)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: ) aoqi@0: jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: #define WRAPPER_GetField(ReturnType,Result,FieldType) \ aoqi@0: JNI_ENTRY_CHECKED(ReturnType, \ aoqi@0: checked_jni_Get##Result##Field(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jfieldID fieldID)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: checkInstanceFieldID(thr, fieldID, obj, FieldType); \ aoqi@0: ) \ aoqi@0: ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_GetField(jobject, Object, T_OBJECT) aoqi@0: WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN) aoqi@0: WRAPPER_GetField(jbyte, Byte, T_BYTE) aoqi@0: WRAPPER_GetField(jshort, Short, T_SHORT) aoqi@0: WRAPPER_GetField(jchar, Char, T_CHAR) aoqi@0: WRAPPER_GetField(jint, Int, T_INT) aoqi@0: WRAPPER_GetField(jlong, Long, T_LONG) aoqi@0: WRAPPER_GetField(jfloat, Float, T_FLOAT) aoqi@0: WRAPPER_GetField(jdouble, Double, T_DOUBLE) aoqi@0: aoqi@0: #define WRAPPER_SetField(ValueType,Result,FieldType) \ aoqi@0: JNI_ENTRY_CHECKED(void, \ aoqi@0: checked_jni_Set##Result##Field(JNIEnv *env, \ aoqi@0: jobject obj, \ aoqi@0: jfieldID fieldID, \ aoqi@0: ValueType val)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: checkInstanceFieldID(thr, fieldID, obj, FieldType); \ aoqi@0: ) \ aoqi@0: UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \ aoqi@0: functionExit(env); \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_SetField(jobject, Object, T_OBJECT) aoqi@0: WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN) aoqi@0: WRAPPER_SetField(jbyte, Byte, T_BYTE) aoqi@0: WRAPPER_SetField(jshort, Short, T_SHORT) aoqi@0: WRAPPER_SetField(jchar, Char, T_CHAR) aoqi@0: WRAPPER_SetField(jint, Int, T_INT) aoqi@0: WRAPPER_SetField(jlong, Long, T_LONG) aoqi@0: WRAPPER_SetField(jfloat, Float, T_FLOAT) aoqi@0: WRAPPER_SetField(jdouble, Double, T_DOUBLE) aoqi@0: aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jmethodID, aoqi@0: checked_jni_GetStaticMethodID(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: const char *name, aoqi@0: const char *sig)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: ) aoqi@0: jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: #define WRAPPER_CallStaticMethod(ReturnType,Result) \ aoqi@0: JNI_ENTRY_CHECKED(ReturnType, \ aoqi@0: checked_jni_CallStatic##Result##Method(JNIEnv *env, \ aoqi@0: jclass clazz, \ aoqi@0: jmethodID methodID, \ aoqi@0: ...)) \ aoqi@0: functionEnter(thr); \ aoqi@0: va_list args; \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); \ aoqi@0: jniCheck::validate_class(thr, clazz, false); \ aoqi@0: ) \ aoqi@0: va_start(args,methodID); \ aoqi@0: ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \ aoqi@0: clazz, \ aoqi@0: methodID, \ aoqi@0: args); \ aoqi@0: va_end(args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END \ aoqi@0: \ aoqi@0: JNI_ENTRY_CHECKED(ReturnType, \ aoqi@0: checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \ aoqi@0: jclass clazz, \ aoqi@0: jmethodID methodID,\ aoqi@0: va_list args)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); \ aoqi@0: jniCheck::validate_class(thr, clazz, false); \ aoqi@0: ) \ aoqi@0: ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \ aoqi@0: clazz, \ aoqi@0: methodID, \ aoqi@0: args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END \ aoqi@0: \ aoqi@0: JNI_ENTRY_CHECKED(ReturnType, \ aoqi@0: checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \ aoqi@0: jclass clazz, \ aoqi@0: jmethodID methodID, \ aoqi@0: const jvalue *args)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); \ aoqi@0: jniCheck::validate_class(thr, clazz, false); \ aoqi@0: ) \ aoqi@0: ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \ aoqi@0: clazz, \ aoqi@0: methodID, \ aoqi@0: args); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_CallStaticMethod(jobject,Object) aoqi@0: WRAPPER_CallStaticMethod(jboolean,Boolean) aoqi@0: WRAPPER_CallStaticMethod(jbyte,Byte) aoqi@0: WRAPPER_CallStaticMethod(jshort,Short) aoqi@0: WRAPPER_CallStaticMethod(jchar,Char) aoqi@0: WRAPPER_CallStaticMethod(jint,Int) aoqi@0: WRAPPER_CallStaticMethod(jlong,Long) aoqi@0: WRAPPER_CallStaticMethod(jfloat,Float) aoqi@0: WRAPPER_CallStaticMethod(jdouble,Double) aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallStaticVoidMethod(JNIEnv *env, aoqi@0: jclass cls, aoqi@0: jmethodID methodID, aoqi@0: ...)) aoqi@0: functionEnter(thr); aoqi@0: va_list args; aoqi@0: IN_VM( aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: jniCheck::validate_class(thr, cls, false); aoqi@0: ) aoqi@0: va_start(args,methodID); aoqi@0: UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args); aoqi@0: va_end(args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallStaticVoidMethodV(JNIEnv *env, aoqi@0: jclass cls, aoqi@0: jmethodID methodID, aoqi@0: va_list args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: jniCheck::validate_class(thr, cls, false); aoqi@0: ) aoqi@0: UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_CallStaticVoidMethodA(JNIEnv *env, aoqi@0: jclass cls, aoqi@0: jmethodID methodID, aoqi@0: const jvalue * args)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_jmethod_id(thr, methodID); aoqi@0: jniCheck::validate_class(thr, cls, false); aoqi@0: ) aoqi@0: UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jfieldID, aoqi@0: checked_jni_GetStaticFieldID(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: const char *name, aoqi@0: const char *sig)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_class(thr, clazz, false); aoqi@0: ) aoqi@0: jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: #define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \ aoqi@0: JNI_ENTRY_CHECKED(ReturnType, \ aoqi@0: checked_jni_GetStatic##Result##Field(JNIEnv *env, \ aoqi@0: jclass clazz, \ aoqi@0: jfieldID fieldID)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_class(thr, clazz, false); \ aoqi@0: checkStaticFieldID(thr, fieldID, clazz, FieldType); \ aoqi@0: ) \ aoqi@0: ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \ aoqi@0: clazz, \ aoqi@0: fieldID); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_GetStaticField(jobject, Object, T_OBJECT) aoqi@0: WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN) aoqi@0: WRAPPER_GetStaticField(jbyte, Byte, T_BYTE) aoqi@0: WRAPPER_GetStaticField(jshort, Short, T_SHORT) aoqi@0: WRAPPER_GetStaticField(jchar, Char, T_CHAR) aoqi@0: WRAPPER_GetStaticField(jint, Int, T_INT) aoqi@0: WRAPPER_GetStaticField(jlong, Long, T_LONG) aoqi@0: WRAPPER_GetStaticField(jfloat, Float, T_FLOAT) aoqi@0: WRAPPER_GetStaticField(jdouble, Double, T_DOUBLE) aoqi@0: aoqi@0: #define WRAPPER_SetStaticField(ValueType,Result,FieldType) \ aoqi@0: JNI_ENTRY_CHECKED(void, \ aoqi@0: checked_jni_SetStatic##Result##Field(JNIEnv *env, \ aoqi@0: jclass clazz, \ aoqi@0: jfieldID fieldID, \ aoqi@0: ValueType value)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: jniCheck::validate_class(thr, clazz, false); \ aoqi@0: checkStaticFieldID(thr, fieldID, clazz, FieldType); \ aoqi@0: ) \ aoqi@0: UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \ aoqi@0: functionExit(env); \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_SetStaticField(jobject, Object, T_OBJECT) aoqi@0: WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN) aoqi@0: WRAPPER_SetStaticField(jbyte, Byte, T_BYTE) aoqi@0: WRAPPER_SetStaticField(jshort, Short, T_SHORT) aoqi@0: WRAPPER_SetStaticField(jchar, Char, T_CHAR) aoqi@0: WRAPPER_SetStaticField(jint, Int, T_INT) aoqi@0: WRAPPER_SetStaticField(jlong, Long, T_LONG) aoqi@0: WRAPPER_SetStaticField(jfloat, Float, T_FLOAT) aoqi@0: WRAPPER_SetStaticField(jdouble, Double, T_DOUBLE) aoqi@0: aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jstring, aoqi@0: checked_jni_NewString(JNIEnv *env, aoqi@0: const jchar *unicode, aoqi@0: jsize len)) aoqi@0: functionEnter(thr); aoqi@0: jstring result = UNCHECKED()->NewString(env,unicode,len); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jsize, aoqi@0: checked_jni_GetStringLength(JNIEnv *env, aoqi@0: jstring str)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: jsize result = UNCHECKED()->GetStringLength(env,str); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: // Arbitrary (but well-known) tag aoqi@0: const jint STRING_TAG = 0x47114711; aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(const jchar *, aoqi@0: checked_jni_GetStringChars(JNIEnv *env, aoqi@0: jstring str, aoqi@0: jboolean *isCopy)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: jchar* newResult = NULL; aoqi@0: const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy); aoqi@0: assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected"); aoqi@0: if (result != NULL) { aoqi@0: size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination aoqi@0: jint* tagLocation = (jint*) AllocateHeap(len * sizeof(jchar) + sizeof(jint), mtInternal); aoqi@0: *tagLocation = STRING_TAG; aoqi@0: newResult = (jchar*) (tagLocation + 1); aoqi@0: memcpy(newResult, result, len * sizeof(jchar)); aoqi@0: // Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes aoqi@0: // Note that the dtrace arguments for the allocated memory will not match up with this solution. aoqi@0: FreeHeap((char*)result); aoqi@0: } aoqi@0: functionExit(env); aoqi@0: return newResult; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_ReleaseStringChars(JNIEnv *env, aoqi@0: jstring str, aoqi@0: const jchar *chars)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: if (chars == NULL) { aoqi@0: // still do the unchecked call to allow dtrace probes aoqi@0: UNCHECKED()->ReleaseStringChars(env,str,chars); aoqi@0: } aoqi@0: else { aoqi@0: jint* tagLocation = ((jint*) chars) - 1; aoqi@0: if (*tagLocation != STRING_TAG) { aoqi@0: NativeReportJNIFatalError(thr, "ReleaseStringChars called on something not allocated by GetStringChars"); aoqi@0: } aoqi@0: UNCHECKED()->ReleaseStringChars(env,str,(const jchar*)tagLocation); aoqi@0: } aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jstring, aoqi@0: checked_jni_NewStringUTF(JNIEnv *env, aoqi@0: const char *utf)) aoqi@0: functionEnter(thr); aoqi@0: jstring result = UNCHECKED()->NewStringUTF(env,utf); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jsize, aoqi@0: checked_jni_GetStringUTFLength(JNIEnv *env, aoqi@0: jstring str)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: jsize result = UNCHECKED()->GetStringUTFLength(env,str); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: // Arbitrary (but well-known) tag - different than GetStringChars aoqi@0: const jint STRING_UTF_TAG = 0x48124812; aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(const char *, aoqi@0: checked_jni_GetStringUTFChars(JNIEnv *env, aoqi@0: jstring str, aoqi@0: jboolean *isCopy)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: char* newResult = NULL; aoqi@0: const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy); aoqi@0: assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected"); aoqi@0: if (result != NULL) { aoqi@0: size_t len = strlen(result) + 1; // + 1 for NULL termination aoqi@0: jint* tagLocation = (jint*) AllocateHeap(len + sizeof(jint), mtInternal); aoqi@0: *tagLocation = STRING_UTF_TAG; aoqi@0: newResult = (char*) (tagLocation + 1); aoqi@0: strcpy(newResult, result); aoqi@0: // Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes aoqi@0: // Note that the dtrace arguments for the allocated memory will not match up with this solution. aoqi@0: FreeHeap((char*)result, mtInternal); aoqi@0: } aoqi@0: functionExit(env); aoqi@0: return newResult; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_ReleaseStringUTFChars(JNIEnv *env, aoqi@0: jstring str, aoqi@0: const char* chars)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: if (chars == NULL) { aoqi@0: // still do the unchecked call to allow dtrace probes aoqi@0: UNCHECKED()->ReleaseStringUTFChars(env,str,chars); aoqi@0: } aoqi@0: else { aoqi@0: jint* tagLocation = ((jint*) chars) - 1; aoqi@0: if (*tagLocation != STRING_UTF_TAG) { aoqi@0: NativeReportJNIFatalError(thr, "ReleaseStringUTFChars called on something not allocated by GetStringUTFChars"); aoqi@0: } aoqi@0: UNCHECKED()->ReleaseStringUTFChars(env,str,(const char*)tagLocation); aoqi@0: } aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jsize, aoqi@0: checked_jni_GetArrayLength(JNIEnv *env, aoqi@0: jarray array)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: check_is_array(thr, array); aoqi@0: ) aoqi@0: jsize result = UNCHECKED()->GetArrayLength(env,array); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobjectArray, aoqi@0: checked_jni_NewObjectArray(JNIEnv *env, aoqi@0: jsize len, aoqi@0: jclass clazz, aoqi@0: jobject init)) aoqi@0: functionEnter(thr); aoqi@0: jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_GetObjectArrayElement(JNIEnv *env, aoqi@0: jobjectArray array, aoqi@0: jsize index)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: check_is_obj_array(thr, array); aoqi@0: ) aoqi@0: jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_SetObjectArrayElement(JNIEnv *env, aoqi@0: jobjectArray array, aoqi@0: jsize index, aoqi@0: jobject val)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: check_is_obj_array(thr, array); aoqi@0: ) aoqi@0: UNCHECKED()->SetObjectArrayElement(env,array,index,val); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: #define WRAPPER_NewScalarArray(Return, Result) \ aoqi@0: JNI_ENTRY_CHECKED(Return, \ aoqi@0: checked_jni_New##Result##Array(JNIEnv *env, \ aoqi@0: jsize len)) \ aoqi@0: functionEnter(thr); \ aoqi@0: Return result = UNCHECKED()->New##Result##Array(env,len); \ aoqi@0: functionExit(env); \ aoqi@0: return (Return) result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_NewScalarArray(jbooleanArray, Boolean) aoqi@0: WRAPPER_NewScalarArray(jbyteArray, Byte) aoqi@0: WRAPPER_NewScalarArray(jshortArray, Short) aoqi@0: WRAPPER_NewScalarArray(jcharArray, Char) aoqi@0: WRAPPER_NewScalarArray(jintArray, Int) aoqi@0: WRAPPER_NewScalarArray(jlongArray, Long) aoqi@0: WRAPPER_NewScalarArray(jfloatArray, Float) aoqi@0: WRAPPER_NewScalarArray(jdoubleArray, Double) aoqi@0: aoqi@0: #define WRAPPER_GetScalarArrayElements(ElementTag,ElementType,Result) \ aoqi@0: JNI_ENTRY_CHECKED(ElementType *, \ aoqi@0: checked_jni_Get##Result##ArrayElements(JNIEnv *env, \ aoqi@0: ElementType##Array array, \ aoqi@0: jboolean *isCopy)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: check_primitive_array_type(thr, array, ElementTag); \ aoqi@0: ) \ aoqi@0: ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \ aoqi@0: array, \ aoqi@0: isCopy); \ aoqi@0: functionExit(env); \ aoqi@0: return result; \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean) aoqi@0: WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte) aoqi@0: WRAPPER_GetScalarArrayElements(T_SHORT, jshort, Short) aoqi@0: WRAPPER_GetScalarArrayElements(T_CHAR, jchar, Char) aoqi@0: WRAPPER_GetScalarArrayElements(T_INT, jint, Int) aoqi@0: WRAPPER_GetScalarArrayElements(T_LONG, jlong, Long) aoqi@0: WRAPPER_GetScalarArrayElements(T_FLOAT, jfloat, Float) aoqi@0: WRAPPER_GetScalarArrayElements(T_DOUBLE, jdouble, Double) aoqi@0: aoqi@0: #define WRAPPER_ReleaseScalarArrayElements(ElementTag,ElementType,Result,Tag) \ aoqi@0: JNI_ENTRY_CHECKED(void, \ aoqi@0: checked_jni_Release##Result##ArrayElements(JNIEnv *env, \ aoqi@0: ElementType##Array array, \ aoqi@0: ElementType *elems, \ aoqi@0: jint mode)) \ aoqi@0: functionEnterExceptionAllowed(thr); \ aoqi@0: IN_VM( \ aoqi@0: check_primitive_array_type(thr, array, ElementTag); \ aoqi@0: ASSERT_OOPS_ALLOWED; \ aoqi@0: typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \ aoqi@0: /* cannot check validity of copy, unless every request is logged by aoqi@0: * checking code. Implementation of this check is deferred until a aoqi@0: * subsequent release. aoqi@0: */ \ aoqi@0: ) \ aoqi@0: UNCHECKED()->Release##Result##ArrayElements(env,array,elems,mode); \ aoqi@0: functionExit(env); \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_CHAR, jchar, Char, char) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_INT, jint, Int, int) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_LONG, jlong, Long, long) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_FLOAT, jfloat, Float, float) aoqi@0: WRAPPER_ReleaseScalarArrayElements(T_DOUBLE, jdouble, Double, double) aoqi@0: aoqi@0: #define WRAPPER_GetScalarArrayRegion(ElementTag,ElementType,Result) \ aoqi@0: JNI_ENTRY_CHECKED(void, \ aoqi@0: checked_jni_Get##Result##ArrayRegion(JNIEnv *env, \ aoqi@0: ElementType##Array array, \ aoqi@0: jsize start, \ aoqi@0: jsize len, \ aoqi@0: ElementType *buf)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: check_primitive_array_type(thr, array, ElementTag); \ aoqi@0: ) \ aoqi@0: UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \ aoqi@0: functionExit(env); \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean) aoqi@0: WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte) aoqi@0: WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short) aoqi@0: WRAPPER_GetScalarArrayRegion(T_CHAR, jchar, Char) aoqi@0: WRAPPER_GetScalarArrayRegion(T_INT, jint, Int) aoqi@0: WRAPPER_GetScalarArrayRegion(T_LONG, jlong, Long) aoqi@0: WRAPPER_GetScalarArrayRegion(T_FLOAT, jfloat, Float) aoqi@0: WRAPPER_GetScalarArrayRegion(T_DOUBLE, jdouble, Double) aoqi@0: aoqi@0: #define WRAPPER_SetScalarArrayRegion(ElementTag,ElementType,Result) \ aoqi@0: JNI_ENTRY_CHECKED(void, \ aoqi@0: checked_jni_Set##Result##ArrayRegion(JNIEnv *env, \ aoqi@0: ElementType##Array array, \ aoqi@0: jsize start, \ aoqi@0: jsize len, \ aoqi@0: const ElementType *buf)) \ aoqi@0: functionEnter(thr); \ aoqi@0: IN_VM( \ aoqi@0: check_primitive_array_type(thr, array, ElementTag); \ aoqi@0: ) \ aoqi@0: UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \ aoqi@0: functionExit(env); \ aoqi@0: JNI_END aoqi@0: aoqi@0: WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean) aoqi@0: WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte) aoqi@0: WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short) aoqi@0: WRAPPER_SetScalarArrayRegion(T_CHAR, jchar, Char) aoqi@0: WRAPPER_SetScalarArrayRegion(T_INT, jint, Int) aoqi@0: WRAPPER_SetScalarArrayRegion(T_LONG, jlong, Long) aoqi@0: WRAPPER_SetScalarArrayRegion(T_FLOAT, jfloat, Float) aoqi@0: WRAPPER_SetScalarArrayRegion(T_DOUBLE, jdouble, Double) aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_RegisterNatives(JNIEnv *env, aoqi@0: jclass clazz, aoqi@0: const JNINativeMethod *methods, aoqi@0: jint nMethods)) aoqi@0: functionEnter(thr); aoqi@0: jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_UnregisterNatives(JNIEnv *env, aoqi@0: jclass clazz)) aoqi@0: functionEnter(thr); aoqi@0: jint result = UNCHECKED()->UnregisterNatives(env,clazz); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_MonitorEnter(JNIEnv *env, aoqi@0: jobject obj)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: ) aoqi@0: jint result = UNCHECKED()->MonitorEnter(env,obj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_MonitorExit(JNIEnv *env, aoqi@0: jobject obj)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: ) aoqi@0: jint result = UNCHECKED()->MonitorExit(env,obj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_GetJavaVM(JNIEnv *env, aoqi@0: JavaVM **vm)) aoqi@0: functionEnter(thr); aoqi@0: jint result = UNCHECKED()->GetJavaVM(env,vm); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_GetStringRegion(JNIEnv *env, aoqi@0: jstring str, aoqi@0: jsize start, aoqi@0: jsize len, aoqi@0: jchar *buf)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: UNCHECKED()->GetStringRegion(env, str, start, len, buf); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_GetStringUTFRegion(JNIEnv *env, aoqi@0: jstring str, aoqi@0: jsize start, aoqi@0: jsize len, aoqi@0: char *buf)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void *, aoqi@0: checked_jni_GetPrimitiveArrayCritical(JNIEnv *env, aoqi@0: jarray array, aoqi@0: jboolean *isCopy)) aoqi@0: functionEnterCritical(thr); aoqi@0: IN_VM( aoqi@0: check_is_primitive_array(thr, array); aoqi@0: ) aoqi@0: void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env, aoqi@0: jarray array, aoqi@0: void *carray, aoqi@0: jint mode)) aoqi@0: functionEnterCriticalExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: check_is_primitive_array(thr, array); aoqi@0: ) aoqi@0: /* The Hotspot JNI code does not use the parameters, so just check the aoqi@0: * array parameter as a minor sanity check aoqi@0: */ aoqi@0: UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, carray, mode); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(const jchar*, aoqi@0: checked_jni_GetStringCritical(JNIEnv *env, aoqi@0: jstring string, aoqi@0: jboolean *isCopy)) aoqi@0: functionEnterCritical(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, string); aoqi@0: ) aoqi@0: const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_ReleaseStringCritical(JNIEnv *env, aoqi@0: jstring str, aoqi@0: const jchar *chars)) aoqi@0: functionEnterCriticalExceptionAllowed(thr); aoqi@0: IN_VM( aoqi@0: checkString(thr, str); aoqi@0: ) aoqi@0: /* The Hotspot JNI code does not use the parameters, so just check the aoqi@0: * string parameter as a minor sanity check aoqi@0: */ aoqi@0: UNCHECKED()->ReleaseStringCritical(env, str, chars); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jweak, aoqi@0: checked_jni_NewWeakGlobalRef(JNIEnv *env, aoqi@0: jobject obj)) aoqi@0: functionEnter(thr); aoqi@0: IN_VM( aoqi@0: if (obj != NULL) { aoqi@0: jniCheck::validate_handle(thr, obj); aoqi@0: } aoqi@0: ) aoqi@0: jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void, aoqi@0: checked_jni_DeleteWeakGlobalRef(JNIEnv *env, aoqi@0: jweak ref)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: UNCHECKED()->DeleteWeakGlobalRef(env, ref); aoqi@0: functionExit(env); aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jboolean, aoqi@0: checked_jni_ExceptionCheck(JNIEnv *env)) aoqi@0: functionEnterExceptionAllowed(thr); aoqi@0: jboolean result = UNCHECKED()->ExceptionCheck(env); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobject, aoqi@0: checked_jni_NewDirectByteBuffer(JNIEnv *env, aoqi@0: void *address, aoqi@0: jlong capacity)) aoqi@0: functionEnter(thr); aoqi@0: jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(void *, aoqi@0: checked_jni_GetDirectBufferAddress(JNIEnv *env, aoqi@0: jobject buf)) aoqi@0: functionEnter(thr); aoqi@0: void* result = UNCHECKED()->GetDirectBufferAddress(env, buf); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jlong, aoqi@0: checked_jni_GetDirectBufferCapacity(JNIEnv *env, aoqi@0: jobject buf)) aoqi@0: functionEnter(thr); aoqi@0: jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jobjectRefType, aoqi@0: checked_jni_GetObjectRefType(JNIEnv *env, aoqi@0: jobject obj)) aoqi@0: functionEnter(thr); aoqi@0: /* validate the object being passed */ aoqi@0: IN_VM( aoqi@0: jniCheck::validate_object(thr, obj); aoqi@0: ) aoqi@0: jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: aoqi@0: JNI_ENTRY_CHECKED(jint, aoqi@0: checked_jni_GetVersion(JNIEnv *env)) aoqi@0: functionEnter(thr); aoqi@0: jint result = UNCHECKED()->GetVersion(env); aoqi@0: functionExit(env); aoqi@0: return result; aoqi@0: JNI_END aoqi@0: aoqi@0: aoqi@0: aoqi@0: /* aoqi@0: * Structure containing all checked jni functions aoqi@0: */ aoqi@0: struct JNINativeInterface_ checked_jni_NativeInterface = { aoqi@0: NULL, aoqi@0: NULL, aoqi@0: NULL, aoqi@0: aoqi@0: NULL, aoqi@0: aoqi@0: checked_jni_GetVersion, aoqi@0: aoqi@0: checked_jni_DefineClass, aoqi@0: checked_jni_FindClass, aoqi@0: aoqi@0: checked_jni_FromReflectedMethod, aoqi@0: checked_jni_FromReflectedField, aoqi@0: aoqi@0: checked_jni_ToReflectedMethod, aoqi@0: aoqi@0: checked_jni_GetSuperclass, aoqi@0: checked_jni_IsAssignableFrom, aoqi@0: aoqi@0: checked_jni_ToReflectedField, aoqi@0: aoqi@0: checked_jni_Throw, aoqi@0: checked_jni_ThrowNew, aoqi@0: checked_jni_ExceptionOccurred, aoqi@0: checked_jni_ExceptionDescribe, aoqi@0: checked_jni_ExceptionClear, aoqi@0: checked_jni_FatalError, aoqi@0: aoqi@0: checked_jni_PushLocalFrame, aoqi@0: checked_jni_PopLocalFrame, aoqi@0: aoqi@0: checked_jni_NewGlobalRef, aoqi@0: checked_jni_DeleteGlobalRef, aoqi@0: checked_jni_DeleteLocalRef, aoqi@0: checked_jni_IsSameObject, aoqi@0: aoqi@0: checked_jni_NewLocalRef, aoqi@0: checked_jni_EnsureLocalCapacity, aoqi@0: aoqi@0: checked_jni_AllocObject, aoqi@0: checked_jni_NewObject, aoqi@0: checked_jni_NewObjectV, aoqi@0: checked_jni_NewObjectA, aoqi@0: aoqi@0: checked_jni_GetObjectClass, aoqi@0: checked_jni_IsInstanceOf, aoqi@0: aoqi@0: checked_jni_GetMethodID, aoqi@0: aoqi@0: checked_jni_CallObjectMethod, aoqi@0: checked_jni_CallObjectMethodV, aoqi@0: checked_jni_CallObjectMethodA, aoqi@0: checked_jni_CallBooleanMethod, aoqi@0: checked_jni_CallBooleanMethodV, aoqi@0: checked_jni_CallBooleanMethodA, aoqi@0: checked_jni_CallByteMethod, aoqi@0: checked_jni_CallByteMethodV, aoqi@0: checked_jni_CallByteMethodA, aoqi@0: checked_jni_CallCharMethod, aoqi@0: checked_jni_CallCharMethodV, aoqi@0: checked_jni_CallCharMethodA, aoqi@0: checked_jni_CallShortMethod, aoqi@0: checked_jni_CallShortMethodV, aoqi@0: checked_jni_CallShortMethodA, aoqi@0: checked_jni_CallIntMethod, aoqi@0: checked_jni_CallIntMethodV, aoqi@0: checked_jni_CallIntMethodA, aoqi@0: checked_jni_CallLongMethod, aoqi@0: checked_jni_CallLongMethodV, aoqi@0: checked_jni_CallLongMethodA, aoqi@0: checked_jni_CallFloatMethod, aoqi@0: checked_jni_CallFloatMethodV, aoqi@0: checked_jni_CallFloatMethodA, aoqi@0: checked_jni_CallDoubleMethod, aoqi@0: checked_jni_CallDoubleMethodV, aoqi@0: checked_jni_CallDoubleMethodA, aoqi@0: checked_jni_CallVoidMethod, aoqi@0: checked_jni_CallVoidMethodV, aoqi@0: checked_jni_CallVoidMethodA, aoqi@0: aoqi@0: checked_jni_CallNonvirtualObjectMethod, aoqi@0: checked_jni_CallNonvirtualObjectMethodV, aoqi@0: checked_jni_CallNonvirtualObjectMethodA, aoqi@0: checked_jni_CallNonvirtualBooleanMethod, aoqi@0: checked_jni_CallNonvirtualBooleanMethodV, aoqi@0: checked_jni_CallNonvirtualBooleanMethodA, aoqi@0: checked_jni_CallNonvirtualByteMethod, aoqi@0: checked_jni_CallNonvirtualByteMethodV, aoqi@0: checked_jni_CallNonvirtualByteMethodA, aoqi@0: checked_jni_CallNonvirtualCharMethod, aoqi@0: checked_jni_CallNonvirtualCharMethodV, aoqi@0: checked_jni_CallNonvirtualCharMethodA, aoqi@0: checked_jni_CallNonvirtualShortMethod, aoqi@0: checked_jni_CallNonvirtualShortMethodV, aoqi@0: checked_jni_CallNonvirtualShortMethodA, aoqi@0: checked_jni_CallNonvirtualIntMethod, aoqi@0: checked_jni_CallNonvirtualIntMethodV, aoqi@0: checked_jni_CallNonvirtualIntMethodA, aoqi@0: checked_jni_CallNonvirtualLongMethod, aoqi@0: checked_jni_CallNonvirtualLongMethodV, aoqi@0: checked_jni_CallNonvirtualLongMethodA, aoqi@0: checked_jni_CallNonvirtualFloatMethod, aoqi@0: checked_jni_CallNonvirtualFloatMethodV, aoqi@0: checked_jni_CallNonvirtualFloatMethodA, aoqi@0: checked_jni_CallNonvirtualDoubleMethod, aoqi@0: checked_jni_CallNonvirtualDoubleMethodV, aoqi@0: checked_jni_CallNonvirtualDoubleMethodA, aoqi@0: checked_jni_CallNonvirtualVoidMethod, aoqi@0: checked_jni_CallNonvirtualVoidMethodV, aoqi@0: checked_jni_CallNonvirtualVoidMethodA, aoqi@0: aoqi@0: checked_jni_GetFieldID, aoqi@0: aoqi@0: checked_jni_GetObjectField, aoqi@0: checked_jni_GetBooleanField, aoqi@0: checked_jni_GetByteField, aoqi@0: checked_jni_GetCharField, aoqi@0: checked_jni_GetShortField, aoqi@0: checked_jni_GetIntField, aoqi@0: checked_jni_GetLongField, aoqi@0: checked_jni_GetFloatField, aoqi@0: checked_jni_GetDoubleField, aoqi@0: aoqi@0: checked_jni_SetObjectField, aoqi@0: checked_jni_SetBooleanField, aoqi@0: checked_jni_SetByteField, aoqi@0: checked_jni_SetCharField, aoqi@0: checked_jni_SetShortField, aoqi@0: checked_jni_SetIntField, aoqi@0: checked_jni_SetLongField, aoqi@0: checked_jni_SetFloatField, aoqi@0: checked_jni_SetDoubleField, aoqi@0: aoqi@0: checked_jni_GetStaticMethodID, aoqi@0: aoqi@0: checked_jni_CallStaticObjectMethod, aoqi@0: checked_jni_CallStaticObjectMethodV, aoqi@0: checked_jni_CallStaticObjectMethodA, aoqi@0: checked_jni_CallStaticBooleanMethod, aoqi@0: checked_jni_CallStaticBooleanMethodV, aoqi@0: checked_jni_CallStaticBooleanMethodA, aoqi@0: checked_jni_CallStaticByteMethod, aoqi@0: checked_jni_CallStaticByteMethodV, aoqi@0: checked_jni_CallStaticByteMethodA, aoqi@0: checked_jni_CallStaticCharMethod, aoqi@0: checked_jni_CallStaticCharMethodV, aoqi@0: checked_jni_CallStaticCharMethodA, aoqi@0: checked_jni_CallStaticShortMethod, aoqi@0: checked_jni_CallStaticShortMethodV, aoqi@0: checked_jni_CallStaticShortMethodA, aoqi@0: checked_jni_CallStaticIntMethod, aoqi@0: checked_jni_CallStaticIntMethodV, aoqi@0: checked_jni_CallStaticIntMethodA, aoqi@0: checked_jni_CallStaticLongMethod, aoqi@0: checked_jni_CallStaticLongMethodV, aoqi@0: checked_jni_CallStaticLongMethodA, aoqi@0: checked_jni_CallStaticFloatMethod, aoqi@0: checked_jni_CallStaticFloatMethodV, aoqi@0: checked_jni_CallStaticFloatMethodA, aoqi@0: checked_jni_CallStaticDoubleMethod, aoqi@0: checked_jni_CallStaticDoubleMethodV, aoqi@0: checked_jni_CallStaticDoubleMethodA, aoqi@0: checked_jni_CallStaticVoidMethod, aoqi@0: checked_jni_CallStaticVoidMethodV, aoqi@0: checked_jni_CallStaticVoidMethodA, aoqi@0: aoqi@0: checked_jni_GetStaticFieldID, aoqi@0: aoqi@0: checked_jni_GetStaticObjectField, aoqi@0: checked_jni_GetStaticBooleanField, aoqi@0: checked_jni_GetStaticByteField, aoqi@0: checked_jni_GetStaticCharField, aoqi@0: checked_jni_GetStaticShortField, aoqi@0: checked_jni_GetStaticIntField, aoqi@0: checked_jni_GetStaticLongField, aoqi@0: checked_jni_GetStaticFloatField, aoqi@0: checked_jni_GetStaticDoubleField, aoqi@0: aoqi@0: checked_jni_SetStaticObjectField, aoqi@0: checked_jni_SetStaticBooleanField, aoqi@0: checked_jni_SetStaticByteField, aoqi@0: checked_jni_SetStaticCharField, aoqi@0: checked_jni_SetStaticShortField, aoqi@0: checked_jni_SetStaticIntField, aoqi@0: checked_jni_SetStaticLongField, aoqi@0: checked_jni_SetStaticFloatField, aoqi@0: checked_jni_SetStaticDoubleField, aoqi@0: aoqi@0: checked_jni_NewString, aoqi@0: checked_jni_GetStringLength, aoqi@0: checked_jni_GetStringChars, aoqi@0: checked_jni_ReleaseStringChars, aoqi@0: aoqi@0: checked_jni_NewStringUTF, aoqi@0: checked_jni_GetStringUTFLength, aoqi@0: checked_jni_GetStringUTFChars, aoqi@0: checked_jni_ReleaseStringUTFChars, aoqi@0: aoqi@0: checked_jni_GetArrayLength, aoqi@0: aoqi@0: checked_jni_NewObjectArray, aoqi@0: checked_jni_GetObjectArrayElement, aoqi@0: checked_jni_SetObjectArrayElement, aoqi@0: aoqi@0: checked_jni_NewBooleanArray, aoqi@0: checked_jni_NewByteArray, aoqi@0: checked_jni_NewCharArray, aoqi@0: checked_jni_NewShortArray, aoqi@0: checked_jni_NewIntArray, aoqi@0: checked_jni_NewLongArray, aoqi@0: checked_jni_NewFloatArray, aoqi@0: checked_jni_NewDoubleArray, aoqi@0: aoqi@0: checked_jni_GetBooleanArrayElements, aoqi@0: checked_jni_GetByteArrayElements, aoqi@0: checked_jni_GetCharArrayElements, aoqi@0: checked_jni_GetShortArrayElements, aoqi@0: checked_jni_GetIntArrayElements, aoqi@0: checked_jni_GetLongArrayElements, aoqi@0: checked_jni_GetFloatArrayElements, aoqi@0: checked_jni_GetDoubleArrayElements, aoqi@0: aoqi@0: checked_jni_ReleaseBooleanArrayElements, aoqi@0: checked_jni_ReleaseByteArrayElements, aoqi@0: checked_jni_ReleaseCharArrayElements, aoqi@0: checked_jni_ReleaseShortArrayElements, aoqi@0: checked_jni_ReleaseIntArrayElements, aoqi@0: checked_jni_ReleaseLongArrayElements, aoqi@0: checked_jni_ReleaseFloatArrayElements, aoqi@0: checked_jni_ReleaseDoubleArrayElements, aoqi@0: aoqi@0: checked_jni_GetBooleanArrayRegion, aoqi@0: checked_jni_GetByteArrayRegion, aoqi@0: checked_jni_GetCharArrayRegion, aoqi@0: checked_jni_GetShortArrayRegion, aoqi@0: checked_jni_GetIntArrayRegion, aoqi@0: checked_jni_GetLongArrayRegion, aoqi@0: checked_jni_GetFloatArrayRegion, aoqi@0: checked_jni_GetDoubleArrayRegion, aoqi@0: aoqi@0: checked_jni_SetBooleanArrayRegion, aoqi@0: checked_jni_SetByteArrayRegion, aoqi@0: checked_jni_SetCharArrayRegion, aoqi@0: checked_jni_SetShortArrayRegion, aoqi@0: checked_jni_SetIntArrayRegion, aoqi@0: checked_jni_SetLongArrayRegion, aoqi@0: checked_jni_SetFloatArrayRegion, aoqi@0: checked_jni_SetDoubleArrayRegion, aoqi@0: aoqi@0: checked_jni_RegisterNatives, aoqi@0: checked_jni_UnregisterNatives, aoqi@0: aoqi@0: checked_jni_MonitorEnter, aoqi@0: checked_jni_MonitorExit, aoqi@0: aoqi@0: checked_jni_GetJavaVM, aoqi@0: aoqi@0: checked_jni_GetStringRegion, aoqi@0: checked_jni_GetStringUTFRegion, aoqi@0: aoqi@0: checked_jni_GetPrimitiveArrayCritical, aoqi@0: checked_jni_ReleasePrimitiveArrayCritical, aoqi@0: aoqi@0: checked_jni_GetStringCritical, aoqi@0: checked_jni_ReleaseStringCritical, aoqi@0: aoqi@0: checked_jni_NewWeakGlobalRef, aoqi@0: checked_jni_DeleteWeakGlobalRef, aoqi@0: aoqi@0: checked_jni_ExceptionCheck, aoqi@0: aoqi@0: checked_jni_NewDirectByteBuffer, aoqi@0: checked_jni_GetDirectBufferAddress, aoqi@0: checked_jni_GetDirectBufferCapacity, aoqi@0: aoqi@0: // New 1.6 Features aoqi@0: aoqi@0: checked_jni_GetObjectRefType aoqi@0: }; aoqi@0: aoqi@0: aoqi@0: // Returns the function structure aoqi@0: struct JNINativeInterface_* jni_functions_check() { aoqi@0: aoqi@0: unchecked_jni_NativeInterface = jni_functions_nocheck(); aoqi@0: aoqi@0: // make sure the last pointer in the checked table is not null, indicating aoqi@0: // an addition to the JNINativeInterface_ structure without initializing aoqi@0: // it in the checked table. aoqi@0: debug_only(int *lastPtr = (int *)((char *)&checked_jni_NativeInterface + \ aoqi@0: sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));) aoqi@0: assert(*lastPtr != 0, aoqi@0: "Mismatched JNINativeInterface tables, check for new entries"); aoqi@0: aoqi@0: // with -verbose:jni this message will print aoqi@0: if (PrintJNIResolving) { aoqi@0: tty->print_cr("Checked JNI functions are being used to " \ aoqi@0: "validate JNI usage"); aoqi@0: } aoqi@0: aoqi@0: return &checked_jni_NativeInterface; aoqi@0: }