Path: blob/jdk8u272-b10-aarch32-20201026/hotspot/src/share/vm/prims/jniCheck.cpp
48773 views
/*1* Copyright (c) 2001, 2019, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "classfile/systemDictionary.hpp"26#include "classfile/vmSymbols.hpp"27#include "memory/guardedMemory.hpp"28#include "oops/instanceKlass.hpp"29#include "oops/oop.inline.hpp"30#include "oops/symbol.hpp"31#include "prims/jni.h"32#include "prims/jniCheck.hpp"33#include "prims/jvm_misc.hpp"34#include "runtime/fieldDescriptor.hpp"35#include "runtime/handles.hpp"36#include "runtime/interfaceSupport.hpp"37#include "runtime/jfieldIDWorkaround.hpp"38#include "runtime/thread.inline.hpp"39#ifdef TARGET_ARCH_x8640# include "jniTypes_x86.hpp"41#endif42#ifdef TARGET_ARCH_aarch6443# include "jniTypes_aarch64.hpp"44#endif45#ifdef TARGET_ARCH_sparc46# include "jniTypes_sparc.hpp"47#endif48#ifdef TARGET_ARCH_zero49# include "jniTypes_zero.hpp"50#endif51#ifdef TARGET_ARCH_arm52# include "jniTypes_arm.hpp"53#endif54#ifdef TARGET_ARCH_ppc55# include "jniTypes_ppc.hpp"56#endif57#ifdef TARGET_ARCH_aarch3258# include "jniTypes_aarch32.hpp"59#endif6061// Complain every extra number of unplanned local refs62#define CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD 326364// Heap objects are allowed to be directly referenced only in VM code,65// not in native code.6667#define ASSERT_OOPS_ALLOWED \68assert(JavaThread::current()->thread_state() == _thread_in_vm, \69"jniCheck examining oops in bad state.")707172// Execute the given block of source code with the thread in VM state.73// To do this, transition from the NATIVE state to the VM state, execute74// the code, and transtition back. The ThreadInVMfromNative constructor75// performs the transition to VM state, its destructor restores the76// NATIVE state.7778#define IN_VM(source_code) { \79{ \80ThreadInVMfromNative __tiv(thr); \81source_code \82} \83}848586/*87* DECLARATIONS88*/8990static struct JNINativeInterface_ * unchecked_jni_NativeInterface;919293/*94* MACRO DEFINITIONS95*/9697// All JNI checked functions here use JNI_ENTRY_CHECKED() instead of the98// QUICK_ENTRY or LEAF variants found in jni.cpp. This allows handles99// to be created if a fatal error should occur.100101// Check for thread not attached to VM; need to catch this before102// assertions in the wrapper routines might fire103104// Check for env being the one value appropriate for this thread.105106#define JNI_ENTRY_CHECKED(result_type, header) \107extern "C" { \108result_type JNICALL header { \109JavaThread* thr = (JavaThread*)ThreadLocalStorage::get_thread_slow();\110if (thr == NULL || !thr->is_Java_thread()) { \111tty->print_cr("%s", fatal_using_jnienv_in_nonjava); \112os::abort(true); \113} \114JNIEnv* xenv = thr->jni_environment(); \115if (env != xenv) { \116NativeReportJNIFatalError(thr, warn_wrong_jnienv); \117} \118VM_ENTRY_BASE(result_type, header, thr)119120121#define UNCHECKED() (unchecked_jni_NativeInterface)122123static const char * warn_wrong_jnienv = "Using JNIEnv in the wrong thread";124static const char * warn_bad_class_descriptor = "JNI FindClass received a bad class descriptor \"%s\". A correct class descriptor " \125"has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases.";126static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread";127static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \128"Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical";129static const char * fatal_bad_ref_to_jni = "Bad global or local ref passed to JNI";130static const char * fatal_received_null_class = "JNI received a null class";131static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";132static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass";133static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";134static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call";135static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";136static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";137static const char * fatal_prim_type_array_expected = "Primitive type array expected but not received for JNI array operation";138static const char * fatal_non_array = "Non-array passed to JNI array operations";139static const char * fatal_element_type_mismatch = "Array element type mismatch in JNI";140static const char * fatal_should_be_static = "Non-static field ID passed to JNI";141static const char * fatal_wrong_static_field = "Wrong static field ID passed to JNI";142static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations";143static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations";144static const char * fatal_should_be_nonstatic = "Static field ID passed to JNI";145static const char * fatal_null_object = "Null object passed to JNI";146static const char * fatal_wrong_field = "Wrong field ID passed to JNI";147static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations";148static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations";149static const char * fatal_non_string = "JNI string operation received a non-string";150151152// When in VM state:153static void ReportJNIWarning(JavaThread* thr, const char *msg) {154tty->print_cr("WARNING in native method: %s", msg);155thr->print_stack();156}157158// When in NATIVE state:159static void NativeReportJNIFatalError(JavaThread* thr, const char *msg) {160IN_VM(161ReportJNIFatalError(thr, msg);162)163}164165static void NativeReportJNIWarning(JavaThread* thr, const char *msg) {166IN_VM(167ReportJNIWarning(thr, msg);168)169}170171172173174/*175* SUPPORT FUNCTIONS176*/177178/**179* Check whether or not a programmer has actually checked for exceptions. According180* to the JNI Specification ("jni/spec/design.html#java_exceptions"):181*182* There are two cases where the programmer needs to check for exceptions without183* being able to first check an error code:184*185* - The JNI functions that invoke a Java method return the result of the Java method.186* The programmer must call ExceptionOccurred() to check for possible exceptions187* that occurred during the execution of the Java method.188*189* - Some of the JNI array access functions do not return an error code, but may190* throw an ArrayIndexOutOfBoundsException or ArrayStoreException.191*192* In all other cases, a non-error return value guarantees that no exceptions have been thrown.193*194* Programmers often defend against ArrayIndexOutOfBoundsException, so warning195* for these functions would be pedantic.196*/197static inline void198check_pending_exception(JavaThread* thr) {199if (thr->has_pending_exception()) {200NativeReportJNIWarning(thr, "JNI call made with exception pending");201}202if (thr->is_pending_jni_exception_check()) {203IN_VM(204tty->print_cr("WARNING in native method: JNI call made without checking exceptions when required to from %s",205thr->get_pending_jni_exception_check());206thr->print_stack();207)208thr->clear_pending_jni_exception_check(); // Just complain once209}210}211212/**213* Add to the planned number of handles. I.e. plus current live & warning threshold214*/215static inline void216add_planned_handle_capacity(JNIHandleBlock* handles, size_t capacity) {217handles->set_planned_capacity(capacity +218handles->get_number_of_live_handles() +219CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);220}221222223static inline void224functionEnterCritical(JavaThread* thr)225{226check_pending_exception(thr);227}228229static inline void230functionEnterCriticalExceptionAllowed(JavaThread* thr)231{232}233234static inline void235functionEnter(JavaThread* thr)236{237if (thr->in_critical()) {238tty->print_cr("%s", warn_other_function_in_critical);239}240check_pending_exception(thr);241}242243static inline void244functionEnterExceptionAllowed(JavaThread* thr)245{246if (thr->in_critical()) {247tty->print_cr("%s", warn_other_function_in_critical);248}249}250251static inline void252functionExit(JavaThread* thr)253{254JNIHandleBlock* handles = thr->active_handles();255size_t planned_capacity = handles->get_planned_capacity();256size_t live_handles = handles->get_number_of_live_handles();257if (live_handles > planned_capacity) {258IN_VM(259tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu",260live_handles, planned_capacity);261thr->print_stack();262)263// Complain just the once, reset to current + warn threshold264add_planned_handle_capacity(handles, 0);265}266}267268static inline void269checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)270{271fieldDescriptor fd;272273/* make sure it is a static field */274if (!jfieldIDWorkaround::is_static_jfieldID(fid))275ReportJNIFatalError(thr, fatal_should_be_static);276277/* validate the class being passed */278ASSERT_OOPS_ALLOWED;279Klass* k_oop = jniCheck::validate_class(thr, cls, false);280281/* check for proper subclass hierarchy */282JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);283Klass* f_oop = id->holder();284if (!InstanceKlass::cast(k_oop)->is_subtype_of(f_oop))285ReportJNIFatalError(thr, fatal_wrong_static_field);286287/* check for proper field type */288if (!id->find_local_field(&fd))289ReportJNIFatalError(thr, fatal_static_field_not_found);290if ((fd.field_type() != ftype) &&291!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {292ReportJNIFatalError(thr, fatal_static_field_mismatch);293}294}295296static inline void297checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)298{299fieldDescriptor fd;300301/* make sure it is an instance field */302if (jfieldIDWorkaround::is_static_jfieldID(fid))303ReportJNIFatalError(thr, fatal_should_be_nonstatic);304305/* validate the object being passed and then get its class */306ASSERT_OOPS_ALLOWED;307oop oopObj = jniCheck::validate_object(thr, obj);308if (!oopObj) {309ReportJNIFatalError(thr, fatal_null_object);310}311Klass* k_oop = oopObj->klass();312313if (!jfieldIDWorkaround::is_valid_jfieldID(k_oop, fid)) {314ReportJNIFatalError(thr, fatal_wrong_field);315}316317/* make sure the field exists */318int offset = jfieldIDWorkaround::from_instance_jfieldID(k_oop, fid);319if (!InstanceKlass::cast(k_oop)->contains_field_offset(offset))320ReportJNIFatalError(thr, fatal_wrong_field);321322/* check for proper field type */323if (!InstanceKlass::cast(k_oop)->find_field_from_offset(offset,324false, &fd))325ReportJNIFatalError(thr, fatal_instance_field_not_found);326327if ((fd.field_type() != ftype) &&328!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {329ReportJNIFatalError(thr, fatal_instance_field_mismatch);330}331}332333static inline void334checkString(JavaThread* thr, jstring js)335{336ASSERT_OOPS_ALLOWED;337oop s = jniCheck::validate_object(thr, js);338if (!s || !java_lang_String::is_instance(s))339ReportJNIFatalError(thr, fatal_non_string);340}341342static inline arrayOop343check_is_array(JavaThread* thr, jarray jArray)344{345ASSERT_OOPS_ALLOWED;346arrayOop aOop;347348aOop = (arrayOop)jniCheck::validate_object(thr, jArray);349if (aOop == NULL || !aOop->is_array()) {350ReportJNIFatalError(thr, fatal_non_array);351}352return aOop;353}354355static inline arrayOop356check_is_primitive_array(JavaThread* thr, jarray jArray) {357arrayOop aOop = check_is_array(thr, jArray);358359if (!aOop->is_typeArray()) {360ReportJNIFatalError(thr, fatal_prim_type_array_expected);361}362return aOop;363}364365static inline void366check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)367{368BasicType array_type;369arrayOop aOop;370371aOop = check_is_primitive_array(thr, jArray);372array_type = TypeArrayKlass::cast(aOop->klass())->element_type();373if (array_type != elementType) {374ReportJNIFatalError(thr, fatal_element_type_mismatch);375}376}377378static inline void379check_is_obj_array(JavaThread* thr, jarray jArray) {380arrayOop aOop = check_is_array(thr, jArray);381if (!aOop->is_objArray()) {382ReportJNIFatalError(thr, fatal_object_array_expected);383}384}385386/*387* Copy and wrap array elements for bounds checking.388* Remember the original elements (GuardedMemory::get_tag())389*/390static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,391void* orig_elements) {392void* result;393IN_VM(394oop a = JNIHandles::resolve_non_null(array);395size_t len = arrayOop(a)->length() <<396TypeArrayKlass::cast(a->klass())->log2_element_size();397result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);398)399return result;400}401402static void* check_wrapped_array(JavaThread* thr, const char* fn_name,403void* obj, void* carray, size_t* rsz) {404if (carray == NULL) {405tty->print_cr("%s: elements vector NULL" PTR_FORMAT, fn_name, p2i(obj));406NativeReportJNIFatalError(thr, "Elements vector NULL");407}408GuardedMemory guarded(carray);409void* orig_result = guarded.get_tag();410if (!guarded.verify_guards()) {411tty->print_cr("ReleasePrimitiveArrayCritical: release array failed bounds "412"check, incorrect pointer returned ? array: " PTR_FORMAT " carray: "413PTR_FORMAT, p2i(obj), p2i(carray));414guarded.print_on(tty);415NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "416"failed bounds check");417}418if (orig_result == NULL) {419tty->print_cr("ReleasePrimitiveArrayCritical: unrecognized elements. array: "420PTR_FORMAT " carray: " PTR_FORMAT, p2i(obj), p2i(carray));421guarded.print_on(tty);422NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "423"unrecognized elements");424}425if (rsz != NULL) {426*rsz = guarded.get_user_size();427}428return orig_result;429}430431static void* check_wrapped_array_release(JavaThread* thr, const char* fn_name,432void* obj, void* carray, jint mode) {433size_t sz;434void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz);435switch (mode) {436// As we never make copies, mode 0 and JNI_COMMIT are the same.437case 0:438case JNI_COMMIT:439memcpy(orig_result, carray, sz);440break;441case JNI_ABORT:442break;443default:444tty->print_cr("%s: Unrecognized mode %i releasing array "445PTR_FORMAT " elements " PTR_FORMAT, fn_name, mode, p2i(obj), p2i(carray));446NativeReportJNIFatalError(thr, "Unrecognized array release mode");447}448// We always need to release the copy we made with GuardedMemory449GuardedMemory::free_copy(carray);450return orig_result;451}452453oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {454if (JNIHandles::is_frame_handle(thr, obj) ||455JNIHandles::is_local_handle(thr, obj) ||456JNIHandles::is_global_handle(obj) ||457JNIHandles::is_weak_global_handle(obj)) {458ASSERT_OOPS_ALLOWED;459return JNIHandles::resolve_external_guard(obj);460}461ReportJNIFatalError(thr, fatal_bad_ref_to_jni);462return NULL;463}464465466Method* jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {467ASSERT_OOPS_ALLOWED;468// Do the jmethodID check469Method* moop = Method::checked_resolve_jmethod_id(method_id);470if (moop == NULL) {471ReportJNIFatalError(thr, fatal_wrong_class_or_method);472}473return moop;474}475476477oop jniCheck::validate_object(JavaThread* thr, jobject obj) {478if (!obj)479return NULL;480ASSERT_OOPS_ALLOWED;481oop oopObj = jniCheck::validate_handle(thr, obj);482if (!oopObj) {483ReportJNIFatalError(thr, fatal_bad_ref_to_jni);484}485return oopObj;486}487488// Warn if a class descriptor is in decorated form; class descriptors489// passed to JNI findClass should not be decorated unless they are490// array descriptors.491void jniCheck::validate_class_descriptor(JavaThread* thr, const char* name) {492if (name == NULL) return; // implementation accepts NULL so just return493494size_t len = strlen(name);495496if (len >= 2 &&497name[0] == JVM_SIGNATURE_CLASS && // 'L'498name[len-1] == JVM_SIGNATURE_ENDCLASS ) { // ';'499char msg[JVM_MAXPATHLEN];500jio_snprintf(msg, JVM_MAXPATHLEN, warn_bad_class_descriptor, name);501ReportJNIWarning(thr, msg);502}503}504505Klass* jniCheck::validate_class(JavaThread* thr, jclass clazz, bool allow_primitive) {506ASSERT_OOPS_ALLOWED;507oop mirror = jniCheck::validate_handle(thr, clazz);508if (!mirror) {509ReportJNIFatalError(thr, fatal_received_null_class);510}511512if (mirror->klass() != SystemDictionary::Class_klass()) {513ReportJNIFatalError(thr, fatal_class_not_a_class);514}515516Klass* k = java_lang_Class::as_Klass(mirror);517// Make allowances for primitive classes ...518if (!(k != NULL || allow_primitive && java_lang_Class::is_primitive(mirror))) {519ReportJNIFatalError(thr, fatal_class_not_a_class);520}521return k;522}523524void jniCheck::validate_throwable_klass(JavaThread* thr, Klass* klass) {525ASSERT_OOPS_ALLOWED;526assert(klass != NULL, "klass argument must have a value");527528if (!klass->oop_is_instance() ||529!InstanceKlass::cast(klass)->is_subclass_of(SystemDictionary::Throwable_klass())) {530ReportJNIFatalError(thr, fatal_class_not_a_throwable_class);531}532}533534void jniCheck::validate_call_object(JavaThread* thr, jobject obj, jmethodID method_id) {535/* validate the object being passed */536ASSERT_OOPS_ALLOWED;537jniCheck::validate_jmethod_id(thr, method_id);538jniCheck::validate_object(thr, obj);539}540541void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id) {542/* validate the class being passed */543ASSERT_OOPS_ALLOWED;544jniCheck::validate_jmethod_id(thr, method_id);545jniCheck::validate_class(thr, clazz, false);546}547548549/*550* IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE551*/552553JNI_ENTRY_CHECKED(jclass,554checked_jni_DefineClass(JNIEnv *env,555const char *name,556jobject loader,557const jbyte *buf,558jsize len))559functionEnter(thr);560IN_VM(561jniCheck::validate_object(thr, loader);562)563jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);564functionExit(thr);565return result;566JNI_END567568JNI_ENTRY_CHECKED(jclass,569checked_jni_FindClass(JNIEnv *env,570const char *name))571functionEnter(thr);572IN_VM(573jniCheck::validate_class_descriptor(thr, name);574)575jclass result = UNCHECKED()->FindClass(env, name);576functionExit(thr);577return result;578JNI_END579580JNI_ENTRY_CHECKED(jmethodID,581checked_jni_FromReflectedMethod(JNIEnv *env,582jobject method))583functionEnter(thr);584IN_VM(585jniCheck::validate_object(thr, method);586)587jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);588functionExit(thr);589return result;590JNI_END591592JNI_ENTRY_CHECKED(jfieldID,593checked_jni_FromReflectedField(JNIEnv *env,594jobject field))595functionEnter(thr);596IN_VM(597jniCheck::validate_object(thr, field);598)599jfieldID result = UNCHECKED()->FromReflectedField(env, field);600functionExit(thr);601return result;602JNI_END603604JNI_ENTRY_CHECKED(jobject,605checked_jni_ToReflectedMethod(JNIEnv *env,606jclass cls,607jmethodID methodID,608jboolean isStatic))609functionEnter(thr);610IN_VM(611jniCheck::validate_class(thr, cls, false);612jniCheck::validate_jmethod_id(thr, methodID);613)614jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,615isStatic);616functionExit(thr);617return result;618JNI_END619620JNI_ENTRY_CHECKED(jclass,621checked_jni_GetSuperclass(JNIEnv *env,622jclass sub))623functionEnter(thr);624IN_VM(625jniCheck::validate_class(thr, sub, true);626)627jclass result = UNCHECKED()->GetSuperclass(env, sub);628functionExit(thr);629return result;630JNI_END631632JNI_ENTRY_CHECKED(jboolean,633checked_jni_IsAssignableFrom(JNIEnv *env,634jclass sub,635jclass sup))636functionEnter(thr);637IN_VM(638jniCheck::validate_class(thr, sub, true);639jniCheck::validate_class(thr, sup, true);640)641jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);642functionExit(thr);643return result;644JNI_END645646JNI_ENTRY_CHECKED(jobject,647checked_jni_ToReflectedField(JNIEnv *env,648jclass cls,649jfieldID fieldID,650jboolean isStatic))651functionEnter(thr);652IN_VM(653jniCheck::validate_class(thr, cls, false);654)655jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,656isStatic);657functionExit(thr);658return result;659JNI_END660661JNI_ENTRY_CHECKED(jint,662checked_jni_Throw(JNIEnv *env,663jthrowable obj))664functionEnter(thr);665IN_VM(666oop oopObj = jniCheck::validate_object(thr, obj);667if (oopObj == NULL) {668// Unchecked Throw tolerates a NULL obj, so just warn669ReportJNIWarning(thr, "JNI Throw called with NULL throwable");670} else {671jniCheck::validate_throwable_klass(thr, oopObj->klass());672}673)674jint result = UNCHECKED()->Throw(env, obj);675functionExit(thr);676return result;677JNI_END678679JNI_ENTRY_CHECKED(jint,680checked_jni_ThrowNew(JNIEnv *env,681jclass clazz,682const char *msg))683functionEnter(thr);684IN_VM(685Klass* k = jniCheck::validate_class(thr, clazz, false);686assert(k != NULL, "validate_class shouldn't return NULL Klass*");687jniCheck::validate_throwable_klass(thr, k);688)689jint result = UNCHECKED()->ThrowNew(env, clazz, msg);690functionExit(thr);691return result;692JNI_END693694JNI_ENTRY_CHECKED(jthrowable,695checked_jni_ExceptionOccurred(JNIEnv *env))696thr->clear_pending_jni_exception_check();697functionEnterExceptionAllowed(thr);698jthrowable result = UNCHECKED()->ExceptionOccurred(env);699functionExit(thr);700return result;701JNI_END702703JNI_ENTRY_CHECKED(void,704checked_jni_ExceptionDescribe(JNIEnv *env))705functionEnterExceptionAllowed(thr);706UNCHECKED()->ExceptionDescribe(env);707functionExit(thr);708JNI_END709710JNI_ENTRY_CHECKED(void,711checked_jni_ExceptionClear(JNIEnv *env))712thr->clear_pending_jni_exception_check();713functionEnterExceptionAllowed(thr);714UNCHECKED()->ExceptionClear(env);715functionExit(thr);716JNI_END717718JNI_ENTRY_CHECKED(void,719checked_jni_FatalError(JNIEnv *env,720const char *msg))721thr->clear_pending_jni_exception_check();722functionEnter(thr);723UNCHECKED()->FatalError(env, msg);724functionExit(thr);725JNI_END726727JNI_ENTRY_CHECKED(jint,728checked_jni_PushLocalFrame(JNIEnv *env,729jint capacity))730functionEnterExceptionAllowed(thr);731if (capacity < 0)732NativeReportJNIFatalError(thr, "negative capacity");733jint result = UNCHECKED()->PushLocalFrame(env, capacity);734if (result == JNI_OK) {735add_planned_handle_capacity(thr->active_handles(), capacity);736}737functionExit(thr);738return result;739JNI_END740741JNI_ENTRY_CHECKED(jobject,742checked_jni_PopLocalFrame(JNIEnv *env,743jobject result))744functionEnterExceptionAllowed(thr);745jobject res = UNCHECKED()->PopLocalFrame(env, result);746functionExit(thr);747return res;748JNI_END749750JNI_ENTRY_CHECKED(jobject,751checked_jni_NewGlobalRef(JNIEnv *env,752jobject lobj))753functionEnter(thr);754IN_VM(755if (lobj != NULL) {756jniCheck::validate_handle(thr, lobj);757}758)759jobject result = UNCHECKED()->NewGlobalRef(env,lobj);760functionExit(thr);761return result;762JNI_END763764JNI_ENTRY_CHECKED(void,765checked_jni_DeleteGlobalRef(JNIEnv *env,766jobject gref))767functionEnterExceptionAllowed(thr);768IN_VM(769jniCheck::validate_object(thr, gref);770if (gref && !JNIHandles::is_global_handle(gref)) {771ReportJNIFatalError(thr,772"Invalid global JNI handle passed to DeleteGlobalRef");773}774)775UNCHECKED()->DeleteGlobalRef(env,gref);776functionExit(thr);777JNI_END778779JNI_ENTRY_CHECKED(void,780checked_jni_DeleteLocalRef(JNIEnv *env,781jobject obj))782functionEnterExceptionAllowed(thr);783IN_VM(784jniCheck::validate_object(thr, obj);785if (obj && !(JNIHandles::is_local_handle(thr, obj) ||786JNIHandles::is_frame_handle(thr, obj)))787ReportJNIFatalError(thr,788"Invalid local JNI handle passed to DeleteLocalRef");789)790UNCHECKED()->DeleteLocalRef(env, obj);791functionExit(thr);792JNI_END793794JNI_ENTRY_CHECKED(jboolean,795checked_jni_IsSameObject(JNIEnv *env,796jobject obj1,797jobject obj2))798functionEnterExceptionAllowed(thr);799IN_VM(800/* This JNI function can be used to compare weak global references801* to NULL objects. If the handles are valid, but contain NULL,802* then don't attempt to validate the object.803*/804if (obj1 != NULL && jniCheck::validate_handle(thr, obj1) != NULL) {805jniCheck::validate_object(thr, obj1);806}807if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {808jniCheck::validate_object(thr, obj2);809}810)811jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);812functionExit(thr);813return result;814JNI_END815816JNI_ENTRY_CHECKED(jobject,817checked_jni_NewLocalRef(JNIEnv *env,818jobject ref))819functionEnter(thr);820IN_VM(821if (ref != NULL) {822jniCheck::validate_handle(thr, ref);823}824)825jobject result = UNCHECKED()->NewLocalRef(env, ref);826functionExit(thr);827return result;828JNI_END829830JNI_ENTRY_CHECKED(jint,831checked_jni_EnsureLocalCapacity(JNIEnv *env,832jint capacity))833functionEnter(thr);834if (capacity < 0) {835NativeReportJNIFatalError(thr, "negative capacity");836}837jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);838if (result == JNI_OK) {839add_planned_handle_capacity(thr->active_handles(), capacity);840}841functionExit(thr);842return result;843JNI_END844845JNI_ENTRY_CHECKED(jobject,846checked_jni_AllocObject(JNIEnv *env,847jclass clazz))848functionEnter(thr);849IN_VM(850jniCheck::validate_class(thr, clazz, false);851)852jobject result = UNCHECKED()->AllocObject(env,clazz);853functionExit(thr);854return result;855JNI_END856857JNI_ENTRY_CHECKED(jobject,858checked_jni_NewObject(JNIEnv *env,859jclass clazz,860jmethodID methodID,861...))862functionEnter(thr);863va_list args;864IN_VM(865jniCheck::validate_class(thr, clazz, false);866jniCheck::validate_jmethod_id(thr, methodID);867)868va_start(args, methodID);869jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);870va_end(args);871functionExit(thr);872return result;873JNI_END874875JNI_ENTRY_CHECKED(jobject,876checked_jni_NewObjectV(JNIEnv *env,877jclass clazz,878jmethodID methodID,879va_list args))880functionEnter(thr);881IN_VM(882jniCheck::validate_class(thr, clazz, false);883jniCheck::validate_jmethod_id(thr, methodID);884)885jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);886functionExit(thr);887return result;888JNI_END889890JNI_ENTRY_CHECKED(jobject,891checked_jni_NewObjectA(JNIEnv *env,892jclass clazz,893jmethodID methodID,894const jvalue *args))895functionEnter(thr);896IN_VM(897jniCheck::validate_class(thr, clazz, false);898jniCheck::validate_jmethod_id(thr, methodID);899)900jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);901functionExit(thr);902return result;903JNI_END904905JNI_ENTRY_CHECKED(jclass,906checked_jni_GetObjectClass(JNIEnv *env,907jobject obj))908functionEnter(thr);909IN_VM(910jniCheck::validate_object(thr, obj);911)912jclass result = UNCHECKED()->GetObjectClass(env,obj);913functionExit(thr);914return result;915JNI_END916917JNI_ENTRY_CHECKED(jboolean,918checked_jni_IsInstanceOf(JNIEnv *env,919jobject obj,920jclass clazz))921functionEnter(thr);922IN_VM(923jniCheck::validate_object(thr, obj);924jniCheck::validate_class(thr, clazz, true);925)926jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);927functionExit(thr);928return result;929JNI_END930931JNI_ENTRY_CHECKED(jmethodID,932checked_jni_GetMethodID(JNIEnv *env,933jclass clazz,934const char *name,935const char *sig))936functionEnter(thr);937IN_VM(938jniCheck::validate_class(thr, clazz, false);939)940jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);941functionExit(thr);942return result;943JNI_END944945#define WRAPPER_CallMethod(ResultType, Result) \946JNI_ENTRY_CHECKED(ResultType, \947checked_jni_Call##Result##Method(JNIEnv *env, \948jobject obj, \949jmethodID methodID, \950...)) \951functionEnter(thr); \952va_list args; \953IN_VM( \954jniCheck::validate_call_object(thr, obj, methodID); \955) \956va_start(args,methodID); \957ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \958args); \959va_end(args); \960thr->set_pending_jni_exception_check("Call"#Result"Method"); \961functionExit(thr); \962return result; \963JNI_END \964\965JNI_ENTRY_CHECKED(ResultType, \966checked_jni_Call##Result##MethodV(JNIEnv *env, \967jobject obj, \968jmethodID methodID, \969va_list args)) \970functionEnter(thr); \971IN_VM(\972jniCheck::validate_call_object(thr, obj, methodID); \973) \974ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\975args); \976thr->set_pending_jni_exception_check("Call"#Result"MethodV"); \977functionExit(thr); \978return result; \979JNI_END \980\981JNI_ENTRY_CHECKED(ResultType, \982checked_jni_Call##Result##MethodA(JNIEnv *env, \983jobject obj, \984jmethodID methodID, \985const jvalue * args)) \986functionEnter(thr); \987IN_VM( \988jniCheck::validate_call_object(thr, obj, methodID); \989) \990ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\991args); \992thr->set_pending_jni_exception_check("Call"#Result"MethodA"); \993functionExit(thr); \994return result; \995JNI_END996997WRAPPER_CallMethod(jobject,Object)998WRAPPER_CallMethod(jboolean,Boolean)999WRAPPER_CallMethod(jbyte,Byte)1000WRAPPER_CallMethod(jshort,Short)1001WRAPPER_CallMethod(jchar,Char)1002WRAPPER_CallMethod(jint,Int)1003WRAPPER_CallMethod(jlong,Long)1004WRAPPER_CallMethod(jfloat,Float)1005WRAPPER_CallMethod(jdouble,Double)10061007JNI_ENTRY_CHECKED(void,1008checked_jni_CallVoidMethod(JNIEnv *env, \1009jobject obj, \1010jmethodID methodID, \1011...))1012functionEnter(thr);1013va_list args;1014IN_VM(1015jniCheck::validate_call_object(thr, obj, methodID);1016)1017va_start(args,methodID);1018UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);1019va_end(args);1020thr->set_pending_jni_exception_check("CallVoidMethod");1021functionExit(thr);1022JNI_END10231024JNI_ENTRY_CHECKED(void,1025checked_jni_CallVoidMethodV(JNIEnv *env,1026jobject obj,1027jmethodID methodID,1028va_list args))1029functionEnter(thr);1030IN_VM(1031jniCheck::validate_call_object(thr, obj, methodID);1032)1033UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);1034thr->set_pending_jni_exception_check("CallVoidMethodV");1035functionExit(thr);1036JNI_END10371038JNI_ENTRY_CHECKED(void,1039checked_jni_CallVoidMethodA(JNIEnv *env,1040jobject obj,1041jmethodID methodID,1042const jvalue * args))1043functionEnter(thr);1044IN_VM(1045jniCheck::validate_call_object(thr, obj, methodID);1046)1047UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);1048thr->set_pending_jni_exception_check("CallVoidMethodA");1049functionExit(thr);1050JNI_END10511052#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \1053JNI_ENTRY_CHECKED(ResultType, \1054checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \1055jobject obj, \1056jclass clazz, \1057jmethodID methodID, \1058...)) \1059functionEnter(thr); \1060va_list args; \1061IN_VM( \1062jniCheck::validate_call_object(thr, obj, methodID); \1063jniCheck::validate_call_class(thr, clazz, methodID); \1064) \1065va_start(args,methodID); \1066ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \1067obj, \1068clazz, \1069methodID,\1070args); \1071va_end(args); \1072thr->set_pending_jni_exception_check("CallNonvirtual"#Result"Method"); \1073functionExit(thr); \1074return result; \1075JNI_END \1076\1077JNI_ENTRY_CHECKED(ResultType, \1078checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \1079jobject obj, \1080jclass clazz, \1081jmethodID methodID, \1082va_list args)) \1083functionEnter(thr); \1084IN_VM( \1085jniCheck::validate_call_object(thr, obj, methodID); \1086jniCheck::validate_call_class(thr, clazz, methodID); \1087) \1088ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \1089obj, \1090clazz, \1091methodID,\1092args); \1093thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodV"); \1094functionExit(thr); \1095return result; \1096JNI_END \1097\1098JNI_ENTRY_CHECKED(ResultType, \1099checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \1100jobject obj, \1101jclass clazz, \1102jmethodID methodID, \1103const jvalue * args)) \1104functionEnter(thr); \1105IN_VM( \1106jniCheck::validate_call_object(thr, obj, methodID); \1107jniCheck::validate_call_class(thr, clazz, methodID); \1108) \1109ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \1110obj, \1111clazz, \1112methodID,\1113args); \1114thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodA"); \1115functionExit(thr); \1116return result; \1117JNI_END11181119WRAPPER_CallNonvirtualMethod(jobject,Object)1120WRAPPER_CallNonvirtualMethod(jboolean,Boolean)1121WRAPPER_CallNonvirtualMethod(jbyte,Byte)1122WRAPPER_CallNonvirtualMethod(jshort,Short)1123WRAPPER_CallNonvirtualMethod(jchar,Char)1124WRAPPER_CallNonvirtualMethod(jint,Int)1125WRAPPER_CallNonvirtualMethod(jlong,Long)1126WRAPPER_CallNonvirtualMethod(jfloat,Float)1127WRAPPER_CallNonvirtualMethod(jdouble,Double)11281129JNI_ENTRY_CHECKED(void,1130checked_jni_CallNonvirtualVoidMethod(JNIEnv *env,1131jobject obj,1132jclass clazz,1133jmethodID methodID,1134...))1135functionEnter(thr);1136va_list args;1137IN_VM(1138jniCheck::validate_call_object(thr, obj, methodID);1139jniCheck::validate_call_class(thr, clazz, methodID);1140)1141va_start(args,methodID);1142UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);1143va_end(args);1144thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");1145functionExit(thr);1146JNI_END11471148JNI_ENTRY_CHECKED(void,1149checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,1150jobject obj,1151jclass clazz,1152jmethodID methodID,1153va_list args))1154functionEnter(thr);1155IN_VM(1156jniCheck::validate_call_object(thr, obj, methodID);1157jniCheck::validate_call_class(thr, clazz, methodID);1158)1159UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);1160thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");1161functionExit(thr);1162JNI_END11631164JNI_ENTRY_CHECKED(void,1165checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,1166jobject obj,1167jclass clazz,1168jmethodID methodID,1169const jvalue * args))1170functionEnter(thr);1171IN_VM(1172jniCheck::validate_call_object(thr, obj, methodID);1173jniCheck::validate_call_class(thr, clazz, methodID);1174)1175UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);1176thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");1177functionExit(thr);1178JNI_END11791180JNI_ENTRY_CHECKED(jfieldID,1181checked_jni_GetFieldID(JNIEnv *env,1182jclass clazz,1183const char *name,1184const char *sig))1185functionEnter(thr);1186IN_VM(1187jniCheck::validate_class(thr, clazz, false);1188)1189jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);1190functionExit(thr);1191return result;1192JNI_END11931194#define WRAPPER_GetField(ReturnType,Result,FieldType) \1195JNI_ENTRY_CHECKED(ReturnType, \1196checked_jni_Get##Result##Field(JNIEnv *env, \1197jobject obj, \1198jfieldID fieldID)) \1199functionEnter(thr); \1200IN_VM( \1201checkInstanceFieldID(thr, fieldID, obj, FieldType); \1202) \1203ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \1204functionExit(thr); \1205return result; \1206JNI_END12071208WRAPPER_GetField(jobject, Object, T_OBJECT)1209WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)1210WRAPPER_GetField(jbyte, Byte, T_BYTE)1211WRAPPER_GetField(jshort, Short, T_SHORT)1212WRAPPER_GetField(jchar, Char, T_CHAR)1213WRAPPER_GetField(jint, Int, T_INT)1214WRAPPER_GetField(jlong, Long, T_LONG)1215WRAPPER_GetField(jfloat, Float, T_FLOAT)1216WRAPPER_GetField(jdouble, Double, T_DOUBLE)12171218#define WRAPPER_SetField(ValueType,Result,FieldType) \1219JNI_ENTRY_CHECKED(void, \1220checked_jni_Set##Result##Field(JNIEnv *env, \1221jobject obj, \1222jfieldID fieldID, \1223ValueType val)) \1224functionEnter(thr); \1225IN_VM( \1226checkInstanceFieldID(thr, fieldID, obj, FieldType); \1227) \1228UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \1229functionExit(thr); \1230JNI_END12311232WRAPPER_SetField(jobject, Object, T_OBJECT)1233WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)1234WRAPPER_SetField(jbyte, Byte, T_BYTE)1235WRAPPER_SetField(jshort, Short, T_SHORT)1236WRAPPER_SetField(jchar, Char, T_CHAR)1237WRAPPER_SetField(jint, Int, T_INT)1238WRAPPER_SetField(jlong, Long, T_LONG)1239WRAPPER_SetField(jfloat, Float, T_FLOAT)1240WRAPPER_SetField(jdouble, Double, T_DOUBLE)124112421243JNI_ENTRY_CHECKED(jmethodID,1244checked_jni_GetStaticMethodID(JNIEnv *env,1245jclass clazz,1246const char *name,1247const char *sig))1248functionEnter(thr);1249IN_VM(1250jniCheck::validate_class(thr, clazz, false);1251)1252jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);1253functionExit(thr);1254return result;1255JNI_END12561257#define WRAPPER_CallStaticMethod(ReturnType,Result) \1258JNI_ENTRY_CHECKED(ReturnType, \1259checked_jni_CallStatic##Result##Method(JNIEnv *env, \1260jclass clazz, \1261jmethodID methodID, \1262...)) \1263functionEnter(thr); \1264va_list args; \1265IN_VM( \1266jniCheck::validate_jmethod_id(thr, methodID); \1267jniCheck::validate_class(thr, clazz, false); \1268) \1269va_start(args,methodID); \1270ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \1271clazz, \1272methodID, \1273args); \1274va_end(args); \1275thr->set_pending_jni_exception_check("CallStatic"#Result"Method"); \1276functionExit(thr); \1277return result; \1278JNI_END \1279\1280JNI_ENTRY_CHECKED(ReturnType, \1281checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \1282jclass clazz, \1283jmethodID methodID,\1284va_list args)) \1285functionEnter(thr); \1286IN_VM( \1287jniCheck::validate_jmethod_id(thr, methodID); \1288jniCheck::validate_class(thr, clazz, false); \1289) \1290ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \1291clazz, \1292methodID, \1293args); \1294thr->set_pending_jni_exception_check("CallStatic"#Result"MethodV"); \1295functionExit(thr); \1296return result; \1297JNI_END \1298\1299JNI_ENTRY_CHECKED(ReturnType, \1300checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \1301jclass clazz, \1302jmethodID methodID, \1303const jvalue *args)) \1304functionEnter(thr); \1305IN_VM( \1306jniCheck::validate_jmethod_id(thr, methodID); \1307jniCheck::validate_class(thr, clazz, false); \1308) \1309ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \1310clazz, \1311methodID, \1312args); \1313thr->set_pending_jni_exception_check("CallStatic"#Result"MethodA"); \1314functionExit(thr); \1315return result; \1316JNI_END13171318WRAPPER_CallStaticMethod(jobject,Object)1319WRAPPER_CallStaticMethod(jboolean,Boolean)1320WRAPPER_CallStaticMethod(jbyte,Byte)1321WRAPPER_CallStaticMethod(jshort,Short)1322WRAPPER_CallStaticMethod(jchar,Char)1323WRAPPER_CallStaticMethod(jint,Int)1324WRAPPER_CallStaticMethod(jlong,Long)1325WRAPPER_CallStaticMethod(jfloat,Float)1326WRAPPER_CallStaticMethod(jdouble,Double)13271328JNI_ENTRY_CHECKED(void,1329checked_jni_CallStaticVoidMethod(JNIEnv *env,1330jclass cls,1331jmethodID methodID,1332...))1333functionEnter(thr);1334va_list args;1335IN_VM(1336jniCheck::validate_jmethod_id(thr, methodID);1337jniCheck::validate_class(thr, cls, false);1338)1339va_start(args,methodID);1340UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);1341va_end(args);1342thr->set_pending_jni_exception_check("CallStaticVoidMethod");1343functionExit(thr);1344JNI_END13451346JNI_ENTRY_CHECKED(void,1347checked_jni_CallStaticVoidMethodV(JNIEnv *env,1348jclass cls,1349jmethodID methodID,1350va_list args))1351functionEnter(thr);1352IN_VM(1353jniCheck::validate_jmethod_id(thr, methodID);1354jniCheck::validate_class(thr, cls, false);1355)1356UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);1357thr->set_pending_jni_exception_check("CallStaticVoidMethodV");1358functionExit(thr);1359JNI_END13601361JNI_ENTRY_CHECKED(void,1362checked_jni_CallStaticVoidMethodA(JNIEnv *env,1363jclass cls,1364jmethodID methodID,1365const jvalue * args))1366functionEnter(thr);1367IN_VM(1368jniCheck::validate_jmethod_id(thr, methodID);1369jniCheck::validate_class(thr, cls, false);1370)1371UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);1372thr->set_pending_jni_exception_check("CallStaticVoidMethodA");1373functionExit(thr);1374JNI_END13751376JNI_ENTRY_CHECKED(jfieldID,1377checked_jni_GetStaticFieldID(JNIEnv *env,1378jclass clazz,1379const char *name,1380const char *sig))1381functionEnter(thr);1382IN_VM(1383jniCheck::validate_class(thr, clazz, false);1384)1385jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);1386functionExit(thr);1387return result;1388JNI_END13891390#define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \1391JNI_ENTRY_CHECKED(ReturnType, \1392checked_jni_GetStatic##Result##Field(JNIEnv *env, \1393jclass clazz, \1394jfieldID fieldID)) \1395functionEnter(thr); \1396IN_VM( \1397jniCheck::validate_class(thr, clazz, false); \1398checkStaticFieldID(thr, fieldID, clazz, FieldType); \1399) \1400ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \1401clazz, \1402fieldID); \1403functionExit(thr); \1404return result; \1405JNI_END14061407WRAPPER_GetStaticField(jobject, Object, T_OBJECT)1408WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)1409WRAPPER_GetStaticField(jbyte, Byte, T_BYTE)1410WRAPPER_GetStaticField(jshort, Short, T_SHORT)1411WRAPPER_GetStaticField(jchar, Char, T_CHAR)1412WRAPPER_GetStaticField(jint, Int, T_INT)1413WRAPPER_GetStaticField(jlong, Long, T_LONG)1414WRAPPER_GetStaticField(jfloat, Float, T_FLOAT)1415WRAPPER_GetStaticField(jdouble, Double, T_DOUBLE)14161417#define WRAPPER_SetStaticField(ValueType,Result,FieldType) \1418JNI_ENTRY_CHECKED(void, \1419checked_jni_SetStatic##Result##Field(JNIEnv *env, \1420jclass clazz, \1421jfieldID fieldID, \1422ValueType value)) \1423functionEnter(thr); \1424IN_VM( \1425jniCheck::validate_class(thr, clazz, false); \1426checkStaticFieldID(thr, fieldID, clazz, FieldType); \1427) \1428UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \1429functionExit(thr); \1430JNI_END14311432WRAPPER_SetStaticField(jobject, Object, T_OBJECT)1433WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)1434WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)1435WRAPPER_SetStaticField(jshort, Short, T_SHORT)1436WRAPPER_SetStaticField(jchar, Char, T_CHAR)1437WRAPPER_SetStaticField(jint, Int, T_INT)1438WRAPPER_SetStaticField(jlong, Long, T_LONG)1439WRAPPER_SetStaticField(jfloat, Float, T_FLOAT)1440WRAPPER_SetStaticField(jdouble, Double, T_DOUBLE)144114421443JNI_ENTRY_CHECKED(jstring,1444checked_jni_NewString(JNIEnv *env,1445const jchar *unicode,1446jsize len))1447functionEnter(thr);1448jstring result = UNCHECKED()->NewString(env,unicode,len);1449functionExit(thr);1450return result;1451JNI_END14521453JNI_ENTRY_CHECKED(jsize,1454checked_jni_GetStringLength(JNIEnv *env,1455jstring str))1456functionEnter(thr);1457IN_VM(1458checkString(thr, str);1459)1460jsize result = UNCHECKED()->GetStringLength(env,str);1461functionExit(thr);1462return result;1463JNI_END14641465// Arbitrary (but well-known) tag1466const void* STRING_TAG = (void*)0x47114711;14671468JNI_ENTRY_CHECKED(const jchar *,1469checked_jni_GetStringChars(JNIEnv *env,1470jstring str,1471jboolean *isCopy))1472functionEnter(thr);1473IN_VM(1474checkString(thr, str);1475)1476jchar* new_result = NULL;1477const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);1478assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");1479if (result != NULL) {1480size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination1481len *= sizeof(jchar);1482new_result = (jchar*) GuardedMemory::wrap_copy(result, len, STRING_TAG);1483if (new_result == NULL) {1484vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringChars");1485}1486// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes1487// Note that the dtrace arguments for the allocated memory will not match up with this solution.1488FreeHeap((char*)result);1489}1490functionExit(thr);1491return new_result;1492JNI_END14931494JNI_ENTRY_CHECKED(void,1495checked_jni_ReleaseStringChars(JNIEnv *env,1496jstring str,1497const jchar *chars))1498functionEnterExceptionAllowed(thr);1499IN_VM(1500checkString(thr, str);1501)1502if (chars == NULL) {1503// still do the unchecked call to allow dtrace probes1504UNCHECKED()->ReleaseStringChars(env,str,chars);1505}1506else {1507GuardedMemory guarded((void*)chars);1508if (!guarded.verify_guards()) {1509tty->print_cr("ReleaseStringChars: release chars failed bounds check. "1510"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));1511guarded.print_on(tty);1512NativeReportJNIFatalError(thr, "ReleaseStringChars: "1513"release chars failed bounds check.");1514}1515if (guarded.get_tag() != STRING_TAG) {1516tty->print_cr("ReleaseStringChars: called on something not allocated "1517"by GetStringChars. string: " PTR_FORMAT " chars: " PTR_FORMAT,1518p2i(str), p2i(chars));1519NativeReportJNIFatalError(thr, "ReleaseStringChars called on something "1520"not allocated by GetStringChars");1521}1522UNCHECKED()->ReleaseStringChars(env, str,1523(const jchar*) guarded.release_for_freeing());1524}1525functionExit(thr);1526JNI_END15271528JNI_ENTRY_CHECKED(jstring,1529checked_jni_NewStringUTF(JNIEnv *env,1530const char *utf))1531functionEnter(thr);1532jstring result = UNCHECKED()->NewStringUTF(env,utf);1533functionExit(thr);1534return result;1535JNI_END15361537JNI_ENTRY_CHECKED(jsize,1538checked_jni_GetStringUTFLength(JNIEnv *env,1539jstring str))1540functionEnter(thr);1541IN_VM(1542checkString(thr, str);1543)1544jsize result = UNCHECKED()->GetStringUTFLength(env,str);1545functionExit(thr);1546return result;1547JNI_END15481549// Arbitrary (but well-known) tag - different than GetStringChars1550const void* STRING_UTF_TAG = (void*) 0x48124812;15511552JNI_ENTRY_CHECKED(const char *,1553checked_jni_GetStringUTFChars(JNIEnv *env,1554jstring str,1555jboolean *isCopy))1556functionEnter(thr);1557IN_VM(1558checkString(thr, str);1559)1560char* new_result = NULL;1561const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);1562assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");1563if (result != NULL) {1564size_t len = strlen(result) + 1; // + 1 for NULL termination1565new_result = (char*) GuardedMemory::wrap_copy(result, len, STRING_UTF_TAG);1566if (new_result == NULL) {1567vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringUTFChars");1568}1569// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes1570// Note that the dtrace arguments for the allocated memory will not match up with this solution.1571FreeHeap((char*)result, mtInternal);1572}1573functionExit(thr);1574return new_result;1575JNI_END15761577JNI_ENTRY_CHECKED(void,1578checked_jni_ReleaseStringUTFChars(JNIEnv *env,1579jstring str,1580const char* chars))1581functionEnterExceptionAllowed(thr);1582IN_VM(1583checkString(thr, str);1584)1585if (chars == NULL) {1586// still do the unchecked call to allow dtrace probes1587UNCHECKED()->ReleaseStringUTFChars(env,str,chars);1588}1589else {1590GuardedMemory guarded((void*)chars);1591if (!guarded.verify_guards()) {1592tty->print_cr("ReleaseStringUTFChars: release chars failed bounds check. "1593"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));1594guarded.print_on(tty);1595NativeReportJNIFatalError(thr, "ReleaseStringUTFChars: "1596"release chars failed bounds check.");1597}1598if (guarded.get_tag() != STRING_UTF_TAG) {1599tty->print_cr("ReleaseStringUTFChars: called on something not "1600"allocated by GetStringUTFChars. string: " PTR_FORMAT " chars: "1601PTR_FORMAT, p2i(str), p2i(chars));1602NativeReportJNIFatalError(thr, "ReleaseStringUTFChars "1603"called on something not allocated by GetStringUTFChars");1604}1605UNCHECKED()->ReleaseStringUTFChars(env, str,1606(const char*) guarded.release_for_freeing());1607}1608functionExit(thr);1609JNI_END16101611JNI_ENTRY_CHECKED(jsize,1612checked_jni_GetArrayLength(JNIEnv *env,1613jarray array))1614functionEnter(thr);1615IN_VM(1616check_is_array(thr, array);1617)1618jsize result = UNCHECKED()->GetArrayLength(env,array);1619functionExit(thr);1620return result;1621JNI_END16221623JNI_ENTRY_CHECKED(jobjectArray,1624checked_jni_NewObjectArray(JNIEnv *env,1625jsize len,1626jclass clazz,1627jobject init))1628functionEnter(thr);1629jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);1630functionExit(thr);1631return result;1632JNI_END16331634JNI_ENTRY_CHECKED(jobject,1635checked_jni_GetObjectArrayElement(JNIEnv *env,1636jobjectArray array,1637jsize index))1638functionEnter(thr);1639IN_VM(1640check_is_obj_array(thr, array);1641)1642jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);1643functionExit(thr);1644return result;1645JNI_END16461647JNI_ENTRY_CHECKED(void,1648checked_jni_SetObjectArrayElement(JNIEnv *env,1649jobjectArray array,1650jsize index,1651jobject val))1652functionEnter(thr);1653IN_VM(1654check_is_obj_array(thr, array);1655)1656UNCHECKED()->SetObjectArrayElement(env,array,index,val);1657functionExit(thr);1658JNI_END16591660#define WRAPPER_NewScalarArray(Return, Result) \1661JNI_ENTRY_CHECKED(Return, \1662checked_jni_New##Result##Array(JNIEnv *env, \1663jsize len)) \1664functionEnter(thr); \1665Return result = UNCHECKED()->New##Result##Array(env,len); \1666functionExit(thr); \1667return (Return) result; \1668JNI_END16691670WRAPPER_NewScalarArray(jbooleanArray, Boolean)1671WRAPPER_NewScalarArray(jbyteArray, Byte)1672WRAPPER_NewScalarArray(jshortArray, Short)1673WRAPPER_NewScalarArray(jcharArray, Char)1674WRAPPER_NewScalarArray(jintArray, Int)1675WRAPPER_NewScalarArray(jlongArray, Long)1676WRAPPER_NewScalarArray(jfloatArray, Float)1677WRAPPER_NewScalarArray(jdoubleArray, Double)16781679#define WRAPPER_GetScalarArrayElements(ElementTag,ElementType,Result) \1680JNI_ENTRY_CHECKED(ElementType *, \1681checked_jni_Get##Result##ArrayElements(JNIEnv *env, \1682ElementType##Array array, \1683jboolean *isCopy)) \1684functionEnter(thr); \1685IN_VM( \1686check_primitive_array_type(thr, array, ElementTag); \1687) \1688ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \1689array, \1690isCopy); \1691if (result != NULL) { \1692result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \1693} \1694functionExit(thr); \1695return result; \1696JNI_END16971698WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)1699WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)1700WRAPPER_GetScalarArrayElements(T_SHORT, jshort, Short)1701WRAPPER_GetScalarArrayElements(T_CHAR, jchar, Char)1702WRAPPER_GetScalarArrayElements(T_INT, jint, Int)1703WRAPPER_GetScalarArrayElements(T_LONG, jlong, Long)1704WRAPPER_GetScalarArrayElements(T_FLOAT, jfloat, Float)1705WRAPPER_GetScalarArrayElements(T_DOUBLE, jdouble, Double)17061707#define WRAPPER_ReleaseScalarArrayElements(ElementTag,ElementType,Result,Tag) \1708JNI_ENTRY_CHECKED(void, \1709checked_jni_Release##Result##ArrayElements(JNIEnv *env, \1710ElementType##Array array, \1711ElementType *elems, \1712jint mode)) \1713functionEnterExceptionAllowed(thr); \1714IN_VM( \1715check_primitive_array_type(thr, array, ElementTag); \1716ASSERT_OOPS_ALLOWED; \1717typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \1718) \1719ElementType* orig_result = (ElementType *) check_wrapped_array_release( \1720thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode); \1721UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \1722functionExit(thr); \1723JNI_END17241725WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)1726WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)1727WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)1728WRAPPER_ReleaseScalarArrayElements(T_CHAR, jchar, Char, char)1729WRAPPER_ReleaseScalarArrayElements(T_INT, jint, Int, int)1730WRAPPER_ReleaseScalarArrayElements(T_LONG, jlong, Long, long)1731WRAPPER_ReleaseScalarArrayElements(T_FLOAT, jfloat, Float, float)1732WRAPPER_ReleaseScalarArrayElements(T_DOUBLE, jdouble, Double, double)17331734#define WRAPPER_GetScalarArrayRegion(ElementTag,ElementType,Result) \1735JNI_ENTRY_CHECKED(void, \1736checked_jni_Get##Result##ArrayRegion(JNIEnv *env, \1737ElementType##Array array, \1738jsize start, \1739jsize len, \1740ElementType *buf)) \1741functionEnter(thr); \1742IN_VM( \1743check_primitive_array_type(thr, array, ElementTag); \1744) \1745UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \1746functionExit(thr); \1747JNI_END17481749WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)1750WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)1751WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)1752WRAPPER_GetScalarArrayRegion(T_CHAR, jchar, Char)1753WRAPPER_GetScalarArrayRegion(T_INT, jint, Int)1754WRAPPER_GetScalarArrayRegion(T_LONG, jlong, Long)1755WRAPPER_GetScalarArrayRegion(T_FLOAT, jfloat, Float)1756WRAPPER_GetScalarArrayRegion(T_DOUBLE, jdouble, Double)17571758#define WRAPPER_SetScalarArrayRegion(ElementTag,ElementType,Result) \1759JNI_ENTRY_CHECKED(void, \1760checked_jni_Set##Result##ArrayRegion(JNIEnv *env, \1761ElementType##Array array, \1762jsize start, \1763jsize len, \1764const ElementType *buf)) \1765functionEnter(thr); \1766IN_VM( \1767check_primitive_array_type(thr, array, ElementTag); \1768) \1769UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \1770functionExit(thr); \1771JNI_END17721773WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)1774WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)1775WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)1776WRAPPER_SetScalarArrayRegion(T_CHAR, jchar, Char)1777WRAPPER_SetScalarArrayRegion(T_INT, jint, Int)1778WRAPPER_SetScalarArrayRegion(T_LONG, jlong, Long)1779WRAPPER_SetScalarArrayRegion(T_FLOAT, jfloat, Float)1780WRAPPER_SetScalarArrayRegion(T_DOUBLE, jdouble, Double)17811782JNI_ENTRY_CHECKED(jint,1783checked_jni_RegisterNatives(JNIEnv *env,1784jclass clazz,1785const JNINativeMethod *methods,1786jint nMethods))1787functionEnter(thr);1788jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);1789functionExit(thr);1790return result;1791JNI_END17921793JNI_ENTRY_CHECKED(jint,1794checked_jni_UnregisterNatives(JNIEnv *env,1795jclass clazz))1796functionEnter(thr);1797jint result = UNCHECKED()->UnregisterNatives(env,clazz);1798functionExit(thr);1799return result;1800JNI_END18011802JNI_ENTRY_CHECKED(jint,1803checked_jni_MonitorEnter(JNIEnv *env,1804jobject obj))1805functionEnter(thr);1806IN_VM(1807jniCheck::validate_object(thr, obj);1808)1809jint result = UNCHECKED()->MonitorEnter(env,obj);1810functionExit(thr);1811return result;1812JNI_END18131814JNI_ENTRY_CHECKED(jint,1815checked_jni_MonitorExit(JNIEnv *env,1816jobject obj))1817functionEnterExceptionAllowed(thr);1818IN_VM(1819jniCheck::validate_object(thr, obj);1820)1821jint result = UNCHECKED()->MonitorExit(env,obj);1822functionExit(thr);1823return result;1824JNI_END18251826JNI_ENTRY_CHECKED(jint,1827checked_jni_GetJavaVM(JNIEnv *env,1828JavaVM **vm))1829functionEnter(thr);1830jint result = UNCHECKED()->GetJavaVM(env,vm);1831functionExit(thr);1832return result;1833JNI_END18341835JNI_ENTRY_CHECKED(void,1836checked_jni_GetStringRegion(JNIEnv *env,1837jstring str,1838jsize start,1839jsize len,1840jchar *buf))1841functionEnter(thr);1842IN_VM(1843checkString(thr, str);1844)1845UNCHECKED()->GetStringRegion(env, str, start, len, buf);1846functionExit(thr);1847JNI_END18481849JNI_ENTRY_CHECKED(void,1850checked_jni_GetStringUTFRegion(JNIEnv *env,1851jstring str,1852jsize start,1853jsize len,1854char *buf))1855functionEnter(thr);1856IN_VM(1857checkString(thr, str);1858)1859UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);1860functionExit(thr);1861JNI_END18621863JNI_ENTRY_CHECKED(void *,1864checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,1865jarray array,1866jboolean *isCopy))1867functionEnterCritical(thr);1868IN_VM(1869check_is_primitive_array(thr, array);1870)1871void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);1872if (result != NULL) {1873result = check_jni_wrap_copy_array(thr, array, result);1874}1875functionExit(thr);1876return result;1877JNI_END18781879JNI_ENTRY_CHECKED(void,1880checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,1881jarray array,1882void *carray,1883jint mode))1884functionEnterCriticalExceptionAllowed(thr);1885IN_VM(1886check_is_primitive_array(thr, array);1887)1888// Check the element array...1889void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical", array, carray, mode);1890UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);1891functionExit(thr);1892JNI_END18931894JNI_ENTRY_CHECKED(const jchar*,1895checked_jni_GetStringCritical(JNIEnv *env,1896jstring string,1897jboolean *isCopy))1898functionEnterCritical(thr);1899IN_VM(1900checkString(thr, string);1901)1902const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);1903functionExit(thr);1904return result;1905JNI_END19061907JNI_ENTRY_CHECKED(void,1908checked_jni_ReleaseStringCritical(JNIEnv *env,1909jstring str,1910const jchar *chars))1911functionEnterCriticalExceptionAllowed(thr);1912IN_VM(1913checkString(thr, str);1914)1915/* The Hotspot JNI code does not use the parameters, so just check the1916* string parameter as a minor sanity check1917*/1918UNCHECKED()->ReleaseStringCritical(env, str, chars);1919functionExit(thr);1920JNI_END19211922JNI_ENTRY_CHECKED(jweak,1923checked_jni_NewWeakGlobalRef(JNIEnv *env,1924jobject obj))1925functionEnter(thr);1926IN_VM(1927if (obj != NULL) {1928jniCheck::validate_handle(thr, obj);1929}1930)1931jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);1932functionExit(thr);1933return result;1934JNI_END19351936JNI_ENTRY_CHECKED(void,1937checked_jni_DeleteWeakGlobalRef(JNIEnv *env,1938jweak ref))1939functionEnterExceptionAllowed(thr);1940UNCHECKED()->DeleteWeakGlobalRef(env, ref);1941functionExit(thr);1942JNI_END19431944JNI_ENTRY_CHECKED(jboolean,1945checked_jni_ExceptionCheck(JNIEnv *env))1946thr->clear_pending_jni_exception_check();1947functionEnterExceptionAllowed(thr);1948jboolean result = UNCHECKED()->ExceptionCheck(env);1949functionExit(thr);1950return result;1951JNI_END19521953JNI_ENTRY_CHECKED(jobject,1954checked_jni_NewDirectByteBuffer(JNIEnv *env,1955void *address,1956jlong capacity))1957functionEnter(thr);1958jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);1959functionExit(thr);1960return result;1961JNI_END19621963JNI_ENTRY_CHECKED(void *,1964checked_jni_GetDirectBufferAddress(JNIEnv *env,1965jobject buf))1966functionEnter(thr);1967void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);1968functionExit(thr);1969return result;1970JNI_END19711972JNI_ENTRY_CHECKED(jlong,1973checked_jni_GetDirectBufferCapacity(JNIEnv *env,1974jobject buf))1975functionEnter(thr);1976jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);1977functionExit(thr);1978return result;1979JNI_END19801981JNI_ENTRY_CHECKED(jobjectRefType,1982checked_jni_GetObjectRefType(JNIEnv *env,1983jobject obj))1984functionEnter(thr);1985/* validate the object being passed */1986IN_VM(1987jniCheck::validate_object(thr, obj);1988)1989jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);1990functionExit(thr);1991return result;1992JNI_END199319941995JNI_ENTRY_CHECKED(jint,1996checked_jni_GetVersion(JNIEnv *env))1997functionEnter(thr);1998jint result = UNCHECKED()->GetVersion(env);1999functionExit(thr);2000return result;2001JNI_END2002200320042005/*2006* Structure containing all checked jni functions2007*/2008struct JNINativeInterface_ checked_jni_NativeInterface = {2009NULL,2010NULL,2011NULL,20122013NULL,20142015checked_jni_GetVersion,20162017checked_jni_DefineClass,2018checked_jni_FindClass,20192020checked_jni_FromReflectedMethod,2021checked_jni_FromReflectedField,20222023checked_jni_ToReflectedMethod,20242025checked_jni_GetSuperclass,2026checked_jni_IsAssignableFrom,20272028checked_jni_ToReflectedField,20292030checked_jni_Throw,2031checked_jni_ThrowNew,2032checked_jni_ExceptionOccurred,2033checked_jni_ExceptionDescribe,2034checked_jni_ExceptionClear,2035checked_jni_FatalError,20362037checked_jni_PushLocalFrame,2038checked_jni_PopLocalFrame,20392040checked_jni_NewGlobalRef,2041checked_jni_DeleteGlobalRef,2042checked_jni_DeleteLocalRef,2043checked_jni_IsSameObject,20442045checked_jni_NewLocalRef,2046checked_jni_EnsureLocalCapacity,20472048checked_jni_AllocObject,2049checked_jni_NewObject,2050checked_jni_NewObjectV,2051checked_jni_NewObjectA,20522053checked_jni_GetObjectClass,2054checked_jni_IsInstanceOf,20552056checked_jni_GetMethodID,20572058checked_jni_CallObjectMethod,2059checked_jni_CallObjectMethodV,2060checked_jni_CallObjectMethodA,2061checked_jni_CallBooleanMethod,2062checked_jni_CallBooleanMethodV,2063checked_jni_CallBooleanMethodA,2064checked_jni_CallByteMethod,2065checked_jni_CallByteMethodV,2066checked_jni_CallByteMethodA,2067checked_jni_CallCharMethod,2068checked_jni_CallCharMethodV,2069checked_jni_CallCharMethodA,2070checked_jni_CallShortMethod,2071checked_jni_CallShortMethodV,2072checked_jni_CallShortMethodA,2073checked_jni_CallIntMethod,2074checked_jni_CallIntMethodV,2075checked_jni_CallIntMethodA,2076checked_jni_CallLongMethod,2077checked_jni_CallLongMethodV,2078checked_jni_CallLongMethodA,2079checked_jni_CallFloatMethod,2080checked_jni_CallFloatMethodV,2081checked_jni_CallFloatMethodA,2082checked_jni_CallDoubleMethod,2083checked_jni_CallDoubleMethodV,2084checked_jni_CallDoubleMethodA,2085checked_jni_CallVoidMethod,2086checked_jni_CallVoidMethodV,2087checked_jni_CallVoidMethodA,20882089checked_jni_CallNonvirtualObjectMethod,2090checked_jni_CallNonvirtualObjectMethodV,2091checked_jni_CallNonvirtualObjectMethodA,2092checked_jni_CallNonvirtualBooleanMethod,2093checked_jni_CallNonvirtualBooleanMethodV,2094checked_jni_CallNonvirtualBooleanMethodA,2095checked_jni_CallNonvirtualByteMethod,2096checked_jni_CallNonvirtualByteMethodV,2097checked_jni_CallNonvirtualByteMethodA,2098checked_jni_CallNonvirtualCharMethod,2099checked_jni_CallNonvirtualCharMethodV,2100checked_jni_CallNonvirtualCharMethodA,2101checked_jni_CallNonvirtualShortMethod,2102checked_jni_CallNonvirtualShortMethodV,2103checked_jni_CallNonvirtualShortMethodA,2104checked_jni_CallNonvirtualIntMethod,2105checked_jni_CallNonvirtualIntMethodV,2106checked_jni_CallNonvirtualIntMethodA,2107checked_jni_CallNonvirtualLongMethod,2108checked_jni_CallNonvirtualLongMethodV,2109checked_jni_CallNonvirtualLongMethodA,2110checked_jni_CallNonvirtualFloatMethod,2111checked_jni_CallNonvirtualFloatMethodV,2112checked_jni_CallNonvirtualFloatMethodA,2113checked_jni_CallNonvirtualDoubleMethod,2114checked_jni_CallNonvirtualDoubleMethodV,2115checked_jni_CallNonvirtualDoubleMethodA,2116checked_jni_CallNonvirtualVoidMethod,2117checked_jni_CallNonvirtualVoidMethodV,2118checked_jni_CallNonvirtualVoidMethodA,21192120checked_jni_GetFieldID,21212122checked_jni_GetObjectField,2123checked_jni_GetBooleanField,2124checked_jni_GetByteField,2125checked_jni_GetCharField,2126checked_jni_GetShortField,2127checked_jni_GetIntField,2128checked_jni_GetLongField,2129checked_jni_GetFloatField,2130checked_jni_GetDoubleField,21312132checked_jni_SetObjectField,2133checked_jni_SetBooleanField,2134checked_jni_SetByteField,2135checked_jni_SetCharField,2136checked_jni_SetShortField,2137checked_jni_SetIntField,2138checked_jni_SetLongField,2139checked_jni_SetFloatField,2140checked_jni_SetDoubleField,21412142checked_jni_GetStaticMethodID,21432144checked_jni_CallStaticObjectMethod,2145checked_jni_CallStaticObjectMethodV,2146checked_jni_CallStaticObjectMethodA,2147checked_jni_CallStaticBooleanMethod,2148checked_jni_CallStaticBooleanMethodV,2149checked_jni_CallStaticBooleanMethodA,2150checked_jni_CallStaticByteMethod,2151checked_jni_CallStaticByteMethodV,2152checked_jni_CallStaticByteMethodA,2153checked_jni_CallStaticCharMethod,2154checked_jni_CallStaticCharMethodV,2155checked_jni_CallStaticCharMethodA,2156checked_jni_CallStaticShortMethod,2157checked_jni_CallStaticShortMethodV,2158checked_jni_CallStaticShortMethodA,2159checked_jni_CallStaticIntMethod,2160checked_jni_CallStaticIntMethodV,2161checked_jni_CallStaticIntMethodA,2162checked_jni_CallStaticLongMethod,2163checked_jni_CallStaticLongMethodV,2164checked_jni_CallStaticLongMethodA,2165checked_jni_CallStaticFloatMethod,2166checked_jni_CallStaticFloatMethodV,2167checked_jni_CallStaticFloatMethodA,2168checked_jni_CallStaticDoubleMethod,2169checked_jni_CallStaticDoubleMethodV,2170checked_jni_CallStaticDoubleMethodA,2171checked_jni_CallStaticVoidMethod,2172checked_jni_CallStaticVoidMethodV,2173checked_jni_CallStaticVoidMethodA,21742175checked_jni_GetStaticFieldID,21762177checked_jni_GetStaticObjectField,2178checked_jni_GetStaticBooleanField,2179checked_jni_GetStaticByteField,2180checked_jni_GetStaticCharField,2181checked_jni_GetStaticShortField,2182checked_jni_GetStaticIntField,2183checked_jni_GetStaticLongField,2184checked_jni_GetStaticFloatField,2185checked_jni_GetStaticDoubleField,21862187checked_jni_SetStaticObjectField,2188checked_jni_SetStaticBooleanField,2189checked_jni_SetStaticByteField,2190checked_jni_SetStaticCharField,2191checked_jni_SetStaticShortField,2192checked_jni_SetStaticIntField,2193checked_jni_SetStaticLongField,2194checked_jni_SetStaticFloatField,2195checked_jni_SetStaticDoubleField,21962197checked_jni_NewString,2198checked_jni_GetStringLength,2199checked_jni_GetStringChars,2200checked_jni_ReleaseStringChars,22012202checked_jni_NewStringUTF,2203checked_jni_GetStringUTFLength,2204checked_jni_GetStringUTFChars,2205checked_jni_ReleaseStringUTFChars,22062207checked_jni_GetArrayLength,22082209checked_jni_NewObjectArray,2210checked_jni_GetObjectArrayElement,2211checked_jni_SetObjectArrayElement,22122213checked_jni_NewBooleanArray,2214checked_jni_NewByteArray,2215checked_jni_NewCharArray,2216checked_jni_NewShortArray,2217checked_jni_NewIntArray,2218checked_jni_NewLongArray,2219checked_jni_NewFloatArray,2220checked_jni_NewDoubleArray,22212222checked_jni_GetBooleanArrayElements,2223checked_jni_GetByteArrayElements,2224checked_jni_GetCharArrayElements,2225checked_jni_GetShortArrayElements,2226checked_jni_GetIntArrayElements,2227checked_jni_GetLongArrayElements,2228checked_jni_GetFloatArrayElements,2229checked_jni_GetDoubleArrayElements,22302231checked_jni_ReleaseBooleanArrayElements,2232checked_jni_ReleaseByteArrayElements,2233checked_jni_ReleaseCharArrayElements,2234checked_jni_ReleaseShortArrayElements,2235checked_jni_ReleaseIntArrayElements,2236checked_jni_ReleaseLongArrayElements,2237checked_jni_ReleaseFloatArrayElements,2238checked_jni_ReleaseDoubleArrayElements,22392240checked_jni_GetBooleanArrayRegion,2241checked_jni_GetByteArrayRegion,2242checked_jni_GetCharArrayRegion,2243checked_jni_GetShortArrayRegion,2244checked_jni_GetIntArrayRegion,2245checked_jni_GetLongArrayRegion,2246checked_jni_GetFloatArrayRegion,2247checked_jni_GetDoubleArrayRegion,22482249checked_jni_SetBooleanArrayRegion,2250checked_jni_SetByteArrayRegion,2251checked_jni_SetCharArrayRegion,2252checked_jni_SetShortArrayRegion,2253checked_jni_SetIntArrayRegion,2254checked_jni_SetLongArrayRegion,2255checked_jni_SetFloatArrayRegion,2256checked_jni_SetDoubleArrayRegion,22572258checked_jni_RegisterNatives,2259checked_jni_UnregisterNatives,22602261checked_jni_MonitorEnter,2262checked_jni_MonitorExit,22632264checked_jni_GetJavaVM,22652266checked_jni_GetStringRegion,2267checked_jni_GetStringUTFRegion,22682269checked_jni_GetPrimitiveArrayCritical,2270checked_jni_ReleasePrimitiveArrayCritical,22712272checked_jni_GetStringCritical,2273checked_jni_ReleaseStringCritical,22742275checked_jni_NewWeakGlobalRef,2276checked_jni_DeleteWeakGlobalRef,22772278checked_jni_ExceptionCheck,22792280checked_jni_NewDirectByteBuffer,2281checked_jni_GetDirectBufferAddress,2282checked_jni_GetDirectBufferCapacity,22832284// New 1.6 Features22852286checked_jni_GetObjectRefType2287};228822892290// Returns the function structure2291struct JNINativeInterface_* jni_functions_check() {22922293unchecked_jni_NativeInterface = jni_functions_nocheck();22942295// make sure the last pointer in the checked table is not null, indicating2296// an addition to the JNINativeInterface_ structure without initializing2297// it in the checked table.2298debug_only(int *lastPtr = (int *)((char *)&checked_jni_NativeInterface + \2299sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));)2300assert(*lastPtr != 0,2301"Mismatched JNINativeInterface tables, check for new entries");23022303// with -verbose:jni this message will print2304if (PrintJNIResolving) {2305tty->print_cr("Checked JNI functions are being used to " \2306"validate JNI usage");2307}23082309return &checked_jni_NativeInterface;2310}231123122313