Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/prims/jniCheck.cpp
32285 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_aarch3243# include "jniTypes_aarch32.hpp"44#endif45#ifdef TARGET_ARCH_aarch6446# include "jniTypes_aarch64.hpp"47#endif48#ifdef TARGET_ARCH_sparc49# include "jniTypes_sparc.hpp"50#endif51#ifdef TARGET_ARCH_zero52# include "jniTypes_zero.hpp"53#endif54#ifdef TARGET_ARCH_arm55# include "jniTypes_arm.hpp"56#endif57#ifdef TARGET_ARCH_ppc58# include "jniTypes_ppc.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} \118MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thr)); \119VM_ENTRY_BASE(result_type, header, thr)120121122#define UNCHECKED() (unchecked_jni_NativeInterface)123124static const char * warn_wrong_jnienv = "Using JNIEnv in the wrong thread";125static const char * warn_bad_class_descriptor = "JNI FindClass received a bad class descriptor \"%s\". A correct class descriptor " \126"has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases.";127static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread";128static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \129"Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical";130static const char * fatal_bad_ref_to_jni = "Bad global or local ref passed to JNI";131static const char * fatal_received_null_class = "JNI received a null class";132static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";133static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass";134static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";135static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call";136static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";137static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";138static const char * fatal_prim_type_array_expected = "Primitive type array expected but not received for JNI array operation";139static const char * fatal_non_array = "Non-array passed to JNI array operations";140static const char * fatal_element_type_mismatch = "Array element type mismatch in JNI";141static const char * fatal_should_be_static = "Non-static field ID passed to JNI";142static const char * fatal_wrong_static_field = "Wrong static field ID passed to JNI";143static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations";144static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations";145static const char * fatal_should_be_nonstatic = "Static field ID passed to JNI";146static const char * fatal_null_object = "Null object passed to JNI";147static const char * fatal_wrong_field = "Wrong field ID passed to JNI";148static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations";149static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations";150static const char * fatal_non_string = "JNI string operation received a non-string";151152153// When in VM state:154static void ReportJNIWarning(JavaThread* thr, const char *msg) {155tty->print_cr("WARNING in native method: %s", msg);156thr->print_stack();157}158159// When in NATIVE state:160static void NativeReportJNIFatalError(JavaThread* thr, const char *msg) {161IN_VM(162ReportJNIFatalError(thr, msg);163)164}165166static void NativeReportJNIWarning(JavaThread* thr, const char *msg) {167IN_VM(168ReportJNIWarning(thr, msg);169)170}171172173174175/*176* SUPPORT FUNCTIONS177*/178179/**180* Check whether or not a programmer has actually checked for exceptions. According181* to the JNI Specification ("jni/spec/design.html#java_exceptions"):182*183* There are two cases where the programmer needs to check for exceptions without184* being able to first check an error code:185*186* - The JNI functions that invoke a Java method return the result of the Java method.187* The programmer must call ExceptionOccurred() to check for possible exceptions188* that occurred during the execution of the Java method.189*190* - Some of the JNI array access functions do not return an error code, but may191* throw an ArrayIndexOutOfBoundsException or ArrayStoreException.192*193* In all other cases, a non-error return value guarantees that no exceptions have been thrown.194*195* Programmers often defend against ArrayIndexOutOfBoundsException, so warning196* for these functions would be pedantic.197*/198static inline void199check_pending_exception(JavaThread* thr) {200if (thr->has_pending_exception()) {201NativeReportJNIWarning(thr, "JNI call made with exception pending");202}203if (thr->is_pending_jni_exception_check()) {204IN_VM(205tty->print_cr("WARNING in native method: JNI call made without checking exceptions when required to from %s",206thr->get_pending_jni_exception_check());207thr->print_stack();208)209thr->clear_pending_jni_exception_check(); // Just complain once210}211}212213/**214* Add to the planned number of handles. I.e. plus current live & warning threshold215*/216static inline void217add_planned_handle_capacity(JNIHandleBlock* handles, size_t capacity) {218handles->set_planned_capacity(capacity +219handles->get_number_of_live_handles() +220CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);221}222223224static inline void225functionEnterCritical(JavaThread* thr)226{227check_pending_exception(thr);228}229230static inline void231functionEnterCriticalExceptionAllowed(JavaThread* thr)232{233}234235static inline void236functionEnter(JavaThread* thr)237{238if (thr->in_critical()) {239tty->print_cr("%s", warn_other_function_in_critical);240}241check_pending_exception(thr);242}243244static inline void245functionEnterExceptionAllowed(JavaThread* thr)246{247if (thr->in_critical()) {248tty->print_cr("%s", warn_other_function_in_critical);249}250}251252static inline void253functionExit(JavaThread* thr)254{255JNIHandleBlock* handles = thr->active_handles();256size_t planned_capacity = handles->get_planned_capacity();257size_t live_handles = handles->get_number_of_live_handles();258if (live_handles > planned_capacity) {259IN_VM(260tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu",261live_handles, planned_capacity);262thr->print_stack();263)264// Complain just the once, reset to current + warn threshold265add_planned_handle_capacity(handles, 0);266}267}268269static inline void270checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)271{272fieldDescriptor fd;273274/* make sure it is a static field */275if (!jfieldIDWorkaround::is_static_jfieldID(fid))276ReportJNIFatalError(thr, fatal_should_be_static);277278/* validate the class being passed */279ASSERT_OOPS_ALLOWED;280Klass* k_oop = jniCheck::validate_class(thr, cls, false);281282/* check for proper subclass hierarchy */283JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);284Klass* f_oop = id->holder();285if (!InstanceKlass::cast(k_oop)->is_subtype_of(f_oop))286ReportJNIFatalError(thr, fatal_wrong_static_field);287288/* check for proper field type */289if (!id->find_local_field(&fd))290ReportJNIFatalError(thr, fatal_static_field_not_found);291if ((fd.field_type() != ftype) &&292!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {293ReportJNIFatalError(thr, fatal_static_field_mismatch);294}295}296297static inline void298checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)299{300fieldDescriptor fd;301302/* make sure it is an instance field */303if (jfieldIDWorkaround::is_static_jfieldID(fid))304ReportJNIFatalError(thr, fatal_should_be_nonstatic);305306/* validate the object being passed and then get its class */307ASSERT_OOPS_ALLOWED;308oop oopObj = jniCheck::validate_object(thr, obj);309if (!oopObj) {310ReportJNIFatalError(thr, fatal_null_object);311}312Klass* k_oop = oopObj->klass();313314if (!jfieldIDWorkaround::is_valid_jfieldID(k_oop, fid)) {315ReportJNIFatalError(thr, fatal_wrong_field);316}317318/* make sure the field exists */319int offset = jfieldIDWorkaround::from_instance_jfieldID(k_oop, fid);320if (!InstanceKlass::cast(k_oop)->contains_field_offset(offset))321ReportJNIFatalError(thr, fatal_wrong_field);322323/* check for proper field type */324if (!InstanceKlass::cast(k_oop)->find_field_from_offset(offset,325false, &fd))326ReportJNIFatalError(thr, fatal_instance_field_not_found);327328if ((fd.field_type() != ftype) &&329!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {330ReportJNIFatalError(thr, fatal_instance_field_mismatch);331}332}333334static inline void335checkString(JavaThread* thr, jstring js)336{337ASSERT_OOPS_ALLOWED;338oop s = jniCheck::validate_object(thr, js);339if (!s || !java_lang_String::is_instance(s))340ReportJNIFatalError(thr, fatal_non_string);341}342343static inline arrayOop344check_is_array(JavaThread* thr, jarray jArray)345{346ASSERT_OOPS_ALLOWED;347arrayOop aOop;348349aOop = (arrayOop)jniCheck::validate_object(thr, jArray);350if (aOop == NULL || !aOop->is_array()) {351ReportJNIFatalError(thr, fatal_non_array);352}353return aOop;354}355356static inline arrayOop357check_is_primitive_array(JavaThread* thr, jarray jArray) {358arrayOop aOop = check_is_array(thr, jArray);359360if (!aOop->is_typeArray()) {361ReportJNIFatalError(thr, fatal_prim_type_array_expected);362}363return aOop;364}365366static inline void367check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)368{369BasicType array_type;370arrayOop aOop;371372aOop = check_is_primitive_array(thr, jArray);373array_type = TypeArrayKlass::cast(aOop->klass())->element_type();374if (array_type != elementType) {375ReportJNIFatalError(thr, fatal_element_type_mismatch);376}377}378379static inline void380check_is_obj_array(JavaThread* thr, jarray jArray) {381arrayOop aOop = check_is_array(thr, jArray);382if (!aOop->is_objArray()) {383ReportJNIFatalError(thr, fatal_object_array_expected);384}385}386387/*388* Copy and wrap array elements for bounds checking.389* Remember the original elements (GuardedMemory::get_tag())390*/391static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,392void* orig_elements) {393void* result;394IN_VM(395oop a = JNIHandles::resolve_non_null(array);396size_t len = arrayOop(a)->length() <<397TypeArrayKlass::cast(a->klass())->log2_element_size();398result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);399)400return result;401}402403static void* check_wrapped_array(JavaThread* thr, const char* fn_name,404void* obj, void* carray, size_t* rsz) {405if (carray == NULL) {406tty->print_cr("%s: elements vector NULL" PTR_FORMAT, fn_name, p2i(obj));407NativeReportJNIFatalError(thr, "Elements vector NULL");408}409GuardedMemory guarded(carray);410void* orig_result = guarded.get_tag();411if (!guarded.verify_guards()) {412tty->print_cr("ReleasePrimitiveArrayCritical: release array failed bounds "413"check, incorrect pointer returned ? array: " PTR_FORMAT " carray: "414PTR_FORMAT, p2i(obj), p2i(carray));415guarded.print_on(tty);416NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "417"failed bounds check");418}419if (orig_result == NULL) {420tty->print_cr("ReleasePrimitiveArrayCritical: unrecognized elements. array: "421PTR_FORMAT " carray: " PTR_FORMAT, p2i(obj), p2i(carray));422guarded.print_on(tty);423NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "424"unrecognized elements");425}426if (rsz != NULL) {427*rsz = guarded.get_user_size();428}429return orig_result;430}431432static void* check_wrapped_array_release(JavaThread* thr, const char* fn_name,433void* obj, void* carray, jint mode) {434size_t sz;435void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz);436switch (mode) {437// As we never make copies, mode 0 and JNI_COMMIT are the same.438case 0:439case JNI_COMMIT:440memcpy(orig_result, carray, sz);441break;442case JNI_ABORT:443break;444default:445tty->print_cr("%s: Unrecognized mode %i releasing array "446PTR_FORMAT " elements " PTR_FORMAT, fn_name, mode, p2i(obj), p2i(carray));447NativeReportJNIFatalError(thr, "Unrecognized array release mode");448}449// We always need to release the copy we made with GuardedMemory450GuardedMemory::free_copy(carray);451return orig_result;452}453454oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {455if (JNIHandles::is_frame_handle(thr, obj) ||456JNIHandles::is_local_handle(thr, obj) ||457JNIHandles::is_global_handle(obj) ||458JNIHandles::is_weak_global_handle(obj)) {459ASSERT_OOPS_ALLOWED;460return JNIHandles::resolve_external_guard(obj);461}462ReportJNIFatalError(thr, fatal_bad_ref_to_jni);463return NULL;464}465466467Method* jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {468ASSERT_OOPS_ALLOWED;469// Do the jmethodID check470Method* moop = Method::checked_resolve_jmethod_id(method_id);471if (moop == NULL) {472ReportJNIFatalError(thr, fatal_wrong_class_or_method);473}474return moop;475}476477478oop jniCheck::validate_object(JavaThread* thr, jobject obj) {479if (!obj)480return NULL;481ASSERT_OOPS_ALLOWED;482oop oopObj = jniCheck::validate_handle(thr, obj);483if (!oopObj) {484ReportJNIFatalError(thr, fatal_bad_ref_to_jni);485}486return oopObj;487}488489// Warn if a class descriptor is in decorated form; class descriptors490// passed to JNI findClass should not be decorated unless they are491// array descriptors.492void jniCheck::validate_class_descriptor(JavaThread* thr, const char* name) {493if (name == NULL) return; // implementation accepts NULL so just return494495size_t len = strlen(name);496497if (len >= 2 &&498name[0] == JVM_SIGNATURE_CLASS && // 'L'499name[len-1] == JVM_SIGNATURE_ENDCLASS ) { // ';'500char msg[JVM_MAXPATHLEN];501jio_snprintf(msg, JVM_MAXPATHLEN, warn_bad_class_descriptor, name);502ReportJNIWarning(thr, msg);503}504}505506Klass* jniCheck::validate_class(JavaThread* thr, jclass clazz, bool allow_primitive) {507ASSERT_OOPS_ALLOWED;508oop mirror = jniCheck::validate_handle(thr, clazz);509if (!mirror) {510ReportJNIFatalError(thr, fatal_received_null_class);511}512513if (mirror->klass() != SystemDictionary::Class_klass()) {514ReportJNIFatalError(thr, fatal_class_not_a_class);515}516517Klass* k = java_lang_Class::as_Klass(mirror);518// Make allowances for primitive classes ...519if (!(k != NULL || allow_primitive && java_lang_Class::is_primitive(mirror))) {520ReportJNIFatalError(thr, fatal_class_not_a_class);521}522return k;523}524525void jniCheck::validate_throwable_klass(JavaThread* thr, Klass* klass) {526ASSERT_OOPS_ALLOWED;527assert(klass != NULL, "klass argument must have a value");528529if (!klass->oop_is_instance() ||530!InstanceKlass::cast(klass)->is_subclass_of(SystemDictionary::Throwable_klass())) {531ReportJNIFatalError(thr, fatal_class_not_a_throwable_class);532}533}534535void jniCheck::validate_call_object(JavaThread* thr, jobject obj, jmethodID method_id) {536/* validate the object being passed */537ASSERT_OOPS_ALLOWED;538jniCheck::validate_jmethod_id(thr, method_id);539jniCheck::validate_object(thr, obj);540}541542void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id) {543/* validate the class being passed */544ASSERT_OOPS_ALLOWED;545jniCheck::validate_jmethod_id(thr, method_id);546jniCheck::validate_class(thr, clazz, false);547}548549550/*551* IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE552*/553554JNI_ENTRY_CHECKED(jclass,555checked_jni_DefineClass(JNIEnv *env,556const char *name,557jobject loader,558const jbyte *buf,559jsize len))560functionEnter(thr);561IN_VM(562jniCheck::validate_object(thr, loader);563)564jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);565functionExit(thr);566return result;567JNI_END568569JNI_ENTRY_CHECKED(jclass,570checked_jni_FindClass(JNIEnv *env,571const char *name))572functionEnter(thr);573IN_VM(574jniCheck::validate_class_descriptor(thr, name);575)576jclass result = UNCHECKED()->FindClass(env, name);577functionExit(thr);578return result;579JNI_END580581JNI_ENTRY_CHECKED(jmethodID,582checked_jni_FromReflectedMethod(JNIEnv *env,583jobject method))584functionEnter(thr);585IN_VM(586jniCheck::validate_object(thr, method);587)588jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);589functionExit(thr);590return result;591JNI_END592593JNI_ENTRY_CHECKED(jfieldID,594checked_jni_FromReflectedField(JNIEnv *env,595jobject field))596functionEnter(thr);597IN_VM(598jniCheck::validate_object(thr, field);599)600jfieldID result = UNCHECKED()->FromReflectedField(env, field);601functionExit(thr);602return result;603JNI_END604605JNI_ENTRY_CHECKED(jobject,606checked_jni_ToReflectedMethod(JNIEnv *env,607jclass cls,608jmethodID methodID,609jboolean isStatic))610functionEnter(thr);611IN_VM(612jniCheck::validate_class(thr, cls, false);613jniCheck::validate_jmethod_id(thr, methodID);614)615jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,616isStatic);617functionExit(thr);618return result;619JNI_END620621JNI_ENTRY_CHECKED(jclass,622checked_jni_GetSuperclass(JNIEnv *env,623jclass sub))624functionEnter(thr);625IN_VM(626jniCheck::validate_class(thr, sub, true);627)628jclass result = UNCHECKED()->GetSuperclass(env, sub);629functionExit(thr);630return result;631JNI_END632633JNI_ENTRY_CHECKED(jboolean,634checked_jni_IsAssignableFrom(JNIEnv *env,635jclass sub,636jclass sup))637functionEnter(thr);638IN_VM(639jniCheck::validate_class(thr, sub, true);640jniCheck::validate_class(thr, sup, true);641)642jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);643functionExit(thr);644return result;645JNI_END646647JNI_ENTRY_CHECKED(jobject,648checked_jni_ToReflectedField(JNIEnv *env,649jclass cls,650jfieldID fieldID,651jboolean isStatic))652functionEnter(thr);653IN_VM(654jniCheck::validate_class(thr, cls, false);655)656jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,657isStatic);658functionExit(thr);659return result;660JNI_END661662JNI_ENTRY_CHECKED(jint,663checked_jni_Throw(JNIEnv *env,664jthrowable obj))665functionEnter(thr);666IN_VM(667oop oopObj = jniCheck::validate_object(thr, obj);668if (oopObj == NULL) {669// Unchecked Throw tolerates a NULL obj, so just warn670ReportJNIWarning(thr, "JNI Throw called with NULL throwable");671} else {672jniCheck::validate_throwable_klass(thr, oopObj->klass());673}674)675jint result = UNCHECKED()->Throw(env, obj);676functionExit(thr);677return result;678JNI_END679680JNI_ENTRY_CHECKED(jint,681checked_jni_ThrowNew(JNIEnv *env,682jclass clazz,683const char *msg))684functionEnter(thr);685IN_VM(686Klass* k = jniCheck::validate_class(thr, clazz, false);687assert(k != NULL, "validate_class shouldn't return NULL Klass*");688jniCheck::validate_throwable_klass(thr, k);689)690jint result = UNCHECKED()->ThrowNew(env, clazz, msg);691functionExit(thr);692return result;693JNI_END694695JNI_ENTRY_CHECKED(jthrowable,696checked_jni_ExceptionOccurred(JNIEnv *env))697thr->clear_pending_jni_exception_check();698functionEnterExceptionAllowed(thr);699jthrowable result = UNCHECKED()->ExceptionOccurred(env);700functionExit(thr);701return result;702JNI_END703704JNI_ENTRY_CHECKED(void,705checked_jni_ExceptionDescribe(JNIEnv *env))706functionEnterExceptionAllowed(thr);707UNCHECKED()->ExceptionDescribe(env);708functionExit(thr);709JNI_END710711JNI_ENTRY_CHECKED(void,712checked_jni_ExceptionClear(JNIEnv *env))713thr->clear_pending_jni_exception_check();714functionEnterExceptionAllowed(thr);715UNCHECKED()->ExceptionClear(env);716functionExit(thr);717JNI_END718719JNI_ENTRY_CHECKED(void,720checked_jni_FatalError(JNIEnv *env,721const char *msg))722thr->clear_pending_jni_exception_check();723functionEnter(thr);724UNCHECKED()->FatalError(env, msg);725functionExit(thr);726JNI_END727728JNI_ENTRY_CHECKED(jint,729checked_jni_PushLocalFrame(JNIEnv *env,730jint capacity))731functionEnterExceptionAllowed(thr);732if (capacity < 0)733NativeReportJNIFatalError(thr, "negative capacity");734jint result = UNCHECKED()->PushLocalFrame(env, capacity);735if (result == JNI_OK) {736add_planned_handle_capacity(thr->active_handles(), capacity);737}738functionExit(thr);739return result;740JNI_END741742JNI_ENTRY_CHECKED(jobject,743checked_jni_PopLocalFrame(JNIEnv *env,744jobject result))745functionEnterExceptionAllowed(thr);746jobject res = UNCHECKED()->PopLocalFrame(env, result);747functionExit(thr);748return res;749JNI_END750751JNI_ENTRY_CHECKED(jobject,752checked_jni_NewGlobalRef(JNIEnv *env,753jobject lobj))754functionEnter(thr);755IN_VM(756if (lobj != NULL) {757jniCheck::validate_handle(thr, lobj);758}759)760jobject result = UNCHECKED()->NewGlobalRef(env,lobj);761functionExit(thr);762return result;763JNI_END764765JNI_ENTRY_CHECKED(void,766checked_jni_DeleteGlobalRef(JNIEnv *env,767jobject gref))768functionEnterExceptionAllowed(thr);769IN_VM(770jniCheck::validate_object(thr, gref);771if (gref && !JNIHandles::is_global_handle(gref)) {772ReportJNIFatalError(thr,773"Invalid global JNI handle passed to DeleteGlobalRef");774}775)776UNCHECKED()->DeleteGlobalRef(env,gref);777functionExit(thr);778JNI_END779780JNI_ENTRY_CHECKED(void,781checked_jni_DeleteLocalRef(JNIEnv *env,782jobject obj))783functionEnterExceptionAllowed(thr);784IN_VM(785jniCheck::validate_object(thr, obj);786if (obj && !(JNIHandles::is_local_handle(thr, obj) ||787JNIHandles::is_frame_handle(thr, obj)))788ReportJNIFatalError(thr,789"Invalid local JNI handle passed to DeleteLocalRef");790)791UNCHECKED()->DeleteLocalRef(env, obj);792functionExit(thr);793JNI_END794795JNI_ENTRY_CHECKED(jboolean,796checked_jni_IsSameObject(JNIEnv *env,797jobject obj1,798jobject obj2))799functionEnterExceptionAllowed(thr);800IN_VM(801/* This JNI function can be used to compare weak global references802* to NULL objects. If the handles are valid, but contain NULL,803* then don't attempt to validate the object.804*/805if (obj1 != NULL && jniCheck::validate_handle(thr, obj1) != NULL) {806jniCheck::validate_object(thr, obj1);807}808if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {809jniCheck::validate_object(thr, obj2);810}811)812jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);813functionExit(thr);814return result;815JNI_END816817JNI_ENTRY_CHECKED(jobject,818checked_jni_NewLocalRef(JNIEnv *env,819jobject ref))820functionEnter(thr);821IN_VM(822if (ref != NULL) {823jniCheck::validate_handle(thr, ref);824}825)826jobject result = UNCHECKED()->NewLocalRef(env, ref);827functionExit(thr);828return result;829JNI_END830831JNI_ENTRY_CHECKED(jint,832checked_jni_EnsureLocalCapacity(JNIEnv *env,833jint capacity))834functionEnter(thr);835if (capacity < 0) {836NativeReportJNIFatalError(thr, "negative capacity");837}838jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);839if (result == JNI_OK) {840add_planned_handle_capacity(thr->active_handles(), capacity);841}842functionExit(thr);843return result;844JNI_END845846JNI_ENTRY_CHECKED(jobject,847checked_jni_AllocObject(JNIEnv *env,848jclass clazz))849functionEnter(thr);850IN_VM(851jniCheck::validate_class(thr, clazz, false);852)853jobject result = UNCHECKED()->AllocObject(env,clazz);854functionExit(thr);855return result;856JNI_END857858JNI_ENTRY_CHECKED(jobject,859checked_jni_NewObject(JNIEnv *env,860jclass clazz,861jmethodID methodID,862...))863functionEnter(thr);864va_list args;865IN_VM(866jniCheck::validate_class(thr, clazz, false);867jniCheck::validate_jmethod_id(thr, methodID);868)869va_start(args, methodID);870jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);871va_end(args);872functionExit(thr);873return result;874JNI_END875876JNI_ENTRY_CHECKED(jobject,877checked_jni_NewObjectV(JNIEnv *env,878jclass clazz,879jmethodID methodID,880va_list args))881functionEnter(thr);882IN_VM(883jniCheck::validate_class(thr, clazz, false);884jniCheck::validate_jmethod_id(thr, methodID);885)886jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);887functionExit(thr);888return result;889JNI_END890891JNI_ENTRY_CHECKED(jobject,892checked_jni_NewObjectA(JNIEnv *env,893jclass clazz,894jmethodID methodID,895const jvalue *args))896functionEnter(thr);897IN_VM(898jniCheck::validate_class(thr, clazz, false);899jniCheck::validate_jmethod_id(thr, methodID);900)901jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);902functionExit(thr);903return result;904JNI_END905906JNI_ENTRY_CHECKED(jclass,907checked_jni_GetObjectClass(JNIEnv *env,908jobject obj))909functionEnter(thr);910IN_VM(911jniCheck::validate_object(thr, obj);912)913jclass result = UNCHECKED()->GetObjectClass(env,obj);914functionExit(thr);915return result;916JNI_END917918JNI_ENTRY_CHECKED(jboolean,919checked_jni_IsInstanceOf(JNIEnv *env,920jobject obj,921jclass clazz))922functionEnter(thr);923IN_VM(924jniCheck::validate_object(thr, obj);925jniCheck::validate_class(thr, clazz, true);926)927jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);928functionExit(thr);929return result;930JNI_END931932JNI_ENTRY_CHECKED(jmethodID,933checked_jni_GetMethodID(JNIEnv *env,934jclass clazz,935const char *name,936const char *sig))937functionEnter(thr);938IN_VM(939jniCheck::validate_class(thr, clazz, false);940)941jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);942functionExit(thr);943return result;944JNI_END945946#define WRAPPER_CallMethod(ResultType, Result) \947JNI_ENTRY_CHECKED(ResultType, \948checked_jni_Call##Result##Method(JNIEnv *env, \949jobject obj, \950jmethodID methodID, \951...)) \952functionEnter(thr); \953va_list args; \954IN_VM( \955jniCheck::validate_call_object(thr, obj, methodID); \956) \957va_start(args,methodID); \958ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \959args); \960va_end(args); \961thr->set_pending_jni_exception_check("Call"#Result"Method"); \962functionExit(thr); \963return result; \964JNI_END \965\966JNI_ENTRY_CHECKED(ResultType, \967checked_jni_Call##Result##MethodV(JNIEnv *env, \968jobject obj, \969jmethodID methodID, \970va_list args)) \971functionEnter(thr); \972IN_VM(\973jniCheck::validate_call_object(thr, obj, methodID); \974) \975ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\976args); \977thr->set_pending_jni_exception_check("Call"#Result"MethodV"); \978functionExit(thr); \979return result; \980JNI_END \981\982JNI_ENTRY_CHECKED(ResultType, \983checked_jni_Call##Result##MethodA(JNIEnv *env, \984jobject obj, \985jmethodID methodID, \986const jvalue * args)) \987functionEnter(thr); \988IN_VM( \989jniCheck::validate_call_object(thr, obj, methodID); \990) \991ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\992args); \993thr->set_pending_jni_exception_check("Call"#Result"MethodA"); \994functionExit(thr); \995return result; \996JNI_END997998WRAPPER_CallMethod(jobject,Object)999WRAPPER_CallMethod(jboolean,Boolean)1000WRAPPER_CallMethod(jbyte,Byte)1001WRAPPER_CallMethod(jshort,Short)1002WRAPPER_CallMethod(jchar,Char)1003WRAPPER_CallMethod(jint,Int)1004WRAPPER_CallMethod(jlong,Long)1005WRAPPER_CallMethod(jfloat,Float)1006WRAPPER_CallMethod(jdouble,Double)10071008JNI_ENTRY_CHECKED(void,1009checked_jni_CallVoidMethod(JNIEnv *env, \1010jobject obj, \1011jmethodID methodID, \1012...))1013functionEnter(thr);1014va_list args;1015IN_VM(1016jniCheck::validate_call_object(thr, obj, methodID);1017)1018va_start(args,methodID);1019UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);1020va_end(args);1021thr->set_pending_jni_exception_check("CallVoidMethod");1022functionExit(thr);1023JNI_END10241025JNI_ENTRY_CHECKED(void,1026checked_jni_CallVoidMethodV(JNIEnv *env,1027jobject obj,1028jmethodID methodID,1029va_list args))1030functionEnter(thr);1031IN_VM(1032jniCheck::validate_call_object(thr, obj, methodID);1033)1034UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);1035thr->set_pending_jni_exception_check("CallVoidMethodV");1036functionExit(thr);1037JNI_END10381039JNI_ENTRY_CHECKED(void,1040checked_jni_CallVoidMethodA(JNIEnv *env,1041jobject obj,1042jmethodID methodID,1043const jvalue * args))1044functionEnter(thr);1045IN_VM(1046jniCheck::validate_call_object(thr, obj, methodID);1047)1048UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);1049thr->set_pending_jni_exception_check("CallVoidMethodA");1050functionExit(thr);1051JNI_END10521053#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \1054JNI_ENTRY_CHECKED(ResultType, \1055checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \1056jobject obj, \1057jclass clazz, \1058jmethodID methodID, \1059...)) \1060functionEnter(thr); \1061va_list args; \1062IN_VM( \1063jniCheck::validate_call_object(thr, obj, methodID); \1064jniCheck::validate_call_class(thr, clazz, methodID); \1065) \1066va_start(args,methodID); \1067ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \1068obj, \1069clazz, \1070methodID,\1071args); \1072va_end(args); \1073thr->set_pending_jni_exception_check("CallNonvirtual"#Result"Method"); \1074functionExit(thr); \1075return result; \1076JNI_END \1077\1078JNI_ENTRY_CHECKED(ResultType, \1079checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \1080jobject obj, \1081jclass clazz, \1082jmethodID methodID, \1083va_list args)) \1084functionEnter(thr); \1085IN_VM( \1086jniCheck::validate_call_object(thr, obj, methodID); \1087jniCheck::validate_call_class(thr, clazz, methodID); \1088) \1089ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \1090obj, \1091clazz, \1092methodID,\1093args); \1094thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodV"); \1095functionExit(thr); \1096return result; \1097JNI_END \1098\1099JNI_ENTRY_CHECKED(ResultType, \1100checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \1101jobject obj, \1102jclass clazz, \1103jmethodID methodID, \1104const jvalue * args)) \1105functionEnter(thr); \1106IN_VM( \1107jniCheck::validate_call_object(thr, obj, methodID); \1108jniCheck::validate_call_class(thr, clazz, methodID); \1109) \1110ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \1111obj, \1112clazz, \1113methodID,\1114args); \1115thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodA"); \1116functionExit(thr); \1117return result; \1118JNI_END11191120WRAPPER_CallNonvirtualMethod(jobject,Object)1121WRAPPER_CallNonvirtualMethod(jboolean,Boolean)1122WRAPPER_CallNonvirtualMethod(jbyte,Byte)1123WRAPPER_CallNonvirtualMethod(jshort,Short)1124WRAPPER_CallNonvirtualMethod(jchar,Char)1125WRAPPER_CallNonvirtualMethod(jint,Int)1126WRAPPER_CallNonvirtualMethod(jlong,Long)1127WRAPPER_CallNonvirtualMethod(jfloat,Float)1128WRAPPER_CallNonvirtualMethod(jdouble,Double)11291130JNI_ENTRY_CHECKED(void,1131checked_jni_CallNonvirtualVoidMethod(JNIEnv *env,1132jobject obj,1133jclass clazz,1134jmethodID methodID,1135...))1136functionEnter(thr);1137va_list args;1138IN_VM(1139jniCheck::validate_call_object(thr, obj, methodID);1140jniCheck::validate_call_class(thr, clazz, methodID);1141)1142va_start(args,methodID);1143UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);1144va_end(args);1145thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");1146functionExit(thr);1147JNI_END11481149JNI_ENTRY_CHECKED(void,1150checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,1151jobject obj,1152jclass clazz,1153jmethodID methodID,1154va_list args))1155functionEnter(thr);1156IN_VM(1157jniCheck::validate_call_object(thr, obj, methodID);1158jniCheck::validate_call_class(thr, clazz, methodID);1159)1160UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);1161thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");1162functionExit(thr);1163JNI_END11641165JNI_ENTRY_CHECKED(void,1166checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,1167jobject obj,1168jclass clazz,1169jmethodID methodID,1170const jvalue * args))1171functionEnter(thr);1172IN_VM(1173jniCheck::validate_call_object(thr, obj, methodID);1174jniCheck::validate_call_class(thr, clazz, methodID);1175)1176UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);1177thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");1178functionExit(thr);1179JNI_END11801181JNI_ENTRY_CHECKED(jfieldID,1182checked_jni_GetFieldID(JNIEnv *env,1183jclass clazz,1184const char *name,1185const char *sig))1186functionEnter(thr);1187IN_VM(1188jniCheck::validate_class(thr, clazz, false);1189)1190jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);1191functionExit(thr);1192return result;1193JNI_END11941195#define WRAPPER_GetField(ReturnType,Result,FieldType) \1196JNI_ENTRY_CHECKED(ReturnType, \1197checked_jni_Get##Result##Field(JNIEnv *env, \1198jobject obj, \1199jfieldID fieldID)) \1200functionEnter(thr); \1201IN_VM( \1202checkInstanceFieldID(thr, fieldID, obj, FieldType); \1203) \1204ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \1205functionExit(thr); \1206return result; \1207JNI_END12081209WRAPPER_GetField(jobject, Object, T_OBJECT)1210WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)1211WRAPPER_GetField(jbyte, Byte, T_BYTE)1212WRAPPER_GetField(jshort, Short, T_SHORT)1213WRAPPER_GetField(jchar, Char, T_CHAR)1214WRAPPER_GetField(jint, Int, T_INT)1215WRAPPER_GetField(jlong, Long, T_LONG)1216WRAPPER_GetField(jfloat, Float, T_FLOAT)1217WRAPPER_GetField(jdouble, Double, T_DOUBLE)12181219#define WRAPPER_SetField(ValueType,Result,FieldType) \1220JNI_ENTRY_CHECKED(void, \1221checked_jni_Set##Result##Field(JNIEnv *env, \1222jobject obj, \1223jfieldID fieldID, \1224ValueType val)) \1225functionEnter(thr); \1226IN_VM( \1227checkInstanceFieldID(thr, fieldID, obj, FieldType); \1228) \1229UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \1230functionExit(thr); \1231JNI_END12321233WRAPPER_SetField(jobject, Object, T_OBJECT)1234WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)1235WRAPPER_SetField(jbyte, Byte, T_BYTE)1236WRAPPER_SetField(jshort, Short, T_SHORT)1237WRAPPER_SetField(jchar, Char, T_CHAR)1238WRAPPER_SetField(jint, Int, T_INT)1239WRAPPER_SetField(jlong, Long, T_LONG)1240WRAPPER_SetField(jfloat, Float, T_FLOAT)1241WRAPPER_SetField(jdouble, Double, T_DOUBLE)124212431244JNI_ENTRY_CHECKED(jmethodID,1245checked_jni_GetStaticMethodID(JNIEnv *env,1246jclass clazz,1247const char *name,1248const char *sig))1249functionEnter(thr);1250IN_VM(1251jniCheck::validate_class(thr, clazz, false);1252)1253jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);1254functionExit(thr);1255return result;1256JNI_END12571258#define WRAPPER_CallStaticMethod(ReturnType,Result) \1259JNI_ENTRY_CHECKED(ReturnType, \1260checked_jni_CallStatic##Result##Method(JNIEnv *env, \1261jclass clazz, \1262jmethodID methodID, \1263...)) \1264functionEnter(thr); \1265va_list args; \1266IN_VM( \1267jniCheck::validate_jmethod_id(thr, methodID); \1268jniCheck::validate_class(thr, clazz, false); \1269) \1270va_start(args,methodID); \1271ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \1272clazz, \1273methodID, \1274args); \1275va_end(args); \1276thr->set_pending_jni_exception_check("CallStatic"#Result"Method"); \1277functionExit(thr); \1278return result; \1279JNI_END \1280\1281JNI_ENTRY_CHECKED(ReturnType, \1282checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \1283jclass clazz, \1284jmethodID methodID,\1285va_list args)) \1286functionEnter(thr); \1287IN_VM( \1288jniCheck::validate_jmethod_id(thr, methodID); \1289jniCheck::validate_class(thr, clazz, false); \1290) \1291ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \1292clazz, \1293methodID, \1294args); \1295thr->set_pending_jni_exception_check("CallStatic"#Result"MethodV"); \1296functionExit(thr); \1297return result; \1298JNI_END \1299\1300JNI_ENTRY_CHECKED(ReturnType, \1301checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \1302jclass clazz, \1303jmethodID methodID, \1304const jvalue *args)) \1305functionEnter(thr); \1306IN_VM( \1307jniCheck::validate_jmethod_id(thr, methodID); \1308jniCheck::validate_class(thr, clazz, false); \1309) \1310ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \1311clazz, \1312methodID, \1313args); \1314thr->set_pending_jni_exception_check("CallStatic"#Result"MethodA"); \1315functionExit(thr); \1316return result; \1317JNI_END13181319WRAPPER_CallStaticMethod(jobject,Object)1320WRAPPER_CallStaticMethod(jboolean,Boolean)1321WRAPPER_CallStaticMethod(jbyte,Byte)1322WRAPPER_CallStaticMethod(jshort,Short)1323WRAPPER_CallStaticMethod(jchar,Char)1324WRAPPER_CallStaticMethod(jint,Int)1325WRAPPER_CallStaticMethod(jlong,Long)1326WRAPPER_CallStaticMethod(jfloat,Float)1327WRAPPER_CallStaticMethod(jdouble,Double)13281329JNI_ENTRY_CHECKED(void,1330checked_jni_CallStaticVoidMethod(JNIEnv *env,1331jclass cls,1332jmethodID methodID,1333...))1334functionEnter(thr);1335va_list args;1336IN_VM(1337jniCheck::validate_jmethod_id(thr, methodID);1338jniCheck::validate_class(thr, cls, false);1339)1340va_start(args,methodID);1341UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);1342va_end(args);1343thr->set_pending_jni_exception_check("CallStaticVoidMethod");1344functionExit(thr);1345JNI_END13461347JNI_ENTRY_CHECKED(void,1348checked_jni_CallStaticVoidMethodV(JNIEnv *env,1349jclass cls,1350jmethodID methodID,1351va_list args))1352functionEnter(thr);1353IN_VM(1354jniCheck::validate_jmethod_id(thr, methodID);1355jniCheck::validate_class(thr, cls, false);1356)1357UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);1358thr->set_pending_jni_exception_check("CallStaticVoidMethodV");1359functionExit(thr);1360JNI_END13611362JNI_ENTRY_CHECKED(void,1363checked_jni_CallStaticVoidMethodA(JNIEnv *env,1364jclass cls,1365jmethodID methodID,1366const jvalue * args))1367functionEnter(thr);1368IN_VM(1369jniCheck::validate_jmethod_id(thr, methodID);1370jniCheck::validate_class(thr, cls, false);1371)1372UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);1373thr->set_pending_jni_exception_check("CallStaticVoidMethodA");1374functionExit(thr);1375JNI_END13761377JNI_ENTRY_CHECKED(jfieldID,1378checked_jni_GetStaticFieldID(JNIEnv *env,1379jclass clazz,1380const char *name,1381const char *sig))1382functionEnter(thr);1383IN_VM(1384jniCheck::validate_class(thr, clazz, false);1385)1386jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);1387functionExit(thr);1388return result;1389JNI_END13901391#define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \1392JNI_ENTRY_CHECKED(ReturnType, \1393checked_jni_GetStatic##Result##Field(JNIEnv *env, \1394jclass clazz, \1395jfieldID fieldID)) \1396functionEnter(thr); \1397IN_VM( \1398jniCheck::validate_class(thr, clazz, false); \1399checkStaticFieldID(thr, fieldID, clazz, FieldType); \1400) \1401ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \1402clazz, \1403fieldID); \1404functionExit(thr); \1405return result; \1406JNI_END14071408WRAPPER_GetStaticField(jobject, Object, T_OBJECT)1409WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)1410WRAPPER_GetStaticField(jbyte, Byte, T_BYTE)1411WRAPPER_GetStaticField(jshort, Short, T_SHORT)1412WRAPPER_GetStaticField(jchar, Char, T_CHAR)1413WRAPPER_GetStaticField(jint, Int, T_INT)1414WRAPPER_GetStaticField(jlong, Long, T_LONG)1415WRAPPER_GetStaticField(jfloat, Float, T_FLOAT)1416WRAPPER_GetStaticField(jdouble, Double, T_DOUBLE)14171418#define WRAPPER_SetStaticField(ValueType,Result,FieldType) \1419JNI_ENTRY_CHECKED(void, \1420checked_jni_SetStatic##Result##Field(JNIEnv *env, \1421jclass clazz, \1422jfieldID fieldID, \1423ValueType value)) \1424functionEnter(thr); \1425IN_VM( \1426jniCheck::validate_class(thr, clazz, false); \1427checkStaticFieldID(thr, fieldID, clazz, FieldType); \1428) \1429UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \1430functionExit(thr); \1431JNI_END14321433WRAPPER_SetStaticField(jobject, Object, T_OBJECT)1434WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)1435WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)1436WRAPPER_SetStaticField(jshort, Short, T_SHORT)1437WRAPPER_SetStaticField(jchar, Char, T_CHAR)1438WRAPPER_SetStaticField(jint, Int, T_INT)1439WRAPPER_SetStaticField(jlong, Long, T_LONG)1440WRAPPER_SetStaticField(jfloat, Float, T_FLOAT)1441WRAPPER_SetStaticField(jdouble, Double, T_DOUBLE)144214431444JNI_ENTRY_CHECKED(jstring,1445checked_jni_NewString(JNIEnv *env,1446const jchar *unicode,1447jsize len))1448functionEnter(thr);1449jstring result = UNCHECKED()->NewString(env,unicode,len);1450functionExit(thr);1451return result;1452JNI_END14531454JNI_ENTRY_CHECKED(jsize,1455checked_jni_GetStringLength(JNIEnv *env,1456jstring str))1457functionEnter(thr);1458IN_VM(1459checkString(thr, str);1460)1461jsize result = UNCHECKED()->GetStringLength(env,str);1462functionExit(thr);1463return result;1464JNI_END14651466// Arbitrary (but well-known) tag1467const void* STRING_TAG = (void*)0x47114711;14681469JNI_ENTRY_CHECKED(const jchar *,1470checked_jni_GetStringChars(JNIEnv *env,1471jstring str,1472jboolean *isCopy))1473functionEnter(thr);1474IN_VM(1475checkString(thr, str);1476)1477jchar* new_result = NULL;1478const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);1479assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");1480if (result != NULL) {1481size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination1482len *= sizeof(jchar);1483new_result = (jchar*) GuardedMemory::wrap_copy(result, len, STRING_TAG);1484if (new_result == NULL) {1485vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringChars");1486}1487// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes1488// Note that the dtrace arguments for the allocated memory will not match up with this solution.1489FreeHeap((char*)result);1490}1491functionExit(thr);1492return new_result;1493JNI_END14941495JNI_ENTRY_CHECKED(void,1496checked_jni_ReleaseStringChars(JNIEnv *env,1497jstring str,1498const jchar *chars))1499functionEnterExceptionAllowed(thr);1500IN_VM(1501checkString(thr, str);1502)1503if (chars == NULL) {1504// still do the unchecked call to allow dtrace probes1505UNCHECKED()->ReleaseStringChars(env,str,chars);1506}1507else {1508GuardedMemory guarded((void*)chars);1509if (!guarded.verify_guards()) {1510tty->print_cr("ReleaseStringChars: release chars failed bounds check. "1511"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));1512guarded.print_on(tty);1513NativeReportJNIFatalError(thr, "ReleaseStringChars: "1514"release chars failed bounds check.");1515}1516if (guarded.get_tag() != STRING_TAG) {1517tty->print_cr("ReleaseStringChars: called on something not allocated "1518"by GetStringChars. string: " PTR_FORMAT " chars: " PTR_FORMAT,1519p2i(str), p2i(chars));1520NativeReportJNIFatalError(thr, "ReleaseStringChars called on something "1521"not allocated by GetStringChars");1522}1523UNCHECKED()->ReleaseStringChars(env, str,1524(const jchar*) guarded.release_for_freeing());1525}1526functionExit(thr);1527JNI_END15281529JNI_ENTRY_CHECKED(jstring,1530checked_jni_NewStringUTF(JNIEnv *env,1531const char *utf))1532functionEnter(thr);1533jstring result = UNCHECKED()->NewStringUTF(env,utf);1534functionExit(thr);1535return result;1536JNI_END15371538JNI_ENTRY_CHECKED(jsize,1539checked_jni_GetStringUTFLength(JNIEnv *env,1540jstring str))1541functionEnter(thr);1542IN_VM(1543checkString(thr, str);1544)1545jsize result = UNCHECKED()->GetStringUTFLength(env,str);1546functionExit(thr);1547return result;1548JNI_END15491550// Arbitrary (but well-known) tag - different than GetStringChars1551const void* STRING_UTF_TAG = (void*) 0x48124812;15521553JNI_ENTRY_CHECKED(const char *,1554checked_jni_GetStringUTFChars(JNIEnv *env,1555jstring str,1556jboolean *isCopy))1557functionEnter(thr);1558IN_VM(1559checkString(thr, str);1560)1561char* new_result = NULL;1562const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);1563assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");1564if (result != NULL) {1565size_t len = strlen(result) + 1; // + 1 for NULL termination1566new_result = (char*) GuardedMemory::wrap_copy(result, len, STRING_UTF_TAG);1567if (new_result == NULL) {1568vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringUTFChars");1569}1570// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes1571// Note that the dtrace arguments for the allocated memory will not match up with this solution.1572FreeHeap((char*)result, mtInternal);1573}1574functionExit(thr);1575return new_result;1576JNI_END15771578JNI_ENTRY_CHECKED(void,1579checked_jni_ReleaseStringUTFChars(JNIEnv *env,1580jstring str,1581const char* chars))1582functionEnterExceptionAllowed(thr);1583IN_VM(1584checkString(thr, str);1585)1586if (chars == NULL) {1587// still do the unchecked call to allow dtrace probes1588UNCHECKED()->ReleaseStringUTFChars(env,str,chars);1589}1590else {1591GuardedMemory guarded((void*)chars);1592if (!guarded.verify_guards()) {1593tty->print_cr("ReleaseStringUTFChars: release chars failed bounds check. "1594"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));1595guarded.print_on(tty);1596NativeReportJNIFatalError(thr, "ReleaseStringUTFChars: "1597"release chars failed bounds check.");1598}1599if (guarded.get_tag() != STRING_UTF_TAG) {1600tty->print_cr("ReleaseStringUTFChars: called on something not "1601"allocated by GetStringUTFChars. string: " PTR_FORMAT " chars: "1602PTR_FORMAT, p2i(str), p2i(chars));1603NativeReportJNIFatalError(thr, "ReleaseStringUTFChars "1604"called on something not allocated by GetStringUTFChars");1605}1606UNCHECKED()->ReleaseStringUTFChars(env, str,1607(const char*) guarded.release_for_freeing());1608}1609functionExit(thr);1610JNI_END16111612JNI_ENTRY_CHECKED(jsize,1613checked_jni_GetArrayLength(JNIEnv *env,1614jarray array))1615functionEnter(thr);1616IN_VM(1617check_is_array(thr, array);1618)1619jsize result = UNCHECKED()->GetArrayLength(env,array);1620functionExit(thr);1621return result;1622JNI_END16231624JNI_ENTRY_CHECKED(jobjectArray,1625checked_jni_NewObjectArray(JNIEnv *env,1626jsize len,1627jclass clazz,1628jobject init))1629functionEnter(thr);1630jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);1631functionExit(thr);1632return result;1633JNI_END16341635JNI_ENTRY_CHECKED(jobject,1636checked_jni_GetObjectArrayElement(JNIEnv *env,1637jobjectArray array,1638jsize index))1639functionEnter(thr);1640IN_VM(1641check_is_obj_array(thr, array);1642)1643jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);1644functionExit(thr);1645return result;1646JNI_END16471648JNI_ENTRY_CHECKED(void,1649checked_jni_SetObjectArrayElement(JNIEnv *env,1650jobjectArray array,1651jsize index,1652jobject val))1653functionEnter(thr);1654IN_VM(1655check_is_obj_array(thr, array);1656)1657UNCHECKED()->SetObjectArrayElement(env,array,index,val);1658functionExit(thr);1659JNI_END16601661#define WRAPPER_NewScalarArray(Return, Result) \1662JNI_ENTRY_CHECKED(Return, \1663checked_jni_New##Result##Array(JNIEnv *env, \1664jsize len)) \1665functionEnter(thr); \1666Return result = UNCHECKED()->New##Result##Array(env,len); \1667functionExit(thr); \1668return (Return) result; \1669JNI_END16701671WRAPPER_NewScalarArray(jbooleanArray, Boolean)1672WRAPPER_NewScalarArray(jbyteArray, Byte)1673WRAPPER_NewScalarArray(jshortArray, Short)1674WRAPPER_NewScalarArray(jcharArray, Char)1675WRAPPER_NewScalarArray(jintArray, Int)1676WRAPPER_NewScalarArray(jlongArray, Long)1677WRAPPER_NewScalarArray(jfloatArray, Float)1678WRAPPER_NewScalarArray(jdoubleArray, Double)16791680#define WRAPPER_GetScalarArrayElements(ElementTag,ElementType,Result) \1681JNI_ENTRY_CHECKED(ElementType *, \1682checked_jni_Get##Result##ArrayElements(JNIEnv *env, \1683ElementType##Array array, \1684jboolean *isCopy)) \1685functionEnter(thr); \1686IN_VM( \1687check_primitive_array_type(thr, array, ElementTag); \1688) \1689ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \1690array, \1691isCopy); \1692if (result != NULL) { \1693result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \1694} \1695functionExit(thr); \1696return result; \1697JNI_END16981699WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)1700WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)1701WRAPPER_GetScalarArrayElements(T_SHORT, jshort, Short)1702WRAPPER_GetScalarArrayElements(T_CHAR, jchar, Char)1703WRAPPER_GetScalarArrayElements(T_INT, jint, Int)1704WRAPPER_GetScalarArrayElements(T_LONG, jlong, Long)1705WRAPPER_GetScalarArrayElements(T_FLOAT, jfloat, Float)1706WRAPPER_GetScalarArrayElements(T_DOUBLE, jdouble, Double)17071708#define WRAPPER_ReleaseScalarArrayElements(ElementTag,ElementType,Result,Tag) \1709JNI_ENTRY_CHECKED(void, \1710checked_jni_Release##Result##ArrayElements(JNIEnv *env, \1711ElementType##Array array, \1712ElementType *elems, \1713jint mode)) \1714functionEnterExceptionAllowed(thr); \1715IN_VM( \1716check_primitive_array_type(thr, array, ElementTag); \1717ASSERT_OOPS_ALLOWED; \1718typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \1719) \1720ElementType* orig_result = (ElementType *) check_wrapped_array_release( \1721thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode); \1722UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \1723functionExit(thr); \1724JNI_END17251726WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)1727WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)1728WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)1729WRAPPER_ReleaseScalarArrayElements(T_CHAR, jchar, Char, char)1730WRAPPER_ReleaseScalarArrayElements(T_INT, jint, Int, int)1731WRAPPER_ReleaseScalarArrayElements(T_LONG, jlong, Long, long)1732WRAPPER_ReleaseScalarArrayElements(T_FLOAT, jfloat, Float, float)1733WRAPPER_ReleaseScalarArrayElements(T_DOUBLE, jdouble, Double, double)17341735#define WRAPPER_GetScalarArrayRegion(ElementTag,ElementType,Result) \1736JNI_ENTRY_CHECKED(void, \1737checked_jni_Get##Result##ArrayRegion(JNIEnv *env, \1738ElementType##Array array, \1739jsize start, \1740jsize len, \1741ElementType *buf)) \1742functionEnter(thr); \1743IN_VM( \1744check_primitive_array_type(thr, array, ElementTag); \1745) \1746UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \1747functionExit(thr); \1748JNI_END17491750WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)1751WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)1752WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)1753WRAPPER_GetScalarArrayRegion(T_CHAR, jchar, Char)1754WRAPPER_GetScalarArrayRegion(T_INT, jint, Int)1755WRAPPER_GetScalarArrayRegion(T_LONG, jlong, Long)1756WRAPPER_GetScalarArrayRegion(T_FLOAT, jfloat, Float)1757WRAPPER_GetScalarArrayRegion(T_DOUBLE, jdouble, Double)17581759#define WRAPPER_SetScalarArrayRegion(ElementTag,ElementType,Result) \1760JNI_ENTRY_CHECKED(void, \1761checked_jni_Set##Result##ArrayRegion(JNIEnv *env, \1762ElementType##Array array, \1763jsize start, \1764jsize len, \1765const ElementType *buf)) \1766functionEnter(thr); \1767IN_VM( \1768check_primitive_array_type(thr, array, ElementTag); \1769) \1770UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \1771functionExit(thr); \1772JNI_END17731774WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)1775WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)1776WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)1777WRAPPER_SetScalarArrayRegion(T_CHAR, jchar, Char)1778WRAPPER_SetScalarArrayRegion(T_INT, jint, Int)1779WRAPPER_SetScalarArrayRegion(T_LONG, jlong, Long)1780WRAPPER_SetScalarArrayRegion(T_FLOAT, jfloat, Float)1781WRAPPER_SetScalarArrayRegion(T_DOUBLE, jdouble, Double)17821783JNI_ENTRY_CHECKED(jint,1784checked_jni_RegisterNatives(JNIEnv *env,1785jclass clazz,1786const JNINativeMethod *methods,1787jint nMethods))1788functionEnter(thr);1789jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);1790functionExit(thr);1791return result;1792JNI_END17931794JNI_ENTRY_CHECKED(jint,1795checked_jni_UnregisterNatives(JNIEnv *env,1796jclass clazz))1797functionEnter(thr);1798jint result = UNCHECKED()->UnregisterNatives(env,clazz);1799functionExit(thr);1800return result;1801JNI_END18021803JNI_ENTRY_CHECKED(jint,1804checked_jni_MonitorEnter(JNIEnv *env,1805jobject obj))1806functionEnter(thr);1807IN_VM(1808jniCheck::validate_object(thr, obj);1809)1810jint result = UNCHECKED()->MonitorEnter(env,obj);1811functionExit(thr);1812return result;1813JNI_END18141815JNI_ENTRY_CHECKED(jint,1816checked_jni_MonitorExit(JNIEnv *env,1817jobject obj))1818functionEnterExceptionAllowed(thr);1819IN_VM(1820jniCheck::validate_object(thr, obj);1821)1822jint result = UNCHECKED()->MonitorExit(env,obj);1823functionExit(thr);1824return result;1825JNI_END18261827JNI_ENTRY_CHECKED(jint,1828checked_jni_GetJavaVM(JNIEnv *env,1829JavaVM **vm))1830functionEnter(thr);1831jint result = UNCHECKED()->GetJavaVM(env,vm);1832functionExit(thr);1833return result;1834JNI_END18351836JNI_ENTRY_CHECKED(void,1837checked_jni_GetStringRegion(JNIEnv *env,1838jstring str,1839jsize start,1840jsize len,1841jchar *buf))1842functionEnter(thr);1843IN_VM(1844checkString(thr, str);1845)1846UNCHECKED()->GetStringRegion(env, str, start, len, buf);1847functionExit(thr);1848JNI_END18491850JNI_ENTRY_CHECKED(void,1851checked_jni_GetStringUTFRegion(JNIEnv *env,1852jstring str,1853jsize start,1854jsize len,1855char *buf))1856functionEnter(thr);1857IN_VM(1858checkString(thr, str);1859)1860UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);1861functionExit(thr);1862JNI_END18631864JNI_ENTRY_CHECKED(void *,1865checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,1866jarray array,1867jboolean *isCopy))1868functionEnterCritical(thr);1869IN_VM(1870check_is_primitive_array(thr, array);1871)1872void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);1873if (result != NULL) {1874result = check_jni_wrap_copy_array(thr, array, result);1875}1876functionExit(thr);1877return result;1878JNI_END18791880JNI_ENTRY_CHECKED(void,1881checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,1882jarray array,1883void *carray,1884jint mode))1885functionEnterCriticalExceptionAllowed(thr);1886IN_VM(1887check_is_primitive_array(thr, array);1888)1889// Check the element array...1890void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical", array, carray, mode);1891UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);1892functionExit(thr);1893JNI_END18941895JNI_ENTRY_CHECKED(const jchar*,1896checked_jni_GetStringCritical(JNIEnv *env,1897jstring string,1898jboolean *isCopy))1899functionEnterCritical(thr);1900IN_VM(1901checkString(thr, string);1902)1903const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);1904functionExit(thr);1905return result;1906JNI_END19071908JNI_ENTRY_CHECKED(void,1909checked_jni_ReleaseStringCritical(JNIEnv *env,1910jstring str,1911const jchar *chars))1912functionEnterCriticalExceptionAllowed(thr);1913IN_VM(1914checkString(thr, str);1915)1916/* The Hotspot JNI code does not use the parameters, so just check the1917* string parameter as a minor sanity check1918*/1919UNCHECKED()->ReleaseStringCritical(env, str, chars);1920functionExit(thr);1921JNI_END19221923JNI_ENTRY_CHECKED(jweak,1924checked_jni_NewWeakGlobalRef(JNIEnv *env,1925jobject obj))1926functionEnter(thr);1927IN_VM(1928if (obj != NULL) {1929jniCheck::validate_handle(thr, obj);1930}1931)1932jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);1933functionExit(thr);1934return result;1935JNI_END19361937JNI_ENTRY_CHECKED(void,1938checked_jni_DeleteWeakGlobalRef(JNIEnv *env,1939jweak ref))1940functionEnterExceptionAllowed(thr);1941UNCHECKED()->DeleteWeakGlobalRef(env, ref);1942functionExit(thr);1943JNI_END19441945JNI_ENTRY_CHECKED(jboolean,1946checked_jni_ExceptionCheck(JNIEnv *env))1947thr->clear_pending_jni_exception_check();1948functionEnterExceptionAllowed(thr);1949jboolean result = UNCHECKED()->ExceptionCheck(env);1950functionExit(thr);1951return result;1952JNI_END19531954JNI_ENTRY_CHECKED(jobject,1955checked_jni_NewDirectByteBuffer(JNIEnv *env,1956void *address,1957jlong capacity))1958functionEnter(thr);1959jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);1960functionExit(thr);1961return result;1962JNI_END19631964JNI_ENTRY_CHECKED(void *,1965checked_jni_GetDirectBufferAddress(JNIEnv *env,1966jobject buf))1967functionEnter(thr);1968void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);1969functionExit(thr);1970return result;1971JNI_END19721973JNI_ENTRY_CHECKED(jlong,1974checked_jni_GetDirectBufferCapacity(JNIEnv *env,1975jobject buf))1976functionEnter(thr);1977jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);1978functionExit(thr);1979return result;1980JNI_END19811982JNI_ENTRY_CHECKED(jobjectRefType,1983checked_jni_GetObjectRefType(JNIEnv *env,1984jobject obj))1985functionEnter(thr);1986/* validate the object being passed */1987IN_VM(1988jniCheck::validate_object(thr, obj);1989)1990jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);1991functionExit(thr);1992return result;1993JNI_END199419951996JNI_ENTRY_CHECKED(jint,1997checked_jni_GetVersion(JNIEnv *env))1998functionEnter(thr);1999jint result = UNCHECKED()->GetVersion(env);2000functionExit(thr);2001return result;2002JNI_END2003200420052006/*2007* Structure containing all checked jni functions2008*/2009struct JNINativeInterface_ checked_jni_NativeInterface = {2010NULL,2011NULL,2012NULL,20132014NULL,20152016checked_jni_GetVersion,20172018checked_jni_DefineClass,2019checked_jni_FindClass,20202021checked_jni_FromReflectedMethod,2022checked_jni_FromReflectedField,20232024checked_jni_ToReflectedMethod,20252026checked_jni_GetSuperclass,2027checked_jni_IsAssignableFrom,20282029checked_jni_ToReflectedField,20302031checked_jni_Throw,2032checked_jni_ThrowNew,2033checked_jni_ExceptionOccurred,2034checked_jni_ExceptionDescribe,2035checked_jni_ExceptionClear,2036checked_jni_FatalError,20372038checked_jni_PushLocalFrame,2039checked_jni_PopLocalFrame,20402041checked_jni_NewGlobalRef,2042checked_jni_DeleteGlobalRef,2043checked_jni_DeleteLocalRef,2044checked_jni_IsSameObject,20452046checked_jni_NewLocalRef,2047checked_jni_EnsureLocalCapacity,20482049checked_jni_AllocObject,2050checked_jni_NewObject,2051checked_jni_NewObjectV,2052checked_jni_NewObjectA,20532054checked_jni_GetObjectClass,2055checked_jni_IsInstanceOf,20562057checked_jni_GetMethodID,20582059checked_jni_CallObjectMethod,2060checked_jni_CallObjectMethodV,2061checked_jni_CallObjectMethodA,2062checked_jni_CallBooleanMethod,2063checked_jni_CallBooleanMethodV,2064checked_jni_CallBooleanMethodA,2065checked_jni_CallByteMethod,2066checked_jni_CallByteMethodV,2067checked_jni_CallByteMethodA,2068checked_jni_CallCharMethod,2069checked_jni_CallCharMethodV,2070checked_jni_CallCharMethodA,2071checked_jni_CallShortMethod,2072checked_jni_CallShortMethodV,2073checked_jni_CallShortMethodA,2074checked_jni_CallIntMethod,2075checked_jni_CallIntMethodV,2076checked_jni_CallIntMethodA,2077checked_jni_CallLongMethod,2078checked_jni_CallLongMethodV,2079checked_jni_CallLongMethodA,2080checked_jni_CallFloatMethod,2081checked_jni_CallFloatMethodV,2082checked_jni_CallFloatMethodA,2083checked_jni_CallDoubleMethod,2084checked_jni_CallDoubleMethodV,2085checked_jni_CallDoubleMethodA,2086checked_jni_CallVoidMethod,2087checked_jni_CallVoidMethodV,2088checked_jni_CallVoidMethodA,20892090checked_jni_CallNonvirtualObjectMethod,2091checked_jni_CallNonvirtualObjectMethodV,2092checked_jni_CallNonvirtualObjectMethodA,2093checked_jni_CallNonvirtualBooleanMethod,2094checked_jni_CallNonvirtualBooleanMethodV,2095checked_jni_CallNonvirtualBooleanMethodA,2096checked_jni_CallNonvirtualByteMethod,2097checked_jni_CallNonvirtualByteMethodV,2098checked_jni_CallNonvirtualByteMethodA,2099checked_jni_CallNonvirtualCharMethod,2100checked_jni_CallNonvirtualCharMethodV,2101checked_jni_CallNonvirtualCharMethodA,2102checked_jni_CallNonvirtualShortMethod,2103checked_jni_CallNonvirtualShortMethodV,2104checked_jni_CallNonvirtualShortMethodA,2105checked_jni_CallNonvirtualIntMethod,2106checked_jni_CallNonvirtualIntMethodV,2107checked_jni_CallNonvirtualIntMethodA,2108checked_jni_CallNonvirtualLongMethod,2109checked_jni_CallNonvirtualLongMethodV,2110checked_jni_CallNonvirtualLongMethodA,2111checked_jni_CallNonvirtualFloatMethod,2112checked_jni_CallNonvirtualFloatMethodV,2113checked_jni_CallNonvirtualFloatMethodA,2114checked_jni_CallNonvirtualDoubleMethod,2115checked_jni_CallNonvirtualDoubleMethodV,2116checked_jni_CallNonvirtualDoubleMethodA,2117checked_jni_CallNonvirtualVoidMethod,2118checked_jni_CallNonvirtualVoidMethodV,2119checked_jni_CallNonvirtualVoidMethodA,21202121checked_jni_GetFieldID,21222123checked_jni_GetObjectField,2124checked_jni_GetBooleanField,2125checked_jni_GetByteField,2126checked_jni_GetCharField,2127checked_jni_GetShortField,2128checked_jni_GetIntField,2129checked_jni_GetLongField,2130checked_jni_GetFloatField,2131checked_jni_GetDoubleField,21322133checked_jni_SetObjectField,2134checked_jni_SetBooleanField,2135checked_jni_SetByteField,2136checked_jni_SetCharField,2137checked_jni_SetShortField,2138checked_jni_SetIntField,2139checked_jni_SetLongField,2140checked_jni_SetFloatField,2141checked_jni_SetDoubleField,21422143checked_jni_GetStaticMethodID,21442145checked_jni_CallStaticObjectMethod,2146checked_jni_CallStaticObjectMethodV,2147checked_jni_CallStaticObjectMethodA,2148checked_jni_CallStaticBooleanMethod,2149checked_jni_CallStaticBooleanMethodV,2150checked_jni_CallStaticBooleanMethodA,2151checked_jni_CallStaticByteMethod,2152checked_jni_CallStaticByteMethodV,2153checked_jni_CallStaticByteMethodA,2154checked_jni_CallStaticCharMethod,2155checked_jni_CallStaticCharMethodV,2156checked_jni_CallStaticCharMethodA,2157checked_jni_CallStaticShortMethod,2158checked_jni_CallStaticShortMethodV,2159checked_jni_CallStaticShortMethodA,2160checked_jni_CallStaticIntMethod,2161checked_jni_CallStaticIntMethodV,2162checked_jni_CallStaticIntMethodA,2163checked_jni_CallStaticLongMethod,2164checked_jni_CallStaticLongMethodV,2165checked_jni_CallStaticLongMethodA,2166checked_jni_CallStaticFloatMethod,2167checked_jni_CallStaticFloatMethodV,2168checked_jni_CallStaticFloatMethodA,2169checked_jni_CallStaticDoubleMethod,2170checked_jni_CallStaticDoubleMethodV,2171checked_jni_CallStaticDoubleMethodA,2172checked_jni_CallStaticVoidMethod,2173checked_jni_CallStaticVoidMethodV,2174checked_jni_CallStaticVoidMethodA,21752176checked_jni_GetStaticFieldID,21772178checked_jni_GetStaticObjectField,2179checked_jni_GetStaticBooleanField,2180checked_jni_GetStaticByteField,2181checked_jni_GetStaticCharField,2182checked_jni_GetStaticShortField,2183checked_jni_GetStaticIntField,2184checked_jni_GetStaticLongField,2185checked_jni_GetStaticFloatField,2186checked_jni_GetStaticDoubleField,21872188checked_jni_SetStaticObjectField,2189checked_jni_SetStaticBooleanField,2190checked_jni_SetStaticByteField,2191checked_jni_SetStaticCharField,2192checked_jni_SetStaticShortField,2193checked_jni_SetStaticIntField,2194checked_jni_SetStaticLongField,2195checked_jni_SetStaticFloatField,2196checked_jni_SetStaticDoubleField,21972198checked_jni_NewString,2199checked_jni_GetStringLength,2200checked_jni_GetStringChars,2201checked_jni_ReleaseStringChars,22022203checked_jni_NewStringUTF,2204checked_jni_GetStringUTFLength,2205checked_jni_GetStringUTFChars,2206checked_jni_ReleaseStringUTFChars,22072208checked_jni_GetArrayLength,22092210checked_jni_NewObjectArray,2211checked_jni_GetObjectArrayElement,2212checked_jni_SetObjectArrayElement,22132214checked_jni_NewBooleanArray,2215checked_jni_NewByteArray,2216checked_jni_NewCharArray,2217checked_jni_NewShortArray,2218checked_jni_NewIntArray,2219checked_jni_NewLongArray,2220checked_jni_NewFloatArray,2221checked_jni_NewDoubleArray,22222223checked_jni_GetBooleanArrayElements,2224checked_jni_GetByteArrayElements,2225checked_jni_GetCharArrayElements,2226checked_jni_GetShortArrayElements,2227checked_jni_GetIntArrayElements,2228checked_jni_GetLongArrayElements,2229checked_jni_GetFloatArrayElements,2230checked_jni_GetDoubleArrayElements,22312232checked_jni_ReleaseBooleanArrayElements,2233checked_jni_ReleaseByteArrayElements,2234checked_jni_ReleaseCharArrayElements,2235checked_jni_ReleaseShortArrayElements,2236checked_jni_ReleaseIntArrayElements,2237checked_jni_ReleaseLongArrayElements,2238checked_jni_ReleaseFloatArrayElements,2239checked_jni_ReleaseDoubleArrayElements,22402241checked_jni_GetBooleanArrayRegion,2242checked_jni_GetByteArrayRegion,2243checked_jni_GetCharArrayRegion,2244checked_jni_GetShortArrayRegion,2245checked_jni_GetIntArrayRegion,2246checked_jni_GetLongArrayRegion,2247checked_jni_GetFloatArrayRegion,2248checked_jni_GetDoubleArrayRegion,22492250checked_jni_SetBooleanArrayRegion,2251checked_jni_SetByteArrayRegion,2252checked_jni_SetCharArrayRegion,2253checked_jni_SetShortArrayRegion,2254checked_jni_SetIntArrayRegion,2255checked_jni_SetLongArrayRegion,2256checked_jni_SetFloatArrayRegion,2257checked_jni_SetDoubleArrayRegion,22582259checked_jni_RegisterNatives,2260checked_jni_UnregisterNatives,22612262checked_jni_MonitorEnter,2263checked_jni_MonitorExit,22642265checked_jni_GetJavaVM,22662267checked_jni_GetStringRegion,2268checked_jni_GetStringUTFRegion,22692270checked_jni_GetPrimitiveArrayCritical,2271checked_jni_ReleasePrimitiveArrayCritical,22722273checked_jni_GetStringCritical,2274checked_jni_ReleaseStringCritical,22752276checked_jni_NewWeakGlobalRef,2277checked_jni_DeleteWeakGlobalRef,22782279checked_jni_ExceptionCheck,22802281checked_jni_NewDirectByteBuffer,2282checked_jni_GetDirectBufferAddress,2283checked_jni_GetDirectBufferCapacity,22842285// New 1.6 Features22862287checked_jni_GetObjectRefType2288};228922902291// Returns the function structure2292struct JNINativeInterface_* jni_functions_check() {22932294unchecked_jni_NativeInterface = jni_functions_nocheck();22952296// make sure the last pointer in the checked table is not null, indicating2297// an addition to the JNINativeInterface_ structure without initializing2298// it in the checked table.2299debug_only(int *lastPtr = (int *)((char *)&checked_jni_NativeInterface + \2300sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));)2301assert(*lastPtr != 0,2302"Mismatched JNINativeInterface tables, check for new entries");23032304// with -verbose:jni this message will print2305if (PrintJNIResolving) {2306tty->print_cr("Checked JNI functions are being used to " \2307"validate JNI usage");2308}23092310return &checked_jni_NativeInterface;2311}231223132314