jniCheck.cpp revision 1472
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * This code is free software; you can redistribute it and/or modify it
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * under the terms of the GNU General Public License version 2 only, as
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * published by the Free Software Foundation.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * This code is distributed in the hope that it will be useful, but WITHOUT
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * version 2 for more details (a copy is included in the LICENSE file that
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * accompanied this code).
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * You should have received a copy of the GNU General Public License version
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * 2 along with this work; if not, write to the Free Software Foundation,
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * or visit www.oracle.com if you need additional information or have any
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * questions.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun# include "incls/_precompiled.incl"
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun# include "incls/_jniCheck.cpp.incl"
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// Heap objects are allowed to be directly referenced only in VM code,
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// not in native code.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun assert(JavaThread::current()->thread_state() == _thread_in_vm, \
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun "jniCheck examining oops in bad state.")
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// Execute the given block of source code with the thread in VM state.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// To do this, transition from the NATIVE state to the VM state, execute
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// the code, and transtition back. The ThreadInVMfromNative constructor
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// performs the transition to VM state, its destructor restores the
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun// NATIVE state.
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysun * DECLARATIONS
4a6ec905b96eb96a398c346f59e034a90ce8ad37ysunstatic struct JNINativeInterface_ * unchecked_jni_NativeInterface;
// QUICK_ENTRY or LEAF variants found in jni.cpp. This allows handles
static const char * warn_bad_class_descriptor = "JNI FindClass received a bad class descriptor \"%s\". A correct class descriptor " \
"has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases.";
static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread";
static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \
static const char * fatal_class_not_a_throwable_class = "JNI Throw or ThrowNew received a class argument that is not a Throwable or Throwable subclass";
static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";
static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";
static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";
static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations";
static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations";
static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations";
static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations";
if (!oopObj) {
false, &fd))
return NULL;
return moop;
if (!obj)
return NULL;
if (!oopObj) {
return oopObj;
if (!mirror) {
const char *name,
return result;
const char *name))
return result;
return result;
return result;
isStatic);
return result;
return result;
return result;
isStatic);
return result;
return result;
const char *msg))
return result;
return result;
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
const char *msg))
if (capacity < 0)
return result;
return res;
return result;
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
return result;
return result;
if (capacity < 0) {
return result;
return result;
return result;
return result;
return result;
return result;
return result;
const char *name,
const char *sig))
return result;
IN_VM( \
args); \
return result; \
JNI_END \
IN_VM(\
args); \
return result; \
JNI_END \
IN_VM( \
args); \
return result; \
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
IN_VM( \
obj, \
clazz, \
methodID,\
args); \
return result; \
JNI_END \
IN_VM( \
obj, \
clazz, \
methodID,\
args); \
return result; \
JNI_END \
IN_VM( \
obj, \
clazz, \
methodID,\
args); \
return result; \
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
const char *name,
const char *sig))
return result;
IN_VM( \
return result; \
JNI_ENTRY_CHECKED(void, \
IN_VM( \
const char *name,
const char *sig))
return result;
IN_VM( \
clazz, \
methodID, \
args); \
return result; \
JNI_END \
IN_VM( \
clazz, \
methodID, \
args); \
return result; \
JNI_END \
IN_VM( \
clazz, \
methodID, \
args); \
return result; \
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
const char *name,
const char *sig))
return result;
IN_VM( \
clazz, \
fieldID); \
return result; \
JNI_ENTRY_CHECKED(void, \
IN_VM( \
return result;
return result;
return result;
JNI_ENTRY_CHECKED(void,
const char *utf))
return result;
return result;
JNI_ENTRY_CHECKED(const char *,
return result;
JNI_ENTRY_CHECKED(void,
const char* chars))
return result;
return result;
return result;
JNI_ENTRY_CHECKED(void,
IN_VM( \
array, \
isCopy); \
return result; \
JNI_ENTRY_CHECKED(void, \
IN_VM( \
JNI_ENTRY_CHECKED(void, \
IN_VM( \
JNI_ENTRY_CHECKED(void, \
IN_VM( \
return result;
return result;
return result;
return result;
return result;
JNI_ENTRY_CHECKED(void,
JNI_ENTRY_CHECKED(void,
char *buf))
JNI_ENTRY_CHECKED(void *,
return result;
JNI_ENTRY_CHECKED(void,
void *carray,
return result;
JNI_ENTRY_CHECKED(void,
return result;
JNI_ENTRY_CHECKED(void,
return result;
void *address,
return result;
JNI_ENTRY_CHECKED(void *,
return result;
return result;
return result;
return result;
NULL,
NULL,
NULL,
NULL,
sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));)
if (PrintJNIResolving) {
return &checked_jni_NativeInterface;