Path: blob/master/src/hotspot/share/prims/jniCheck.cpp
41144 views
/*1* Copyright (c) 2001, 2021, 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 "jni.h"26#include "jvm.h"27#include "classfile/javaClasses.inline.hpp"28#include "classfile/vmClasses.hpp"29#include "classfile/vmSymbols.hpp"30#include "logging/log.hpp"31#include "logging/logTag.hpp"32#include "memory/allocation.inline.hpp"33#include "memory/guardedMemory.hpp"34#include "oops/instanceKlass.hpp"35#include "oops/oop.inline.hpp"36#include "oops/symbol.hpp"37#include "prims/jniCheck.hpp"38#include "prims/jvm_misc.hpp"39#include "runtime/fieldDescriptor.inline.hpp"40#include "runtime/handles.inline.hpp"41#include "runtime/interfaceSupport.inline.hpp"42#include "runtime/jfieldIDWorkaround.hpp"43#include "runtime/jniHandles.inline.hpp"44#include "runtime/thread.inline.hpp"45#include "utilities/formatBuffer.hpp"46#include "utilities/utf8.hpp"4748// Complain every extra number of unplanned local refs49#define CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD 325051// Heap objects are allowed to be directly referenced only in VM code,52// not in native code.5354#define ASSERT_OOPS_ALLOWED \55assert(JavaThread::current()->thread_state() == _thread_in_vm, \56"jniCheck examining oops in bad state.")575859// Execute the given block of source code with the thread in VM state.60// To do this, transition from the NATIVE state to the VM state, execute61// the code, and transtition back. The ThreadInVMfromNative constructor62// performs the transition to VM state, its destructor restores the63// NATIVE state.6465#define IN_VM(source_code) { \66{ \67ThreadInVMfromNative __tiv(thr); \68source_code \69} \70}717273/*74* DECLARATIONS75*/7677static struct JNINativeInterface_ * unchecked_jni_NativeInterface;787980/*81* MACRO DEFINITIONS82*/8384// All JNI checked functions here use JNI_ENTRY_CHECKED() instead of the85// QUICK_ENTRY or LEAF variants found in jni.cpp. This allows handles86// to be created if a fatal error should occur.8788// Check for thread not attached to VM; need to catch this before89// assertions in the wrapper routines might fire9091// Check for env being the one value appropriate for this thread.9293#define JNI_ENTRY_CHECKED(result_type, header) \94extern "C" { \95result_type JNICALL header { \96Thread* cur = Thread::current_or_null(); \97if (cur == NULL || !cur->is_Java_thread()) { \98tty->print_cr("%s", fatal_using_jnienv_in_nonjava); \99os::abort(true); \100} \101JavaThread* thr = cur->as_Java_thread(); \102JNIEnv* xenv = thr->jni_environment(); \103if (env != xenv) { \104NativeReportJNIFatalError(thr, warn_wrong_jnienv); \105} \106MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thr)); \107VM_ENTRY_BASE(result_type, header, thr)108109110#define UNCHECKED() (unchecked_jni_NativeInterface)111112static const char * warn_wrong_jnienv = "Using JNIEnv in the wrong thread";113static const char * warn_bad_class_descriptor1 = "JNI FindClass received a bad class descriptor \"";114static const char * warn_bad_class_descriptor2 = "\". A correct class descriptor " \115"has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases.";116static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread";117static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \118"Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical";119static const char * fatal_bad_ref_to_jni = "Bad global or local ref passed to JNI";120static const char * fatal_received_null_class = "JNI received a null class";121static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";122static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass";123static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";124static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call";125static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";126static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";127static const char * fatal_prim_type_array_expected = "Primitive type array expected but not received for JNI array operation";128static const char * fatal_non_array = "Non-array passed to JNI array operations";129static const char * fatal_element_type_mismatch = "Array element type mismatch in JNI";130static const char * fatal_should_be_static = "Non-static field ID passed to JNI";131static const char * fatal_wrong_static_field = "Wrong static field ID passed to JNI";132static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations";133static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations";134static const char * fatal_should_be_nonstatic = "Static field ID passed to JNI";135static const char * fatal_null_object = "Null object passed to JNI";136static const char * fatal_wrong_field = "Wrong field ID passed to JNI";137static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations";138static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations";139static const char * fatal_non_string = "JNI string operation received a non-string";140static const char * fatal_non_utf8_class_name1 = "JNI class name is not a valid UTF8 string \"";141static const char * fatal_non_utf8_class_name2 = "\"";142143144// When in VM state:145static void ReportJNIWarning(JavaThread* thr, const char *msg) {146tty->print_cr("WARNING in native method: %s", msg);147thr->print_stack();148}149150// When in NATIVE state:151static void NativeReportJNIFatalError(JavaThread* thr, const char *msg) {152IN_VM(153ReportJNIFatalError(thr, msg);154)155}156157static void NativeReportJNIWarning(JavaThread* thr, const char *msg) {158IN_VM(159ReportJNIWarning(thr, msg);160)161}162163164165166/*167* SUPPORT FUNCTIONS168*/169170/**171* Check whether or not a programmer has actually checked for exceptions. According172* to the JNI Specification ("jni/spec/design.html#java_exceptions"):173*174* There are two cases where the programmer needs to check for exceptions without175* being able to first check an error code:176*177* - The JNI functions that invoke a Java method return the result of the Java method.178* The programmer must call ExceptionOccurred() to check for possible exceptions179* that occurred during the execution of the Java method.180*181* - Some of the JNI array access functions do not return an error code, but may182* throw an ArrayIndexOutOfBoundsException or ArrayStoreException.183*184* In all other cases, a non-error return value guarantees that no exceptions have been thrown.185*186* Programmers often defend against ArrayIndexOutOfBoundsException, so warning187* for these functions would be pedantic.188*/189static inline void190check_pending_exception(JavaThread* thr) {191if (thr->has_pending_exception()) {192NativeReportJNIWarning(thr, "JNI call made with exception pending");193}194if (thr->is_pending_jni_exception_check()) {195IN_VM(196tty->print_cr("WARNING in native method: JNI call made without checking exceptions when required to from %s",197thr->get_pending_jni_exception_check());198thr->print_stack();199)200thr->clear_pending_jni_exception_check(); // Just complain once201}202}203204/**205* Add to the planned number of handles. I.e. plus current live & warning threshold206*/207static inline void208add_planned_handle_capacity(JNIHandleBlock* handles, size_t capacity) {209handles->set_planned_capacity(capacity +210handles->get_number_of_live_handles() +211CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);212}213214215static inline void216functionEnterCritical(JavaThread* thr)217{218check_pending_exception(thr);219}220221static inline void222functionEnterCriticalExceptionAllowed(JavaThread* thr)223{224}225226static inline void227functionEnter(JavaThread* thr)228{229if (thr->in_critical()) {230tty->print_cr("%s", warn_other_function_in_critical);231}232check_pending_exception(thr);233}234235static inline void236functionEnterExceptionAllowed(JavaThread* thr)237{238if (thr->in_critical()) {239tty->print_cr("%s", warn_other_function_in_critical);240}241}242243static inline void244functionExit(JavaThread* thr)245{246JNIHandleBlock* handles = thr->active_handles();247size_t planned_capacity = handles->get_planned_capacity();248size_t live_handles = handles->get_number_of_live_handles();249if (live_handles > planned_capacity) {250IN_VM(251tty->print_cr("WARNING: JNI local refs: " SIZE_FORMAT ", exceeds capacity: " SIZE_FORMAT,252live_handles, planned_capacity);253thr->print_stack();254)255// Complain just the once, reset to current + warn threshold256add_planned_handle_capacity(handles, 0);257}258}259260static inline void261checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)262{263fieldDescriptor fd;264265/* make sure it is a static field */266if (!jfieldIDWorkaround::is_static_jfieldID(fid))267ReportJNIFatalError(thr, fatal_should_be_static);268269/* validate the class being passed */270ASSERT_OOPS_ALLOWED;271Klass* k_oop = jniCheck::validate_class(thr, cls, false);272273/* check for proper subclass hierarchy */274JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);275Klass* f_oop = id->holder();276if (!k_oop->is_subtype_of(f_oop))277ReportJNIFatalError(thr, fatal_wrong_static_field);278279/* check for proper field type */280if (!id->find_local_field(&fd))281ReportJNIFatalError(thr, fatal_static_field_not_found);282if ((fd.field_type() != ftype) &&283!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {284ReportJNIFatalError(thr, fatal_static_field_mismatch);285}286}287288static inline void289checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)290{291fieldDescriptor fd;292293/* make sure it is an instance field */294if (jfieldIDWorkaround::is_static_jfieldID(fid))295ReportJNIFatalError(thr, fatal_should_be_nonstatic);296297/* validate the object being passed and then get its class */298ASSERT_OOPS_ALLOWED;299oop oopObj = jniCheck::validate_object(thr, obj);300if (oopObj == NULL) {301ReportJNIFatalError(thr, fatal_null_object);302}303Klass* k_oop = oopObj->klass();304305if (!jfieldIDWorkaround::is_valid_jfieldID(k_oop, fid)) {306ReportJNIFatalError(thr, fatal_wrong_field);307}308309/* make sure the field exists */310int offset = jfieldIDWorkaround::from_instance_jfieldID(k_oop, fid);311if (!InstanceKlass::cast(k_oop)->contains_field_offset(offset))312ReportJNIFatalError(thr, fatal_wrong_field);313314/* check for proper field type */315if (!InstanceKlass::cast(k_oop)->find_field_from_offset(offset,316false, &fd))317ReportJNIFatalError(thr, fatal_instance_field_not_found);318319if ((fd.field_type() != ftype) &&320!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {321ReportJNIFatalError(thr, fatal_instance_field_mismatch);322}323}324325static inline void326checkString(JavaThread* thr, jstring js)327{328ASSERT_OOPS_ALLOWED;329oop s = jniCheck::validate_object(thr, js);330if ((s == NULL) || !java_lang_String::is_instance(s))331ReportJNIFatalError(thr, fatal_non_string);332}333334static inline arrayOop335check_is_array(JavaThread* thr, jarray jArray)336{337ASSERT_OOPS_ALLOWED;338arrayOop aOop;339340aOop = (arrayOop)jniCheck::validate_object(thr, jArray);341if (aOop == NULL || !aOop->is_array()) {342ReportJNIFatalError(thr, fatal_non_array);343}344return aOop;345}346347static inline arrayOop348check_is_primitive_array(JavaThread* thr, jarray jArray) {349arrayOop aOop = check_is_array(thr, jArray);350351if (!aOop->is_typeArray()) {352ReportJNIFatalError(thr, fatal_prim_type_array_expected);353}354return aOop;355}356357static inline void358check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)359{360BasicType array_type;361arrayOop aOop;362363aOop = check_is_primitive_array(thr, jArray);364array_type = TypeArrayKlass::cast(aOop->klass())->element_type();365if (array_type != elementType) {366ReportJNIFatalError(thr, fatal_element_type_mismatch);367}368}369370static inline void371check_is_obj_array(JavaThread* thr, jarray jArray) {372arrayOop aOop = check_is_array(thr, jArray);373if (!aOop->is_objArray()) {374ReportJNIFatalError(thr, fatal_object_array_expected);375}376}377378/*379* Copy and wrap array elements for bounds checking.380* Remember the original elements (GuardedMemory::get_tag())381*/382static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,383void* orig_elements) {384void* result;385IN_VM(386oop a = JNIHandles::resolve_non_null(array);387size_t len = arrayOop(a)->length() <<388TypeArrayKlass::cast(a->klass())->log2_element_size();389result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);390)391return result;392}393394static void* check_wrapped_array(JavaThread* thr, const char* fn_name,395void* obj, void* carray, size_t* rsz) {396if (carray == NULL) {397tty->print_cr("%s: elements vector NULL" PTR_FORMAT, fn_name, p2i(obj));398NativeReportJNIFatalError(thr, "Elements vector NULL");399}400GuardedMemory guarded(carray);401void* orig_result = guarded.get_tag();402if (!guarded.verify_guards()) {403tty->print_cr("%s: release array failed bounds check, incorrect pointer returned ? array: "404PTR_FORMAT " carray: " PTR_FORMAT, fn_name, p2i(obj), p2i(carray));405DEBUG_ONLY(guarded.print_on(tty);) // This may crash.406NativeReportJNIFatalError(thr, err_msg("%s: failed bounds check", fn_name));407}408if (orig_result == NULL) {409tty->print_cr("%s: unrecognized elements. array: " PTR_FORMAT " carray: " PTR_FORMAT,410fn_name, p2i(obj), p2i(carray));411DEBUG_ONLY(guarded.print_on(tty);) // This may crash.412NativeReportJNIFatalError(thr, err_msg("%s: unrecognized elements", fn_name));413}414if (rsz != NULL) {415*rsz = guarded.get_user_size();416}417return orig_result;418}419420static void* check_wrapped_array_release(JavaThread* thr, const char* fn_name,421void* obj, void* carray, jint mode, jboolean is_critical) {422size_t sz;423void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz);424switch (mode) {425case 0:426memcpy(orig_result, carray, sz);427GuardedMemory::free_copy(carray);428break;429case JNI_COMMIT:430memcpy(orig_result, carray, sz);431if (is_critical) {432// For ReleasePrimitiveArrayCritical we must free the internal buffer433// allocated through GuardedMemory.434GuardedMemory::free_copy(carray);435}436break;437case JNI_ABORT:438GuardedMemory::free_copy(carray);439break;440default:441tty->print_cr("%s: Unrecognized mode %i releasing array "442PTR_FORMAT " elements " PTR_FORMAT, fn_name, mode, p2i(obj), p2i(carray));443NativeReportJNIFatalError(thr, "Unrecognized array release mode");444}445return orig_result;446}447448oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {449if ((obj != NULL) && (JNIHandles::handle_type(thr, obj) != JNIInvalidRefType)) {450ASSERT_OOPS_ALLOWED;451return JNIHandles::resolve_external_guard(obj);452}453ReportJNIFatalError(thr, fatal_bad_ref_to_jni);454return NULL;455}456457458Method* jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {459ASSERT_OOPS_ALLOWED;460// do the fast jmethodID check first461Method* m = Method::checked_resolve_jmethod_id(method_id);462if (m == NULL) {463ReportJNIFatalError(thr, fatal_wrong_class_or_method);464}465// jmethodIDs are handles in the class loader data,466// but that can be expensive so check it last467else if (!Method::is_method_id(method_id)) {468ReportJNIFatalError(thr, fatal_non_weak_method);469}470return m;471}472473474oop jniCheck::validate_object(JavaThread* thr, jobject obj) {475if (obj == NULL) return NULL;476ASSERT_OOPS_ALLOWED;477oop oopObj = jniCheck::validate_handle(thr, obj);478if (oopObj == NULL) {479ReportJNIFatalError(thr, fatal_bad_ref_to_jni);480}481return oopObj;482}483484// Warn if a class descriptor is in decorated form; class descriptors485// passed to JNI findClass should not be decorated unless they are486// array descriptors.487void jniCheck::validate_class_descriptor(JavaThread* thr, const char* name) {488if (name == NULL) return; // implementation accepts NULL so just return489490size_t len = strlen(name);491492if (len >= 2 &&493name[0] == JVM_SIGNATURE_CLASS && // 'L'494name[len-1] == JVM_SIGNATURE_ENDCLASS ) { // ';'495char msg[JVM_MAXPATHLEN];496jio_snprintf(msg, JVM_MAXPATHLEN, "%s%s%s",497warn_bad_class_descriptor1, name, warn_bad_class_descriptor2);498ReportJNIWarning(thr, msg);499}500501// Verify that the class name given is a valid utf8 string502if (!UTF8::is_legal_utf8((const unsigned char*)name, (int)strlen(name), false)) {503char msg[JVM_MAXPATHLEN];504jio_snprintf(msg, JVM_MAXPATHLEN, "%s%s%s", fatal_non_utf8_class_name1, name, fatal_non_utf8_class_name2);505ReportJNIFatalError(thr, msg);506}507}508509Klass* jniCheck::validate_class(JavaThread* thr, jclass clazz, bool allow_primitive) {510ASSERT_OOPS_ALLOWED;511oop mirror = jniCheck::validate_handle(thr, clazz);512if (mirror == NULL) {513ReportJNIFatalError(thr, fatal_received_null_class);514}515516if (mirror->klass() != vmClasses::Class_klass()) {517ReportJNIFatalError(thr, fatal_class_not_a_class);518}519520Klass* k = java_lang_Class::as_Klass(mirror);521// Make allowances for primitive classes ...522if (!(k != NULL || (allow_primitive && java_lang_Class::is_primitive(mirror)))) {523ReportJNIFatalError(thr, fatal_class_not_a_class);524}525return k;526}527528void jniCheck::validate_throwable_klass(JavaThread* thr, Klass* klass) {529ASSERT_OOPS_ALLOWED;530assert(klass != NULL, "klass argument must have a value");531532if (!klass->is_instance_klass() ||533!klass->is_subclass_of(vmClasses::Throwable_klass())) {534ReportJNIFatalError(thr, fatal_class_not_a_throwable_class);535}536}537538void jniCheck::validate_call(JavaThread* thr, jclass clazz, jmethodID method_id, jobject obj) {539ASSERT_OOPS_ALLOWED;540Method* m = jniCheck::validate_jmethod_id(thr, method_id);541InstanceKlass* holder = m->method_holder();542543if (clazz != NULL) {544Klass* k = jniCheck::validate_class(thr, clazz, false);545// Check that method is in the class, must be InstanceKlass546if (!InstanceKlass::cast(k)->is_subtype_of(holder)) {547ReportJNIFatalError(thr, fatal_wrong_class_or_method);548}549}550551if (obj != NULL) {552oop recv = jniCheck::validate_object(thr, obj);553assert(recv != NULL, "validate_object checks that");554Klass* rk = recv->klass();555556// Check that the object is a subtype of method holder too.557if (!rk->is_subtype_of(holder)) {558ReportJNIFatalError(thr, fatal_wrong_class_or_method);559}560}561}562563564/*565* IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE566*/567568JNI_ENTRY_CHECKED(jclass,569checked_jni_DefineClass(JNIEnv *env,570const char *name,571jobject loader,572const jbyte *buf,573jsize len))574functionEnter(thr);575IN_VM(576jniCheck::validate_object(thr, loader);577)578jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);579functionExit(thr);580return result;581JNI_END582583JNI_ENTRY_CHECKED(jclass,584checked_jni_FindClass(JNIEnv *env,585const char *name))586functionEnter(thr);587IN_VM(588jniCheck::validate_class_descriptor(thr, name);589)590jclass result = UNCHECKED()->FindClass(env, name);591functionExit(thr);592return result;593JNI_END594595JNI_ENTRY_CHECKED(jmethodID,596checked_jni_FromReflectedMethod(JNIEnv *env,597jobject method))598functionEnter(thr);599IN_VM(600jniCheck::validate_object(thr, method);601)602jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);603functionExit(thr);604return result;605JNI_END606607JNI_ENTRY_CHECKED(jfieldID,608checked_jni_FromReflectedField(JNIEnv *env,609jobject field))610functionEnter(thr);611IN_VM(612jniCheck::validate_object(thr, field);613)614jfieldID result = UNCHECKED()->FromReflectedField(env, field);615functionExit(thr);616return result;617JNI_END618619JNI_ENTRY_CHECKED(jobject,620checked_jni_ToReflectedMethod(JNIEnv *env,621jclass cls,622jmethodID methodID,623jboolean isStatic))624functionEnter(thr);625IN_VM(626jniCheck::validate_call(thr, cls, methodID);627)628jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,629isStatic);630functionExit(thr);631return result;632JNI_END633634JNI_ENTRY_CHECKED(jclass,635checked_jni_GetSuperclass(JNIEnv *env,636jclass sub))637functionEnter(thr);638IN_VM(639jniCheck::validate_class(thr, sub, true);640)641jclass result = UNCHECKED()->GetSuperclass(env, sub);642functionExit(thr);643return result;644JNI_END645646JNI_ENTRY_CHECKED(jboolean,647checked_jni_IsAssignableFrom(JNIEnv *env,648jclass sub,649jclass sup))650functionEnter(thr);651IN_VM(652jniCheck::validate_class(thr, sub, true);653jniCheck::validate_class(thr, sup, true);654)655jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);656functionExit(thr);657return result;658JNI_END659660JNI_ENTRY_CHECKED(jobject,661checked_jni_ToReflectedField(JNIEnv *env,662jclass cls,663jfieldID fieldID,664jboolean isStatic))665functionEnter(thr);666IN_VM(667jniCheck::validate_class(thr, cls, false);668)669jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,670isStatic);671functionExit(thr);672return result;673JNI_END674675JNI_ENTRY_CHECKED(jint,676checked_jni_Throw(JNIEnv *env,677jthrowable obj))678functionEnter(thr);679IN_VM(680oop oopObj = jniCheck::validate_object(thr, obj);681if (oopObj == NULL) {682// Unchecked Throw tolerates a NULL obj, so just warn683ReportJNIWarning(thr, "JNI Throw called with NULL throwable");684} else {685jniCheck::validate_throwable_klass(thr, oopObj->klass());686}687)688jint result = UNCHECKED()->Throw(env, obj);689functionExit(thr);690return result;691JNI_END692693JNI_ENTRY_CHECKED(jint,694checked_jni_ThrowNew(JNIEnv *env,695jclass clazz,696const char *msg))697functionEnter(thr);698IN_VM(699Klass* k = jniCheck::validate_class(thr, clazz, false);700assert(k != NULL, "validate_class shouldn't return NULL Klass*");701jniCheck::validate_throwable_klass(thr, k);702)703jint result = UNCHECKED()->ThrowNew(env, clazz, msg);704functionExit(thr);705return result;706JNI_END707708JNI_ENTRY_CHECKED(jthrowable,709checked_jni_ExceptionOccurred(JNIEnv *env))710thr->clear_pending_jni_exception_check();711functionEnterExceptionAllowed(thr);712jthrowable result = UNCHECKED()->ExceptionOccurred(env);713functionExit(thr);714return result;715JNI_END716717JNI_ENTRY_CHECKED(void,718checked_jni_ExceptionDescribe(JNIEnv *env))719functionEnterExceptionAllowed(thr);720UNCHECKED()->ExceptionDescribe(env);721functionExit(thr);722JNI_END723724JNI_ENTRY_CHECKED(void,725checked_jni_ExceptionClear(JNIEnv *env))726thr->clear_pending_jni_exception_check();727functionEnterExceptionAllowed(thr);728UNCHECKED()->ExceptionClear(env);729functionExit(thr);730JNI_END731732JNI_ENTRY_CHECKED(void,733checked_jni_FatalError(JNIEnv *env,734const char *msg))735thr->clear_pending_jni_exception_check();736functionEnter(thr);737UNCHECKED()->FatalError(env, msg);738functionExit(thr);739JNI_END740741JNI_ENTRY_CHECKED(jint,742checked_jni_PushLocalFrame(JNIEnv *env,743jint capacity))744functionEnterExceptionAllowed(thr);745if (capacity < 0)746NativeReportJNIFatalError(thr, "negative capacity");747jint result = UNCHECKED()->PushLocalFrame(env, capacity);748if (result == JNI_OK) {749add_planned_handle_capacity(thr->active_handles(), capacity);750}751functionExit(thr);752return result;753JNI_END754755JNI_ENTRY_CHECKED(jobject,756checked_jni_PopLocalFrame(JNIEnv *env,757jobject result))758functionEnterExceptionAllowed(thr);759jobject res = UNCHECKED()->PopLocalFrame(env, result);760functionExit(thr);761return res;762JNI_END763764JNI_ENTRY_CHECKED(jobject,765checked_jni_NewGlobalRef(JNIEnv *env,766jobject lobj))767functionEnter(thr);768IN_VM(769if (lobj != NULL) {770jniCheck::validate_handle(thr, lobj);771}772)773jobject result = UNCHECKED()->NewGlobalRef(env,lobj);774functionExit(thr);775return result;776JNI_END777778JNI_ENTRY_CHECKED(void,779checked_jni_DeleteGlobalRef(JNIEnv *env,780jobject gref))781functionEnterExceptionAllowed(thr);782IN_VM(783jniCheck::validate_object(thr, gref);784if (gref && !JNIHandles::is_global_handle(gref)) {785ReportJNIFatalError(thr,786"Invalid global JNI handle passed to DeleteGlobalRef");787}788)789UNCHECKED()->DeleteGlobalRef(env,gref);790functionExit(thr);791JNI_END792793JNI_ENTRY_CHECKED(void,794checked_jni_DeleteLocalRef(JNIEnv *env,795jobject obj))796functionEnterExceptionAllowed(thr);797IN_VM(798jniCheck::validate_object(thr, obj);799if (obj && !(JNIHandles::is_local_handle(thr, obj) ||800JNIHandles::is_frame_handle(thr, obj)))801ReportJNIFatalError(thr,802"Invalid local JNI handle passed to DeleteLocalRef");803)804UNCHECKED()->DeleteLocalRef(env, obj);805functionExit(thr);806JNI_END807808JNI_ENTRY_CHECKED(jboolean,809checked_jni_IsSameObject(JNIEnv *env,810jobject obj1,811jobject obj2))812functionEnterExceptionAllowed(thr);813IN_VM(814/* This JNI function can be used to compare weak global references815* to NULL objects. If the handles are valid, but contain NULL,816* then don't attempt to validate the object.817*/818if (obj1 != NULL && jniCheck::validate_handle(thr, obj1) != NULL) {819jniCheck::validate_object(thr, obj1);820}821if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {822jniCheck::validate_object(thr, obj2);823}824)825jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);826functionExit(thr);827return result;828JNI_END829830JNI_ENTRY_CHECKED(jobject,831checked_jni_NewLocalRef(JNIEnv *env,832jobject ref))833functionEnter(thr);834IN_VM(835if (ref != NULL) {836jniCheck::validate_handle(thr, ref);837}838)839jobject result = UNCHECKED()->NewLocalRef(env, ref);840functionExit(thr);841return result;842JNI_END843844JNI_ENTRY_CHECKED(jint,845checked_jni_EnsureLocalCapacity(JNIEnv *env,846jint capacity))847functionEnter(thr);848if (capacity < 0) {849NativeReportJNIFatalError(thr, "negative capacity");850}851jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);852if (result == JNI_OK) {853// increase local ref capacity if needed854if ((size_t)capacity > thr->active_handles()->get_planned_capacity()) {855add_planned_handle_capacity(thr->active_handles(), capacity);856}857}858functionExit(thr);859return result;860JNI_END861862JNI_ENTRY_CHECKED(jobject,863checked_jni_AllocObject(JNIEnv *env,864jclass clazz))865functionEnter(thr);866IN_VM(867jniCheck::validate_class(thr, clazz, false);868)869jobject result = UNCHECKED()->AllocObject(env,clazz);870functionExit(thr);871return result;872JNI_END873874JNI_ENTRY_CHECKED(jobject,875checked_jni_NewObject(JNIEnv *env,876jclass clazz,877jmethodID methodID,878...))879functionEnter(thr);880va_list args;881IN_VM(882jniCheck::validate_call(thr, clazz, methodID);883)884va_start(args, methodID);885jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);886va_end(args);887functionExit(thr);888return result;889JNI_END890891JNI_ENTRY_CHECKED(jobject,892checked_jni_NewObjectV(JNIEnv *env,893jclass clazz,894jmethodID methodID,895va_list args))896functionEnter(thr);897IN_VM(898jniCheck::validate_call(thr, clazz, methodID);899)900jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);901functionExit(thr);902return result;903JNI_END904905JNI_ENTRY_CHECKED(jobject,906checked_jni_NewObjectA(JNIEnv *env,907jclass clazz,908jmethodID methodID,909const jvalue *args))910functionEnter(thr);911IN_VM(912jniCheck::validate_call(thr, clazz, methodID);913)914jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);915functionExit(thr);916return result;917JNI_END918919JNI_ENTRY_CHECKED(jclass,920checked_jni_GetObjectClass(JNIEnv *env,921jobject obj))922functionEnter(thr);923IN_VM(924jniCheck::validate_object(thr, obj);925)926jclass result = UNCHECKED()->GetObjectClass(env,obj);927functionExit(thr);928return result;929JNI_END930931JNI_ENTRY_CHECKED(jboolean,932checked_jni_IsInstanceOf(JNIEnv *env,933jobject obj,934jclass clazz))935functionEnter(thr);936IN_VM(937jniCheck::validate_object(thr, obj);938jniCheck::validate_class(thr, clazz, true);939)940jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);941functionExit(thr);942return result;943JNI_END944945JNI_ENTRY_CHECKED(jmethodID,946checked_jni_GetMethodID(JNIEnv *env,947jclass clazz,948const char *name,949const char *sig))950functionEnter(thr);951IN_VM(952jniCheck::validate_class(thr, clazz, false);953)954jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);955functionExit(thr);956return result;957JNI_END958959#define WRAPPER_CallMethod(ResultType, Result) \960JNI_ENTRY_CHECKED(ResultType, \961checked_jni_Call##Result##Method(JNIEnv *env, \962jobject obj, \963jmethodID methodID, \964...)) \965functionEnter(thr); \966va_list args; \967IN_VM( \968jniCheck::validate_call(thr, NULL, methodID, obj); \969) \970va_start(args,methodID); \971ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \972args); \973va_end(args); \974thr->set_pending_jni_exception_check("Call"#Result"Method"); \975functionExit(thr); \976return result; \977JNI_END \978\979JNI_ENTRY_CHECKED(ResultType, \980checked_jni_Call##Result##MethodV(JNIEnv *env, \981jobject obj, \982jmethodID methodID, \983va_list args)) \984functionEnter(thr); \985IN_VM(\986jniCheck::validate_call(thr, NULL, methodID, obj); \987) \988ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\989args); \990thr->set_pending_jni_exception_check("Call"#Result"MethodV"); \991functionExit(thr); \992return result; \993JNI_END \994\995JNI_ENTRY_CHECKED(ResultType, \996checked_jni_Call##Result##MethodA(JNIEnv *env, \997jobject obj, \998jmethodID methodID, \999const jvalue * args)) \1000functionEnter(thr); \1001IN_VM( \1002jniCheck::validate_call(thr, NULL, methodID, obj); \1003) \1004ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\1005args); \1006thr->set_pending_jni_exception_check("Call"#Result"MethodA"); \1007functionExit(thr); \1008return result; \1009JNI_END10101011WRAPPER_CallMethod(jobject,Object)1012WRAPPER_CallMethod(jboolean,Boolean)1013WRAPPER_CallMethod(jbyte,Byte)1014WRAPPER_CallMethod(jshort,Short)1015WRAPPER_CallMethod(jchar,Char)1016WRAPPER_CallMethod(jint,Int)1017WRAPPER_CallMethod(jlong,Long)1018WRAPPER_CallMethod(jfloat,Float)1019WRAPPER_CallMethod(jdouble,Double)10201021JNI_ENTRY_CHECKED(void,1022checked_jni_CallVoidMethod(JNIEnv *env, \1023jobject obj, \1024jmethodID methodID, \1025...))1026functionEnter(thr);1027va_list args;1028IN_VM(1029jniCheck::validate_call(thr, NULL, methodID, obj);1030)1031va_start(args,methodID);1032UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);1033va_end(args);1034thr->set_pending_jni_exception_check("CallVoidMethod");1035functionExit(thr);1036JNI_END10371038JNI_ENTRY_CHECKED(void,1039checked_jni_CallVoidMethodV(JNIEnv *env,1040jobject obj,1041jmethodID methodID,1042va_list args))1043functionEnter(thr);1044IN_VM(1045jniCheck::validate_call(thr, NULL, methodID, obj);1046)1047UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);1048thr->set_pending_jni_exception_check("CallVoidMethodV");1049functionExit(thr);1050JNI_END10511052JNI_ENTRY_CHECKED(void,1053checked_jni_CallVoidMethodA(JNIEnv *env,1054jobject obj,1055jmethodID methodID,1056const jvalue * args))1057functionEnter(thr);1058IN_VM(1059jniCheck::validate_call(thr, NULL, methodID, obj);1060)1061UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);1062thr->set_pending_jni_exception_check("CallVoidMethodA");1063functionExit(thr);1064JNI_END10651066#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \1067JNI_ENTRY_CHECKED(ResultType, \1068checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \1069jobject obj, \1070jclass clazz, \1071jmethodID methodID, \1072...)) \1073functionEnter(thr); \1074va_list args; \1075IN_VM( \1076jniCheck::validate_call(thr, clazz, methodID, obj); \1077) \1078va_start(args,methodID); \1079ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \1080obj, \1081clazz, \1082methodID,\1083args); \1084va_end(args); \1085thr->set_pending_jni_exception_check("CallNonvirtual"#Result"Method"); \1086functionExit(thr); \1087return result; \1088JNI_END \1089\1090JNI_ENTRY_CHECKED(ResultType, \1091checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \1092jobject obj, \1093jclass clazz, \1094jmethodID methodID, \1095va_list args)) \1096functionEnter(thr); \1097IN_VM( \1098jniCheck::validate_call(thr, clazz, methodID, obj); \1099) \1100ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \1101obj, \1102clazz, \1103methodID,\1104args); \1105thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodV"); \1106functionExit(thr); \1107return result; \1108JNI_END \1109\1110JNI_ENTRY_CHECKED(ResultType, \1111checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \1112jobject obj, \1113jclass clazz, \1114jmethodID methodID, \1115const jvalue * args)) \1116functionEnter(thr); \1117IN_VM( \1118jniCheck::validate_call(thr, clazz, methodID, obj); \1119) \1120ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \1121obj, \1122clazz, \1123methodID,\1124args); \1125thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodA"); \1126functionExit(thr); \1127return result; \1128JNI_END11291130WRAPPER_CallNonvirtualMethod(jobject,Object)1131WRAPPER_CallNonvirtualMethod(jboolean,Boolean)1132WRAPPER_CallNonvirtualMethod(jbyte,Byte)1133WRAPPER_CallNonvirtualMethod(jshort,Short)1134WRAPPER_CallNonvirtualMethod(jchar,Char)1135WRAPPER_CallNonvirtualMethod(jint,Int)1136WRAPPER_CallNonvirtualMethod(jlong,Long)1137WRAPPER_CallNonvirtualMethod(jfloat,Float)1138WRAPPER_CallNonvirtualMethod(jdouble,Double)11391140JNI_ENTRY_CHECKED(void,1141checked_jni_CallNonvirtualVoidMethod(JNIEnv *env,1142jobject obj,1143jclass clazz,1144jmethodID methodID,1145...))1146functionEnter(thr);1147va_list args;1148IN_VM(1149jniCheck::validate_call(thr, clazz, methodID, obj);1150)1151va_start(args,methodID);1152UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);1153va_end(args);1154thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");1155functionExit(thr);1156JNI_END11571158JNI_ENTRY_CHECKED(void,1159checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,1160jobject obj,1161jclass clazz,1162jmethodID methodID,1163va_list args))1164functionEnter(thr);1165IN_VM(1166jniCheck::validate_call(thr, clazz, methodID, obj);1167)1168UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);1169thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");1170functionExit(thr);1171JNI_END11721173JNI_ENTRY_CHECKED(void,1174checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,1175jobject obj,1176jclass clazz,1177jmethodID methodID,1178const jvalue * args))1179functionEnter(thr);1180IN_VM(1181jniCheck::validate_call(thr, clazz, methodID, obj);1182)1183UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);1184thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");1185functionExit(thr);1186JNI_END11871188JNI_ENTRY_CHECKED(jfieldID,1189checked_jni_GetFieldID(JNIEnv *env,1190jclass clazz,1191const char *name,1192const char *sig))1193functionEnter(thr);1194IN_VM(1195jniCheck::validate_class(thr, clazz, false);1196)1197jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);1198functionExit(thr);1199return result;1200JNI_END12011202#define WRAPPER_GetField(ReturnType,Result,FieldType) \1203JNI_ENTRY_CHECKED(ReturnType, \1204checked_jni_Get##Result##Field(JNIEnv *env, \1205jobject obj, \1206jfieldID fieldID)) \1207functionEnter(thr); \1208IN_VM( \1209checkInstanceFieldID(thr, fieldID, obj, FieldType); \1210) \1211ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \1212functionExit(thr); \1213return result; \1214JNI_END12151216WRAPPER_GetField(jobject, Object, T_OBJECT)1217WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)1218WRAPPER_GetField(jbyte, Byte, T_BYTE)1219WRAPPER_GetField(jshort, Short, T_SHORT)1220WRAPPER_GetField(jchar, Char, T_CHAR)1221WRAPPER_GetField(jint, Int, T_INT)1222WRAPPER_GetField(jlong, Long, T_LONG)1223WRAPPER_GetField(jfloat, Float, T_FLOAT)1224WRAPPER_GetField(jdouble, Double, T_DOUBLE)12251226#define WRAPPER_SetField(ValueType,Result,FieldType) \1227JNI_ENTRY_CHECKED(void, \1228checked_jni_Set##Result##Field(JNIEnv *env, \1229jobject obj, \1230jfieldID fieldID, \1231ValueType val)) \1232functionEnter(thr); \1233IN_VM( \1234checkInstanceFieldID(thr, fieldID, obj, FieldType); \1235) \1236UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \1237functionExit(thr); \1238JNI_END12391240WRAPPER_SetField(jobject, Object, T_OBJECT)1241WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)1242WRAPPER_SetField(jbyte, Byte, T_BYTE)1243WRAPPER_SetField(jshort, Short, T_SHORT)1244WRAPPER_SetField(jchar, Char, T_CHAR)1245WRAPPER_SetField(jint, Int, T_INT)1246WRAPPER_SetField(jlong, Long, T_LONG)1247WRAPPER_SetField(jfloat, Float, T_FLOAT)1248WRAPPER_SetField(jdouble, Double, T_DOUBLE)124912501251JNI_ENTRY_CHECKED(jmethodID,1252checked_jni_GetStaticMethodID(JNIEnv *env,1253jclass clazz,1254const char *name,1255const char *sig))1256functionEnter(thr);1257IN_VM(1258jniCheck::validate_class(thr, clazz, false);1259)1260jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);1261functionExit(thr);1262return result;1263JNI_END12641265#define WRAPPER_CallStaticMethod(ReturnType,Result) \1266JNI_ENTRY_CHECKED(ReturnType, \1267checked_jni_CallStatic##Result##Method(JNIEnv *env, \1268jclass clazz, \1269jmethodID methodID, \1270...)) \1271functionEnter(thr); \1272va_list args; \1273IN_VM( \1274jniCheck::validate_call(thr, clazz, methodID); \1275) \1276va_start(args,methodID); \1277ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \1278clazz, \1279methodID, \1280args); \1281va_end(args); \1282thr->set_pending_jni_exception_check("CallStatic"#Result"Method"); \1283functionExit(thr); \1284return result; \1285JNI_END \1286\1287JNI_ENTRY_CHECKED(ReturnType, \1288checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \1289jclass clazz, \1290jmethodID methodID,\1291va_list args)) \1292functionEnter(thr); \1293IN_VM( \1294jniCheck::validate_call(thr, clazz, methodID); \1295) \1296ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \1297clazz, \1298methodID, \1299args); \1300thr->set_pending_jni_exception_check("CallStatic"#Result"MethodV"); \1301functionExit(thr); \1302return result; \1303JNI_END \1304\1305JNI_ENTRY_CHECKED(ReturnType, \1306checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \1307jclass clazz, \1308jmethodID methodID, \1309const jvalue *args)) \1310functionEnter(thr); \1311IN_VM( \1312jniCheck::validate_call(thr, clazz, methodID); \1313) \1314ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \1315clazz, \1316methodID, \1317args); \1318thr->set_pending_jni_exception_check("CallStatic"#Result"MethodA"); \1319functionExit(thr); \1320return result; \1321JNI_END13221323WRAPPER_CallStaticMethod(jobject,Object)1324WRAPPER_CallStaticMethod(jboolean,Boolean)1325WRAPPER_CallStaticMethod(jbyte,Byte)1326WRAPPER_CallStaticMethod(jshort,Short)1327WRAPPER_CallStaticMethod(jchar,Char)1328WRAPPER_CallStaticMethod(jint,Int)1329WRAPPER_CallStaticMethod(jlong,Long)1330WRAPPER_CallStaticMethod(jfloat,Float)1331WRAPPER_CallStaticMethod(jdouble,Double)13321333JNI_ENTRY_CHECKED(void,1334checked_jni_CallStaticVoidMethod(JNIEnv *env,1335jclass cls,1336jmethodID methodID,1337...))1338functionEnter(thr);1339va_list args;1340IN_VM(1341jniCheck::validate_call(thr, cls, methodID);1342)1343va_start(args,methodID);1344UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);1345va_end(args);1346thr->set_pending_jni_exception_check("CallStaticVoidMethod");1347functionExit(thr);1348JNI_END13491350JNI_ENTRY_CHECKED(void,1351checked_jni_CallStaticVoidMethodV(JNIEnv *env,1352jclass cls,1353jmethodID methodID,1354va_list args))1355functionEnter(thr);1356IN_VM(1357jniCheck::validate_call(thr, cls, methodID);1358)1359UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);1360thr->set_pending_jni_exception_check("CallStaticVoidMethodV");1361functionExit(thr);1362JNI_END13631364JNI_ENTRY_CHECKED(void,1365checked_jni_CallStaticVoidMethodA(JNIEnv *env,1366jclass cls,1367jmethodID methodID,1368const jvalue * args))1369functionEnter(thr);1370IN_VM(1371jniCheck::validate_call(thr, cls, methodID);1372)1373UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);1374thr->set_pending_jni_exception_check("CallStaticVoidMethodA");1375functionExit(thr);1376JNI_END13771378JNI_ENTRY_CHECKED(jfieldID,1379checked_jni_GetStaticFieldID(JNIEnv *env,1380jclass clazz,1381const char *name,1382const char *sig))1383functionEnter(thr);1384IN_VM(1385jniCheck::validate_class(thr, clazz, false);1386)1387jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);1388functionExit(thr);1389return result;1390JNI_END13911392#define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \1393JNI_ENTRY_CHECKED(ReturnType, \1394checked_jni_GetStatic##Result##Field(JNIEnv *env, \1395jclass clazz, \1396jfieldID fieldID)) \1397functionEnter(thr); \1398IN_VM( \1399jniCheck::validate_class(thr, clazz, false); \1400checkStaticFieldID(thr, fieldID, clazz, FieldType); \1401) \1402ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \1403clazz, \1404fieldID); \1405functionExit(thr); \1406return result; \1407JNI_END14081409WRAPPER_GetStaticField(jobject, Object, T_OBJECT)1410WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)1411WRAPPER_GetStaticField(jbyte, Byte, T_BYTE)1412WRAPPER_GetStaticField(jshort, Short, T_SHORT)1413WRAPPER_GetStaticField(jchar, Char, T_CHAR)1414WRAPPER_GetStaticField(jint, Int, T_INT)1415WRAPPER_GetStaticField(jlong, Long, T_LONG)1416WRAPPER_GetStaticField(jfloat, Float, T_FLOAT)1417WRAPPER_GetStaticField(jdouble, Double, T_DOUBLE)14181419#define WRAPPER_SetStaticField(ValueType,Result,FieldType) \1420JNI_ENTRY_CHECKED(void, \1421checked_jni_SetStatic##Result##Field(JNIEnv *env, \1422jclass clazz, \1423jfieldID fieldID, \1424ValueType value)) \1425functionEnter(thr); \1426IN_VM( \1427jniCheck::validate_class(thr, clazz, false); \1428checkStaticFieldID(thr, fieldID, clazz, FieldType); \1429) \1430UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \1431functionExit(thr); \1432JNI_END14331434WRAPPER_SetStaticField(jobject, Object, T_OBJECT)1435WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)1436WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)1437WRAPPER_SetStaticField(jshort, Short, T_SHORT)1438WRAPPER_SetStaticField(jchar, Char, T_CHAR)1439WRAPPER_SetStaticField(jint, Int, T_INT)1440WRAPPER_SetStaticField(jlong, Long, T_LONG)1441WRAPPER_SetStaticField(jfloat, Float, T_FLOAT)1442WRAPPER_SetStaticField(jdouble, Double, T_DOUBLE)144314441445JNI_ENTRY_CHECKED(jstring,1446checked_jni_NewString(JNIEnv *env,1447const jchar *unicode,1448jsize len))1449functionEnter(thr);1450jstring result = UNCHECKED()->NewString(env,unicode,len);1451functionExit(thr);1452return result;1453JNI_END14541455JNI_ENTRY_CHECKED(jsize,1456checked_jni_GetStringLength(JNIEnv *env,1457jstring str))1458functionEnter(thr);1459IN_VM(1460checkString(thr, str);1461)1462jsize result = UNCHECKED()->GetStringLength(env,str);1463functionExit(thr);1464return result;1465JNI_END14661467// Arbitrary (but well-known) tag1468const void* STRING_TAG = (void*)0x47114711;14691470JNI_ENTRY_CHECKED(const jchar *,1471checked_jni_GetStringChars(JNIEnv *env,1472jstring str,1473jboolean *isCopy))1474functionEnter(thr);1475IN_VM(1476checkString(thr, str);1477)1478jchar* new_result = NULL;1479const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);1480assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");1481if (result != NULL) {1482size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination1483len *= sizeof(jchar);1484new_result = (jchar*) GuardedMemory::wrap_copy(result, len, STRING_TAG);1485if (new_result == NULL) {1486vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringChars");1487}1488// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes1489// Note that the dtrace arguments for the allocated memory will not match up with this solution.1490FreeHeap((char*)result);1491}1492functionExit(thr);1493return new_result;1494JNI_END14951496JNI_ENTRY_CHECKED(void,1497checked_jni_ReleaseStringChars(JNIEnv *env,1498jstring str,1499const jchar *chars))1500functionEnterExceptionAllowed(thr);1501IN_VM(1502checkString(thr, str);1503)1504if (chars == NULL) {1505// still do the unchecked call to allow dtrace probes1506UNCHECKED()->ReleaseStringChars(env,str,chars);1507}1508else {1509GuardedMemory guarded((void*)chars);1510if (!guarded.verify_guards()) {1511tty->print_cr("ReleaseStringChars: release chars failed bounds check. "1512"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));1513guarded.print_on(tty);1514NativeReportJNIFatalError(thr, "ReleaseStringChars: "1515"release chars failed bounds check.");1516}1517if (guarded.get_tag() != STRING_TAG) {1518tty->print_cr("ReleaseStringChars: called on something not allocated "1519"by GetStringChars. string: " PTR_FORMAT " chars: " PTR_FORMAT,1520p2i(str), p2i(chars));1521NativeReportJNIFatalError(thr, "ReleaseStringChars called on something "1522"not allocated by GetStringChars");1523}1524UNCHECKED()->ReleaseStringChars(env, str,1525(const jchar*) guarded.release_for_freeing());1526}1527functionExit(thr);1528JNI_END15291530JNI_ENTRY_CHECKED(jstring,1531checked_jni_NewStringUTF(JNIEnv *env,1532const char *utf))1533functionEnter(thr);1534jstring result = UNCHECKED()->NewStringUTF(env,utf);1535functionExit(thr);1536return result;1537JNI_END15381539JNI_ENTRY_CHECKED(jsize,1540checked_jni_GetStringUTFLength(JNIEnv *env,1541jstring str))1542functionEnter(thr);1543IN_VM(1544checkString(thr, str);1545)1546jsize result = UNCHECKED()->GetStringUTFLength(env,str);1547functionExit(thr);1548return result;1549JNI_END15501551// Arbitrary (but well-known) tag - different than GetStringChars1552const void* STRING_UTF_TAG = (void*) 0x48124812;15531554JNI_ENTRY_CHECKED(const char *,1555checked_jni_GetStringUTFChars(JNIEnv *env,1556jstring str,1557jboolean *isCopy))1558functionEnter(thr);1559IN_VM(1560checkString(thr, str);1561)1562char* new_result = NULL;1563const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);1564assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");1565if (result != NULL) {1566size_t len = strlen(result) + 1; // + 1 for NULL termination1567new_result = (char*) GuardedMemory::wrap_copy(result, len, STRING_UTF_TAG);1568if (new_result == NULL) {1569vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringUTFChars");1570}1571// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes1572// Note that the dtrace arguments for the allocated memory will not match up with this solution.1573FreeHeap((char*)result);1574}1575functionExit(thr);1576return new_result;1577JNI_END15781579JNI_ENTRY_CHECKED(void,1580checked_jni_ReleaseStringUTFChars(JNIEnv *env,1581jstring str,1582const char* chars))1583functionEnterExceptionAllowed(thr);1584IN_VM(1585checkString(thr, str);1586)1587if (chars == NULL) {1588// still do the unchecked call to allow dtrace probes1589UNCHECKED()->ReleaseStringUTFChars(env,str,chars);1590}1591else {1592GuardedMemory guarded((void*)chars);1593if (!guarded.verify_guards()) {1594tty->print_cr("ReleaseStringUTFChars: release chars failed bounds check. "1595"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));1596guarded.print_on(tty);1597NativeReportJNIFatalError(thr, "ReleaseStringUTFChars: "1598"release chars failed bounds check.");1599}1600if (guarded.get_tag() != STRING_UTF_TAG) {1601tty->print_cr("ReleaseStringUTFChars: called on something not "1602"allocated by GetStringUTFChars. string: " PTR_FORMAT " chars: "1603PTR_FORMAT, p2i(str), p2i(chars));1604NativeReportJNIFatalError(thr, "ReleaseStringUTFChars "1605"called on something not allocated by GetStringUTFChars");1606}1607UNCHECKED()->ReleaseStringUTFChars(env, str,1608(const char*) guarded.release_for_freeing());1609}1610functionExit(thr);1611JNI_END16121613JNI_ENTRY_CHECKED(jsize,1614checked_jni_GetArrayLength(JNIEnv *env,1615jarray array))1616functionEnter(thr);1617IN_VM(1618check_is_array(thr, array);1619)1620jsize result = UNCHECKED()->GetArrayLength(env,array);1621functionExit(thr);1622return result;1623JNI_END16241625JNI_ENTRY_CHECKED(jobjectArray,1626checked_jni_NewObjectArray(JNIEnv *env,1627jsize len,1628jclass clazz,1629jobject init))1630functionEnter(thr);1631jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);1632functionExit(thr);1633return result;1634JNI_END16351636JNI_ENTRY_CHECKED(jobject,1637checked_jni_GetObjectArrayElement(JNIEnv *env,1638jobjectArray array,1639jsize index))1640functionEnter(thr);1641IN_VM(1642check_is_obj_array(thr, array);1643)1644jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);1645functionExit(thr);1646return result;1647JNI_END16481649JNI_ENTRY_CHECKED(void,1650checked_jni_SetObjectArrayElement(JNIEnv *env,1651jobjectArray array,1652jsize index,1653jobject val))1654functionEnter(thr);1655IN_VM(1656check_is_obj_array(thr, array);1657)1658UNCHECKED()->SetObjectArrayElement(env,array,index,val);1659functionExit(thr);1660JNI_END16611662#define WRAPPER_NewScalarArray(Return, Result) \1663JNI_ENTRY_CHECKED(Return, \1664checked_jni_New##Result##Array(JNIEnv *env, \1665jsize len)) \1666functionEnter(thr); \1667Return result = UNCHECKED()->New##Result##Array(env,len); \1668functionExit(thr); \1669return (Return) result; \1670JNI_END16711672WRAPPER_NewScalarArray(jbooleanArray, Boolean)1673WRAPPER_NewScalarArray(jbyteArray, Byte)1674WRAPPER_NewScalarArray(jshortArray, Short)1675WRAPPER_NewScalarArray(jcharArray, Char)1676WRAPPER_NewScalarArray(jintArray, Int)1677WRAPPER_NewScalarArray(jlongArray, Long)1678WRAPPER_NewScalarArray(jfloatArray, Float)1679WRAPPER_NewScalarArray(jdoubleArray, Double)16801681#define WRAPPER_GetScalarArrayElements(ElementTag,ElementType,Result) \1682JNI_ENTRY_CHECKED(ElementType *, \1683checked_jni_Get##Result##ArrayElements(JNIEnv *env, \1684ElementType##Array array, \1685jboolean *isCopy)) \1686functionEnter(thr); \1687IN_VM( \1688check_primitive_array_type(thr, array, ElementTag); \1689) \1690ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \1691array, \1692isCopy); \1693if (result != NULL) { \1694result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \1695} \1696functionExit(thr); \1697return result; \1698JNI_END16991700WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)1701WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)1702WRAPPER_GetScalarArrayElements(T_SHORT, jshort, Short)1703WRAPPER_GetScalarArrayElements(T_CHAR, jchar, Char)1704WRAPPER_GetScalarArrayElements(T_INT, jint, Int)1705WRAPPER_GetScalarArrayElements(T_LONG, jlong, Long)1706WRAPPER_GetScalarArrayElements(T_FLOAT, jfloat, Float)1707WRAPPER_GetScalarArrayElements(T_DOUBLE, jdouble, Double)17081709#define WRAPPER_ReleaseScalarArrayElements(ElementTag,ElementType,Result,Tag) \1710JNI_ENTRY_CHECKED(void, \1711checked_jni_Release##Result##ArrayElements(JNIEnv *env, \1712ElementType##Array array, \1713ElementType *elems, \1714jint mode)) \1715functionEnterExceptionAllowed(thr); \1716IN_VM( \1717check_primitive_array_type(thr, array, ElementTag); \1718ASSERT_OOPS_ALLOWED; \1719typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \1720) \1721ElementType* orig_result = (ElementType *) check_wrapped_array_release( \1722thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode, JNI_FALSE); \1723UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \1724functionExit(thr); \1725JNI_END17261727WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)1728WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)1729WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)1730WRAPPER_ReleaseScalarArrayElements(T_CHAR, jchar, Char, char)1731WRAPPER_ReleaseScalarArrayElements(T_INT, jint, Int, int)1732WRAPPER_ReleaseScalarArrayElements(T_LONG, jlong, Long, long)1733WRAPPER_ReleaseScalarArrayElements(T_FLOAT, jfloat, Float, float)1734WRAPPER_ReleaseScalarArrayElements(T_DOUBLE, jdouble, Double, double)17351736#define WRAPPER_GetScalarArrayRegion(ElementTag,ElementType,Result) \1737JNI_ENTRY_CHECKED(void, \1738checked_jni_Get##Result##ArrayRegion(JNIEnv *env, \1739ElementType##Array array, \1740jsize start, \1741jsize len, \1742ElementType *buf)) \1743functionEnter(thr); \1744IN_VM( \1745check_primitive_array_type(thr, array, ElementTag); \1746) \1747UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \1748functionExit(thr); \1749JNI_END17501751WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)1752WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)1753WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)1754WRAPPER_GetScalarArrayRegion(T_CHAR, jchar, Char)1755WRAPPER_GetScalarArrayRegion(T_INT, jint, Int)1756WRAPPER_GetScalarArrayRegion(T_LONG, jlong, Long)1757WRAPPER_GetScalarArrayRegion(T_FLOAT, jfloat, Float)1758WRAPPER_GetScalarArrayRegion(T_DOUBLE, jdouble, Double)17591760#define WRAPPER_SetScalarArrayRegion(ElementTag,ElementType,Result) \1761JNI_ENTRY_CHECKED(void, \1762checked_jni_Set##Result##ArrayRegion(JNIEnv *env, \1763ElementType##Array array, \1764jsize start, \1765jsize len, \1766const ElementType *buf)) \1767functionEnter(thr); \1768IN_VM( \1769check_primitive_array_type(thr, array, ElementTag); \1770) \1771UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \1772functionExit(thr); \1773JNI_END17741775WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)1776WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)1777WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)1778WRAPPER_SetScalarArrayRegion(T_CHAR, jchar, Char)1779WRAPPER_SetScalarArrayRegion(T_INT, jint, Int)1780WRAPPER_SetScalarArrayRegion(T_LONG, jlong, Long)1781WRAPPER_SetScalarArrayRegion(T_FLOAT, jfloat, Float)1782WRAPPER_SetScalarArrayRegion(T_DOUBLE, jdouble, Double)17831784JNI_ENTRY_CHECKED(jint,1785checked_jni_RegisterNatives(JNIEnv *env,1786jclass clazz,1787const JNINativeMethod *methods,1788jint nMethods))1789functionEnter(thr);1790jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);1791functionExit(thr);1792return result;1793JNI_END17941795JNI_ENTRY_CHECKED(jint,1796checked_jni_UnregisterNatives(JNIEnv *env,1797jclass clazz))1798functionEnter(thr);1799jint result = UNCHECKED()->UnregisterNatives(env,clazz);1800functionExit(thr);1801return result;1802JNI_END18031804JNI_ENTRY_CHECKED(jint,1805checked_jni_MonitorEnter(JNIEnv *env,1806jobject obj))1807functionEnter(thr);1808IN_VM(1809jniCheck::validate_object(thr, obj);1810)1811jint result = UNCHECKED()->MonitorEnter(env,obj);1812functionExit(thr);1813return result;1814JNI_END18151816JNI_ENTRY_CHECKED(jint,1817checked_jni_MonitorExit(JNIEnv *env,1818jobject obj))1819functionEnterExceptionAllowed(thr);1820IN_VM(1821jniCheck::validate_object(thr, obj);1822)1823jint result = UNCHECKED()->MonitorExit(env,obj);1824functionExit(thr);1825return result;1826JNI_END18271828JNI_ENTRY_CHECKED(jint,1829checked_jni_GetJavaVM(JNIEnv *env,1830JavaVM **vm))1831functionEnter(thr);1832jint result = UNCHECKED()->GetJavaVM(env,vm);1833functionExit(thr);1834return result;1835JNI_END18361837JNI_ENTRY_CHECKED(void,1838checked_jni_GetStringRegion(JNIEnv *env,1839jstring str,1840jsize start,1841jsize len,1842jchar *buf))1843functionEnter(thr);1844IN_VM(1845checkString(thr, str);1846)1847UNCHECKED()->GetStringRegion(env, str, start, len, buf);1848functionExit(thr);1849JNI_END18501851JNI_ENTRY_CHECKED(void,1852checked_jni_GetStringUTFRegion(JNIEnv *env,1853jstring str,1854jsize start,1855jsize len,1856char *buf))1857functionEnter(thr);1858IN_VM(1859checkString(thr, str);1860)1861UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);1862functionExit(thr);1863JNI_END18641865JNI_ENTRY_CHECKED(void *,1866checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,1867jarray array,1868jboolean *isCopy))1869functionEnterCritical(thr);1870IN_VM(1871check_is_primitive_array(thr, array);1872)1873void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);1874if (result != NULL) {1875result = check_jni_wrap_copy_array(thr, array, result);1876}1877functionExit(thr);1878return result;1879JNI_END18801881JNI_ENTRY_CHECKED(void,1882checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,1883jarray array,1884void *carray,1885jint mode))1886functionEnterCriticalExceptionAllowed(thr);1887IN_VM(1888check_is_primitive_array(thr, array);1889)1890// Check the element array...1891void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical",1892array, carray, mode, JNI_TRUE);1893UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);1894functionExit(thr);1895JNI_END18961897JNI_ENTRY_CHECKED(const jchar*,1898checked_jni_GetStringCritical(JNIEnv *env,1899jstring string,1900jboolean *isCopy))1901functionEnterCritical(thr);1902IN_VM(1903checkString(thr, string);1904)1905const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);1906functionExit(thr);1907return result;1908JNI_END19091910JNI_ENTRY_CHECKED(void,1911checked_jni_ReleaseStringCritical(JNIEnv *env,1912jstring str,1913const jchar *chars))1914functionEnterCriticalExceptionAllowed(thr);1915IN_VM(1916checkString(thr, str);1917)1918/* The Hotspot JNI code does not use the parameters, so just check the1919* string parameter as a minor sanity check1920*/1921UNCHECKED()->ReleaseStringCritical(env, str, chars);1922functionExit(thr);1923JNI_END19241925JNI_ENTRY_CHECKED(jweak,1926checked_jni_NewWeakGlobalRef(JNIEnv *env,1927jobject obj))1928functionEnter(thr);1929IN_VM(1930if (obj != NULL) {1931jniCheck::validate_handle(thr, obj);1932}1933)1934jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);1935functionExit(thr);1936return result;1937JNI_END19381939JNI_ENTRY_CHECKED(void,1940checked_jni_DeleteWeakGlobalRef(JNIEnv *env,1941jweak ref))1942functionEnterExceptionAllowed(thr);1943IN_VM(1944if (ref && !JNIHandles::is_weak_global_handle(ref)) {1945ReportJNIFatalError(thr,1946"Invalid weak global JNI handle passed to DeleteWeakGlobalRef");1947}1948)1949UNCHECKED()->DeleteWeakGlobalRef(env, ref);1950functionExit(thr);1951JNI_END19521953JNI_ENTRY_CHECKED(jboolean,1954checked_jni_ExceptionCheck(JNIEnv *env))1955thr->clear_pending_jni_exception_check();1956functionEnterExceptionAllowed(thr);1957jboolean result = UNCHECKED()->ExceptionCheck(env);1958functionExit(thr);1959return result;1960JNI_END19611962JNI_ENTRY_CHECKED(jobject,1963checked_jni_NewDirectByteBuffer(JNIEnv *env,1964void *address,1965jlong capacity))1966functionEnter(thr);1967jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);1968functionExit(thr);1969return result;1970JNI_END19711972JNI_ENTRY_CHECKED(void *,1973checked_jni_GetDirectBufferAddress(JNIEnv *env,1974jobject buf))1975functionEnter(thr);1976void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);1977functionExit(thr);1978return result;1979JNI_END19801981JNI_ENTRY_CHECKED(jlong,1982checked_jni_GetDirectBufferCapacity(JNIEnv *env,1983jobject buf))1984functionEnter(thr);1985jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);1986functionExit(thr);1987return result;1988JNI_END19891990JNI_ENTRY_CHECKED(jobjectRefType,1991checked_jni_GetObjectRefType(JNIEnv *env,1992jobject obj))1993functionEnter(thr);1994/* validate the object being passed */1995IN_VM(1996jniCheck::validate_object(thr, obj);1997)1998jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);1999functionExit(thr);2000return result;2001JNI_END200220032004JNI_ENTRY_CHECKED(jint,2005checked_jni_GetVersion(JNIEnv *env))2006functionEnter(thr);2007jint result = UNCHECKED()->GetVersion(env);2008functionExit(thr);2009return result;2010JNI_END20112012JNI_ENTRY_CHECKED(jobject,2013checked_jni_GetModule(JNIEnv *env,2014jclass clazz))2015functionEnter(thr);2016jobject result = UNCHECKED()->GetModule(env,clazz);2017functionExit(thr);2018return result;2019JNI_END20202021/*2022* Structure containing all checked jni functions2023*/2024struct JNINativeInterface_ checked_jni_NativeInterface = {2025NULL,2026NULL,2027NULL,20282029NULL,20302031checked_jni_GetVersion,20322033checked_jni_DefineClass,2034checked_jni_FindClass,20352036checked_jni_FromReflectedMethod,2037checked_jni_FromReflectedField,20382039checked_jni_ToReflectedMethod,20402041checked_jni_GetSuperclass,2042checked_jni_IsAssignableFrom,20432044checked_jni_ToReflectedField,20452046checked_jni_Throw,2047checked_jni_ThrowNew,2048checked_jni_ExceptionOccurred,2049checked_jni_ExceptionDescribe,2050checked_jni_ExceptionClear,2051checked_jni_FatalError,20522053checked_jni_PushLocalFrame,2054checked_jni_PopLocalFrame,20552056checked_jni_NewGlobalRef,2057checked_jni_DeleteGlobalRef,2058checked_jni_DeleteLocalRef,2059checked_jni_IsSameObject,20602061checked_jni_NewLocalRef,2062checked_jni_EnsureLocalCapacity,20632064checked_jni_AllocObject,2065checked_jni_NewObject,2066checked_jni_NewObjectV,2067checked_jni_NewObjectA,20682069checked_jni_GetObjectClass,2070checked_jni_IsInstanceOf,20712072checked_jni_GetMethodID,20732074checked_jni_CallObjectMethod,2075checked_jni_CallObjectMethodV,2076checked_jni_CallObjectMethodA,2077checked_jni_CallBooleanMethod,2078checked_jni_CallBooleanMethodV,2079checked_jni_CallBooleanMethodA,2080checked_jni_CallByteMethod,2081checked_jni_CallByteMethodV,2082checked_jni_CallByteMethodA,2083checked_jni_CallCharMethod,2084checked_jni_CallCharMethodV,2085checked_jni_CallCharMethodA,2086checked_jni_CallShortMethod,2087checked_jni_CallShortMethodV,2088checked_jni_CallShortMethodA,2089checked_jni_CallIntMethod,2090checked_jni_CallIntMethodV,2091checked_jni_CallIntMethodA,2092checked_jni_CallLongMethod,2093checked_jni_CallLongMethodV,2094checked_jni_CallLongMethodA,2095checked_jni_CallFloatMethod,2096checked_jni_CallFloatMethodV,2097checked_jni_CallFloatMethodA,2098checked_jni_CallDoubleMethod,2099checked_jni_CallDoubleMethodV,2100checked_jni_CallDoubleMethodA,2101checked_jni_CallVoidMethod,2102checked_jni_CallVoidMethodV,2103checked_jni_CallVoidMethodA,21042105checked_jni_CallNonvirtualObjectMethod,2106checked_jni_CallNonvirtualObjectMethodV,2107checked_jni_CallNonvirtualObjectMethodA,2108checked_jni_CallNonvirtualBooleanMethod,2109checked_jni_CallNonvirtualBooleanMethodV,2110checked_jni_CallNonvirtualBooleanMethodA,2111checked_jni_CallNonvirtualByteMethod,2112checked_jni_CallNonvirtualByteMethodV,2113checked_jni_CallNonvirtualByteMethodA,2114checked_jni_CallNonvirtualCharMethod,2115checked_jni_CallNonvirtualCharMethodV,2116checked_jni_CallNonvirtualCharMethodA,2117checked_jni_CallNonvirtualShortMethod,2118checked_jni_CallNonvirtualShortMethodV,2119checked_jni_CallNonvirtualShortMethodA,2120checked_jni_CallNonvirtualIntMethod,2121checked_jni_CallNonvirtualIntMethodV,2122checked_jni_CallNonvirtualIntMethodA,2123checked_jni_CallNonvirtualLongMethod,2124checked_jni_CallNonvirtualLongMethodV,2125checked_jni_CallNonvirtualLongMethodA,2126checked_jni_CallNonvirtualFloatMethod,2127checked_jni_CallNonvirtualFloatMethodV,2128checked_jni_CallNonvirtualFloatMethodA,2129checked_jni_CallNonvirtualDoubleMethod,2130checked_jni_CallNonvirtualDoubleMethodV,2131checked_jni_CallNonvirtualDoubleMethodA,2132checked_jni_CallNonvirtualVoidMethod,2133checked_jni_CallNonvirtualVoidMethodV,2134checked_jni_CallNonvirtualVoidMethodA,21352136checked_jni_GetFieldID,21372138checked_jni_GetObjectField,2139checked_jni_GetBooleanField,2140checked_jni_GetByteField,2141checked_jni_GetCharField,2142checked_jni_GetShortField,2143checked_jni_GetIntField,2144checked_jni_GetLongField,2145checked_jni_GetFloatField,2146checked_jni_GetDoubleField,21472148checked_jni_SetObjectField,2149checked_jni_SetBooleanField,2150checked_jni_SetByteField,2151checked_jni_SetCharField,2152checked_jni_SetShortField,2153checked_jni_SetIntField,2154checked_jni_SetLongField,2155checked_jni_SetFloatField,2156checked_jni_SetDoubleField,21572158checked_jni_GetStaticMethodID,21592160checked_jni_CallStaticObjectMethod,2161checked_jni_CallStaticObjectMethodV,2162checked_jni_CallStaticObjectMethodA,2163checked_jni_CallStaticBooleanMethod,2164checked_jni_CallStaticBooleanMethodV,2165checked_jni_CallStaticBooleanMethodA,2166checked_jni_CallStaticByteMethod,2167checked_jni_CallStaticByteMethodV,2168checked_jni_CallStaticByteMethodA,2169checked_jni_CallStaticCharMethod,2170checked_jni_CallStaticCharMethodV,2171checked_jni_CallStaticCharMethodA,2172checked_jni_CallStaticShortMethod,2173checked_jni_CallStaticShortMethodV,2174checked_jni_CallStaticShortMethodA,2175checked_jni_CallStaticIntMethod,2176checked_jni_CallStaticIntMethodV,2177checked_jni_CallStaticIntMethodA,2178checked_jni_CallStaticLongMethod,2179checked_jni_CallStaticLongMethodV,2180checked_jni_CallStaticLongMethodA,2181checked_jni_CallStaticFloatMethod,2182checked_jni_CallStaticFloatMethodV,2183checked_jni_CallStaticFloatMethodA,2184checked_jni_CallStaticDoubleMethod,2185checked_jni_CallStaticDoubleMethodV,2186checked_jni_CallStaticDoubleMethodA,2187checked_jni_CallStaticVoidMethod,2188checked_jni_CallStaticVoidMethodV,2189checked_jni_CallStaticVoidMethodA,21902191checked_jni_GetStaticFieldID,21922193checked_jni_GetStaticObjectField,2194checked_jni_GetStaticBooleanField,2195checked_jni_GetStaticByteField,2196checked_jni_GetStaticCharField,2197checked_jni_GetStaticShortField,2198checked_jni_GetStaticIntField,2199checked_jni_GetStaticLongField,2200checked_jni_GetStaticFloatField,2201checked_jni_GetStaticDoubleField,22022203checked_jni_SetStaticObjectField,2204checked_jni_SetStaticBooleanField,2205checked_jni_SetStaticByteField,2206checked_jni_SetStaticCharField,2207checked_jni_SetStaticShortField,2208checked_jni_SetStaticIntField,2209checked_jni_SetStaticLongField,2210checked_jni_SetStaticFloatField,2211checked_jni_SetStaticDoubleField,22122213checked_jni_NewString,2214checked_jni_GetStringLength,2215checked_jni_GetStringChars,2216checked_jni_ReleaseStringChars,22172218checked_jni_NewStringUTF,2219checked_jni_GetStringUTFLength,2220checked_jni_GetStringUTFChars,2221checked_jni_ReleaseStringUTFChars,22222223checked_jni_GetArrayLength,22242225checked_jni_NewObjectArray,2226checked_jni_GetObjectArrayElement,2227checked_jni_SetObjectArrayElement,22282229checked_jni_NewBooleanArray,2230checked_jni_NewByteArray,2231checked_jni_NewCharArray,2232checked_jni_NewShortArray,2233checked_jni_NewIntArray,2234checked_jni_NewLongArray,2235checked_jni_NewFloatArray,2236checked_jni_NewDoubleArray,22372238checked_jni_GetBooleanArrayElements,2239checked_jni_GetByteArrayElements,2240checked_jni_GetCharArrayElements,2241checked_jni_GetShortArrayElements,2242checked_jni_GetIntArrayElements,2243checked_jni_GetLongArrayElements,2244checked_jni_GetFloatArrayElements,2245checked_jni_GetDoubleArrayElements,22462247checked_jni_ReleaseBooleanArrayElements,2248checked_jni_ReleaseByteArrayElements,2249checked_jni_ReleaseCharArrayElements,2250checked_jni_ReleaseShortArrayElements,2251checked_jni_ReleaseIntArrayElements,2252checked_jni_ReleaseLongArrayElements,2253checked_jni_ReleaseFloatArrayElements,2254checked_jni_ReleaseDoubleArrayElements,22552256checked_jni_GetBooleanArrayRegion,2257checked_jni_GetByteArrayRegion,2258checked_jni_GetCharArrayRegion,2259checked_jni_GetShortArrayRegion,2260checked_jni_GetIntArrayRegion,2261checked_jni_GetLongArrayRegion,2262checked_jni_GetFloatArrayRegion,2263checked_jni_GetDoubleArrayRegion,22642265checked_jni_SetBooleanArrayRegion,2266checked_jni_SetByteArrayRegion,2267checked_jni_SetCharArrayRegion,2268checked_jni_SetShortArrayRegion,2269checked_jni_SetIntArrayRegion,2270checked_jni_SetLongArrayRegion,2271checked_jni_SetFloatArrayRegion,2272checked_jni_SetDoubleArrayRegion,22732274checked_jni_RegisterNatives,2275checked_jni_UnregisterNatives,22762277checked_jni_MonitorEnter,2278checked_jni_MonitorExit,22792280checked_jni_GetJavaVM,22812282checked_jni_GetStringRegion,2283checked_jni_GetStringUTFRegion,22842285checked_jni_GetPrimitiveArrayCritical,2286checked_jni_ReleasePrimitiveArrayCritical,22872288checked_jni_GetStringCritical,2289checked_jni_ReleaseStringCritical,22902291checked_jni_NewWeakGlobalRef,2292checked_jni_DeleteWeakGlobalRef,22932294checked_jni_ExceptionCheck,22952296checked_jni_NewDirectByteBuffer,2297checked_jni_GetDirectBufferAddress,2298checked_jni_GetDirectBufferCapacity,22992300// New 1.6 Features23012302checked_jni_GetObjectRefType,23032304// Module Features23052306checked_jni_GetModule2307};230823092310// Returns the function structure2311struct JNINativeInterface_* jni_functions_check() {23122313unchecked_jni_NativeInterface = jni_functions_nocheck();23142315// make sure the last pointer in the checked table is not null, indicating2316// an addition to the JNINativeInterface_ structure without initializing2317// it in the checked table.2318debug_only(int *lastPtr = (int *)((char *)&checked_jni_NativeInterface + \2319sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));)2320assert(*lastPtr != 0,2321"Mismatched JNINativeInterface tables, check for new entries");23222323// with -verbose:jni this message will print2324log_debug(jni, resolve)("Checked JNI functions are being used to validate JNI usage");23252326return &checked_jni_NativeInterface;2327}232823292330