jniCheck.cpp revision 3863
325N/A * or visit www.oracle.com if you need additional information or have any
325N/A#include "precompiled.hpp"
325N/A#include "classfile/systemDictionary.hpp"
325N/A#include "classfile/vmSymbols.hpp"
325N/A#include "oops/instanceKlass.hpp"
325N/A#include "oops/oop.inline.hpp"
325N/A#include "oops/symbol.hpp"
325N/A#include "prims/jniCheck.hpp"
325N/A#include "prims/jvm_misc.hpp"
325N/A#include "runtime/fieldDescriptor.hpp"
325N/A#include "runtime/handles.hpp"
325N/A#include "runtime/interfaceSupport.hpp"
325N/A#include "runtime/jfieldIDWorkaround.hpp"
325N/A#include "runtime/thread.hpp"
325N/A#ifdef TARGET_ARCH_x86
325N/A# include "jniTypes_x86.hpp"
325N/A#ifdef TARGET_ARCH_sparc
325N/A# include "jniTypes_sparc.hpp"
325N/A#ifdef TARGET_ARCH_zero
325N/A# include "jniTypes_zero.hpp"
325N/A#ifdef TARGET_ARCH_arm
325N/A# include "jniTypes_arm.hpp"
325N/A#ifdef TARGET_ARCH_ppc
325N/A# include "jniTypes_ppc.hpp"
325N/A#define ASSERT_OOPS_ALLOWED \
// 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 newResult;
JNI_ENTRY_CHECKED(void,
NativeReportJNIFatalError(thr, "ReleaseStringChars called on something not allocated by GetStringChars");
const char *utf))
return result;
return result;
JNI_ENTRY_CHECKED(const char *,
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");
// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
return newResult;
JNI_ENTRY_CHECKED(void,
const char* chars))
NativeReportJNIFatalError(thr, "ReleaseStringUTFChars called on something not allocated by GetStringUTFChars");
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;