Tue, 23 Nov 2010 13:22:55 -0800
6989984: Use standard include model for Hospot
Summary: Replaced MakeDeps and the includeDB files with more standardized solutions.
Reviewed-by: coleenp, kvn, kamg
1 /*
2 * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
25 #include "precompiled.hpp"
26 #include "classfile/systemDictionary.hpp"
27 #include "classfile/vmSymbols.hpp"
28 #include "oops/instanceKlass.hpp"
29 #include "oops/oop.inline.hpp"
30 #include "oops/symbolOop.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.hpp"
39 #ifdef TARGET_ARCH_x86
40 # include "jniTypes_x86.hpp"
41 #endif
42 #ifdef TARGET_ARCH_sparc
43 # include "jniTypes_sparc.hpp"
44 #endif
45 #ifdef TARGET_ARCH_zero
46 # include "jniTypes_zero.hpp"
47 #endif
50 // Heap objects are allowed to be directly referenced only in VM code,
51 // not in native code.
53 #define ASSERT_OOPS_ALLOWED \
54 assert(JavaThread::current()->thread_state() == _thread_in_vm, \
55 "jniCheck examining oops in bad state.")
58 // Execute the given block of source code with the thread in VM state.
59 // To do this, transition from the NATIVE state to the VM state, execute
60 // the code, and transtition back. The ThreadInVMfromNative constructor
61 // performs the transition to VM state, its destructor restores the
62 // NATIVE state.
64 #define IN_VM(source_code) { \
65 { \
66 ThreadInVMfromNative __tiv(thr); \
67 source_code \
68 } \
69 }
72 /*
73 * DECLARATIONS
74 */
76 static struct JNINativeInterface_ * unchecked_jni_NativeInterface;
79 /*
80 * MACRO DEFINITIONS
81 */
83 // All JNI checked functions here use JNI_ENTRY_CHECKED() instead of the
84 // QUICK_ENTRY or LEAF variants found in jni.cpp. This allows handles
85 // to be created if a fatal error should occur.
87 // Check for thread not attached to VM; need to catch this before
88 // assertions in the wrapper routines might fire
90 // Check for env being the one value appropriate for this thread.
92 #define JNI_ENTRY_CHECKED(result_type, header) \
93 extern "C" { \
94 result_type JNICALL header { \
95 JavaThread* thr = (JavaThread*)ThreadLocalStorage::get_thread_slow();\
96 if (thr == NULL || !thr->is_Java_thread()) { \
97 tty->print_cr(fatal_using_jnienv_in_nonjava); \
98 os::abort(true); \
99 } \
100 JNIEnv* xenv = thr->jni_environment(); \
101 if (env != xenv) { \
102 NativeReportJNIFatalError(thr, warn_wrong_jnienv); \
103 } \
104 __ENTRY(result_type, header, thr)
107 #define UNCHECKED() (unchecked_jni_NativeInterface)
109 static const char * warn_wrong_jnienv = "Using JNIEnv in the wrong thread";
110 static const char * warn_bad_class_descriptor = "JNI FindClass received a bad class descriptor \"%s\". A correct class descriptor " \
111 "has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases.";
112 static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread";
113 static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \
114 "Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical";
115 static const char * fatal_bad_ref_to_jni = "Bad global or local ref passed to JNI";
116 static const char * fatal_received_null_class = "JNI received a null class";
117 static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";
118 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";
119 static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";
120 static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call";
121 static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";
122 static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";
123 static const char * fatal_non_array = "Non-array passed to JNI array operations";
124 static const char * fatal_element_type_mismatch = "Array element type mismatch in JNI";
125 static const char * fatal_should_be_static = "Non-static field ID passed to JNI";
126 static const char * fatal_wrong_static_field = "Wrong static field ID passed to JNI";
127 static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations";
128 static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations";
129 static const char * fatal_should_be_nonstatic = "Static field ID passed to JNI";
130 static const char * fatal_null_object = "Null object passed to JNI";
131 static const char * fatal_wrong_field = "Wrong field ID passed to JNI";
132 static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations";
133 static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations";
134 static const char * fatal_non_string = "JNI string operation received a non-string";
137 // When in VM state:
138 static void ReportJNIWarning(JavaThread* thr, const char *msg) {
139 tty->print_cr("WARNING in native method: %s", msg);
140 thr->print_stack();
141 }
143 // When in NATIVE state:
144 static void NativeReportJNIFatalError(JavaThread* thr, const char *msg) {
145 IN_VM(
146 ReportJNIFatalError(thr, msg);
147 )
148 }
150 static void NativeReportJNIWarning(JavaThread* thr, const char *msg) {
151 IN_VM(
152 ReportJNIWarning(thr, msg);
153 )
154 }
159 /*
160 * SUPPORT FUNCTIONS
161 */
163 static inline void
164 functionEnterCritical(JavaThread* thr)
165 {
166 if (thr->has_pending_exception()) {
167 NativeReportJNIWarning(thr, "JNI call made with exception pending");
168 }
169 }
171 static inline void
172 functionEnterCriticalExceptionAllowed(JavaThread* thr)
173 {
174 }
176 static inline void
177 functionEnter(JavaThread* thr)
178 {
179 if (thr->in_critical()) {
180 tty->print_cr(warn_other_function_in_critical);
181 }
182 if (thr->has_pending_exception()) {
183 NativeReportJNIWarning(thr, "JNI call made with exception pending");
184 }
185 }
187 static inline void
188 functionEnterExceptionAllowed(JavaThread* thr)
189 {
190 if (thr->in_critical()) {
191 tty->print_cr(warn_other_function_in_critical);
192 }
193 }
195 static inline void
196 functionExit(JNIEnv *env)
197 {
198 /* nothing to do at this time */
199 }
201 static inline void
202 checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)
203 {
204 fieldDescriptor fd;
206 /* make sure it is a static field */
207 if (!jfieldIDWorkaround::is_static_jfieldID(fid))
208 ReportJNIFatalError(thr, fatal_should_be_static);
210 /* validate the class being passed */
211 ASSERT_OOPS_ALLOWED;
212 klassOop k_oop = jniCheck::validate_class(thr, cls, false);
214 /* check for proper subclass hierarchy */
215 JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
216 klassOop f_oop = id->holder();
217 if (!instanceKlass::cast(k_oop)->is_subtype_of(f_oop))
218 ReportJNIFatalError(thr, fatal_wrong_static_field);
220 /* check for proper field type */
221 if (!instanceKlass::cast(f_oop)->find_local_field_from_offset(
222 id->offset(), true, &fd))
223 ReportJNIFatalError(thr, fatal_static_field_not_found);
224 if ((fd.field_type() != ftype) &&
225 !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
226 ReportJNIFatalError(thr, fatal_static_field_mismatch);
227 }
228 }
230 static inline void
231 checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
232 {
233 fieldDescriptor fd;
235 /* make sure it is an instance field */
236 if (jfieldIDWorkaround::is_static_jfieldID(fid))
237 ReportJNIFatalError(thr, fatal_should_be_nonstatic);
239 /* validate the object being passed and then get its class */
240 ASSERT_OOPS_ALLOWED;
241 oop oopObj = jniCheck::validate_object(thr, obj);
242 if (!oopObj) {
243 ReportJNIFatalError(thr, fatal_null_object);
244 }
245 klassOop k_oop = oopObj->klass();
247 if (!jfieldIDWorkaround::is_valid_jfieldID(k_oop, fid)) {
248 ReportJNIFatalError(thr, fatal_wrong_field);
249 }
251 /* make sure the field exists */
252 int offset = jfieldIDWorkaround::from_instance_jfieldID(k_oop, fid);
253 if (!instanceKlass::cast(k_oop)->contains_field_offset(offset))
254 ReportJNIFatalError(thr, fatal_wrong_field);
256 /* check for proper field type */
257 if (!instanceKlass::cast(k_oop)->find_field_from_offset(offset,
258 false, &fd))
259 ReportJNIFatalError(thr, fatal_instance_field_not_found);
261 if ((fd.field_type() != ftype) &&
262 !(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
263 ReportJNIFatalError(thr, fatal_instance_field_mismatch);
264 }
265 }
267 static inline void
268 checkString(JavaThread* thr, jstring js)
269 {
270 ASSERT_OOPS_ALLOWED;
271 oop s = jniCheck::validate_object(thr, js);
272 if (!s || !java_lang_String::is_instance(s))
273 ReportJNIFatalError(thr, fatal_non_string);
274 }
276 static inline void
277 checkArray(JavaThread* thr, jarray jArray, int elementType)
278 {
279 ASSERT_OOPS_ALLOWED;
280 arrayOop aOop;
282 aOop = (arrayOop)jniCheck::validate_object(thr, jArray);
283 if (aOop == NULL || !aOop->is_array())
284 ReportJNIFatalError(thr, fatal_non_array);
286 if (elementType != -1) {
287 if (aOop->is_typeArray()) {
288 BasicType array_type = typeArrayKlass::cast(aOop->klass())->element_type();
289 if (array_type != elementType)
290 ReportJNIFatalError(thr, fatal_element_type_mismatch);
291 } else if (aOop->is_objArray()) {
292 if ( T_OBJECT != elementType)
293 ReportJNIFatalError(thr, fatal_object_array_expected);
294 } else {
295 ReportJNIFatalError(thr, fatal_unknown_array_object);
296 }
297 }
298 }
301 oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {
302 if (JNIHandles::is_frame_handle(thr, obj) ||
303 JNIHandles::is_local_handle(thr, obj) ||
304 JNIHandles::is_global_handle(obj) ||
305 JNIHandles::is_weak_global_handle(obj)) {
306 ASSERT_OOPS_ALLOWED;
307 return JNIHandles::resolve_external_guard(obj);
308 }
309 ReportJNIFatalError(thr, fatal_bad_ref_to_jni);
310 return NULL;
311 }
314 methodOop jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {
315 ASSERT_OOPS_ALLOWED;
316 // do the fast jmethodID check first
317 methodOop moop = JNIHandles::checked_resolve_jmethod_id(method_id);
318 if (moop == NULL) {
319 ReportJNIFatalError(thr, fatal_wrong_class_or_method);
320 }
321 // jmethodIDs are supposed to be weak global handles, but that
322 // can be expensive so check it last
323 else if (!JNIHandles::is_weak_global_handle((jobject) method_id)) {
324 ReportJNIFatalError(thr, fatal_non_weak_method);
325 }
326 return moop;
327 }
330 oop jniCheck::validate_object(JavaThread* thr, jobject obj) {
331 if (!obj)
332 return NULL;
333 ASSERT_OOPS_ALLOWED;
334 oop oopObj = jniCheck::validate_handle(thr, obj);
335 if (!oopObj) {
336 ReportJNIFatalError(thr, fatal_bad_ref_to_jni);
337 }
338 return oopObj;
339 }
341 // Warn if a class descriptor is in decorated form; class descriptors
342 // passed to JNI findClass should not be decorated unless they are
343 // array descriptors.
344 void jniCheck::validate_class_descriptor(JavaThread* thr, const char* name) {
345 if (name == NULL) return; // implementation accepts NULL so just return
347 size_t len = strlen(name);
349 if (len >= 2 &&
350 name[0] == JVM_SIGNATURE_CLASS && // 'L'
351 name[len-1] == JVM_SIGNATURE_ENDCLASS ) { // ';'
352 char msg[JVM_MAXPATHLEN];
353 jio_snprintf(msg, JVM_MAXPATHLEN, warn_bad_class_descriptor, name);
354 ReportJNIWarning(thr, msg);
355 }
356 }
358 klassOop jniCheck::validate_class(JavaThread* thr, jclass clazz, bool allow_primitive) {
359 ASSERT_OOPS_ALLOWED;
360 oop mirror = jniCheck::validate_handle(thr, clazz);
361 if (!mirror) {
362 ReportJNIFatalError(thr, fatal_received_null_class);
363 }
365 if (mirror->klass() != SystemDictionary::Class_klass()) {
366 ReportJNIFatalError(thr, fatal_class_not_a_class);
367 }
369 klassOop k = java_lang_Class::as_klassOop(mirror);
370 // Make allowances for primitive classes ...
371 if (!(k != NULL || allow_primitive && java_lang_Class::is_primitive(mirror))) {
372 ReportJNIFatalError(thr, fatal_class_not_a_class);
373 }
374 return k;
375 }
377 void jniCheck::validate_throwable_klass(JavaThread* thr, klassOop klass) {
378 ASSERT_OOPS_ALLOWED;
379 assert(klass != NULL, "klass argument must have a value");
381 if (!Klass::cast(klass)->oop_is_instance() ||
382 !instanceKlass::cast(klass)->is_subclass_of(SystemDictionary::Throwable_klass())) {
383 ReportJNIFatalError(thr, fatal_class_not_a_throwable_class);
384 }
385 }
387 void jniCheck::validate_call_object(JavaThread* thr, jobject obj, jmethodID method_id) {
388 /* validate the object being passed */
389 ASSERT_OOPS_ALLOWED;
390 jniCheck::validate_jmethod_id(thr, method_id);
391 jniCheck::validate_object(thr, obj);
392 }
394 void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id) {
395 /* validate the class being passed */
396 ASSERT_OOPS_ALLOWED;
397 jniCheck::validate_jmethod_id(thr, method_id);
398 jniCheck::validate_class(thr, clazz, false);
399 }
402 /*
403 * IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE
404 */
406 JNI_ENTRY_CHECKED(jclass,
407 checked_jni_DefineClass(JNIEnv *env,
408 const char *name,
409 jobject loader,
410 const jbyte *buf,
411 jsize len))
412 functionEnter(thr);
413 IN_VM(
414 jniCheck::validate_object(thr, loader);
415 )
416 jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);
417 functionExit(env);
418 return result;
419 JNI_END
421 JNI_ENTRY_CHECKED(jclass,
422 checked_jni_FindClass(JNIEnv *env,
423 const char *name))
424 functionEnter(thr);
425 IN_VM(
426 jniCheck::validate_class_descriptor(thr, name);
427 )
428 jclass result = UNCHECKED()->FindClass(env, name);
429 functionExit(env);
430 return result;
431 JNI_END
433 JNI_ENTRY_CHECKED(jmethodID,
434 checked_jni_FromReflectedMethod(JNIEnv *env,
435 jobject method))
436 functionEnter(thr);
437 IN_VM(
438 jniCheck::validate_object(thr, method);
439 )
440 jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);
441 functionExit(env);
442 return result;
443 JNI_END
445 JNI_ENTRY_CHECKED(jfieldID,
446 checked_jni_FromReflectedField(JNIEnv *env,
447 jobject field))
448 functionEnter(thr);
449 IN_VM(
450 jniCheck::validate_object(thr, field);
451 )
452 jfieldID result = UNCHECKED()->FromReflectedField(env, field);
453 functionExit(env);
454 return result;
455 JNI_END
457 JNI_ENTRY_CHECKED(jobject,
458 checked_jni_ToReflectedMethod(JNIEnv *env,
459 jclass cls,
460 jmethodID methodID,
461 jboolean isStatic))
462 functionEnter(thr);
463 IN_VM(
464 jniCheck::validate_class(thr, cls, false);
465 jniCheck::validate_jmethod_id(thr, methodID);
466 )
467 jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,
468 isStatic);
469 functionExit(env);
470 return result;
471 JNI_END
473 JNI_ENTRY_CHECKED(jclass,
474 checked_jni_GetSuperclass(JNIEnv *env,
475 jclass sub))
476 functionEnter(thr);
477 IN_VM(
478 jniCheck::validate_class(thr, sub, true);
479 )
480 jclass result = UNCHECKED()->GetSuperclass(env, sub);
481 functionExit(env);
482 return result;
483 JNI_END
485 JNI_ENTRY_CHECKED(jboolean,
486 checked_jni_IsAssignableFrom(JNIEnv *env,
487 jclass sub,
488 jclass sup))
489 functionEnter(thr);
490 IN_VM(
491 jniCheck::validate_class(thr, sub, true);
492 jniCheck::validate_class(thr, sup, true);
493 )
494 jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);
495 functionExit(env);
496 return result;
497 JNI_END
499 JNI_ENTRY_CHECKED(jobject,
500 checked_jni_ToReflectedField(JNIEnv *env,
501 jclass cls,
502 jfieldID fieldID,
503 jboolean isStatic))
504 functionEnter(thr);
505 IN_VM(
506 jniCheck::validate_class(thr, cls, false);
507 )
508 jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,
509 isStatic);
510 functionExit(env);
511 return result;
512 JNI_END
514 JNI_ENTRY_CHECKED(jint,
515 checked_jni_Throw(JNIEnv *env,
516 jthrowable obj))
517 functionEnter(thr);
518 IN_VM(
519 oop oopObj = jniCheck::validate_object(thr, obj);
520 if (oopObj == NULL) {
521 // Unchecked Throw tolerates a NULL obj, so just warn
522 ReportJNIWarning(thr, "JNI Throw called with NULL throwable");
523 } else {
524 jniCheck::validate_throwable_klass(thr, oopObj->klass());
525 }
526 )
527 jint result = UNCHECKED()->Throw(env, obj);
528 functionExit(env);
529 return result;
530 JNI_END
532 JNI_ENTRY_CHECKED(jint,
533 checked_jni_ThrowNew(JNIEnv *env,
534 jclass clazz,
535 const char *msg))
536 functionEnter(thr);
537 IN_VM(
538 klassOop k = jniCheck::validate_class(thr, clazz, false);
539 assert(k != NULL, "validate_class shouldn't return NULL klassOop");
540 jniCheck::validate_throwable_klass(thr, k);
541 )
542 jint result = UNCHECKED()->ThrowNew(env, clazz, msg);
543 functionExit(env);
544 return result;
545 JNI_END
547 JNI_ENTRY_CHECKED(jthrowable,
548 checked_jni_ExceptionOccurred(JNIEnv *env))
549 functionEnterExceptionAllowed(thr);
550 jthrowable result = UNCHECKED()->ExceptionOccurred(env);
551 functionExit(env);
552 return result;
553 JNI_END
555 JNI_ENTRY_CHECKED(void,
556 checked_jni_ExceptionDescribe(JNIEnv *env))
557 functionEnterExceptionAllowed(thr);
558 UNCHECKED()->ExceptionDescribe(env);
559 functionExit(env);
560 JNI_END
562 JNI_ENTRY_CHECKED(void,
563 checked_jni_ExceptionClear(JNIEnv *env))
564 functionEnterExceptionAllowed(thr);
565 UNCHECKED()->ExceptionClear(env);
566 functionExit(env);
567 JNI_END
569 JNI_ENTRY_CHECKED(void,
570 checked_jni_FatalError(JNIEnv *env,
571 const char *msg))
572 functionEnter(thr);
573 UNCHECKED()->FatalError(env, msg);
574 functionExit(env);
575 JNI_END
577 JNI_ENTRY_CHECKED(jint,
578 checked_jni_PushLocalFrame(JNIEnv *env,
579 jint capacity))
580 functionEnterExceptionAllowed(thr);
581 if (capacity < 0)
582 NativeReportJNIFatalError(thr, "negative capacity");
583 jint result = UNCHECKED()->PushLocalFrame(env, capacity);
584 functionExit(env);
585 return result;
586 JNI_END
588 JNI_ENTRY_CHECKED(jobject,
589 checked_jni_PopLocalFrame(JNIEnv *env,
590 jobject result))
591 functionEnterExceptionAllowed(thr);
592 jobject res = UNCHECKED()->PopLocalFrame(env, result);
593 functionExit(env);
594 return res;
595 JNI_END
597 JNI_ENTRY_CHECKED(jobject,
598 checked_jni_NewGlobalRef(JNIEnv *env,
599 jobject lobj))
600 functionEnter(thr);
601 IN_VM(
602 if (lobj != NULL) {
603 jniCheck::validate_handle(thr, lobj);
604 }
605 )
606 jobject result = UNCHECKED()->NewGlobalRef(env,lobj);
607 functionExit(env);
608 return result;
609 JNI_END
611 JNI_ENTRY_CHECKED(void,
612 checked_jni_DeleteGlobalRef(JNIEnv *env,
613 jobject gref))
614 functionEnterExceptionAllowed(thr);
615 IN_VM(
616 jniCheck::validate_object(thr, gref);
617 if (gref && !JNIHandles::is_global_handle(gref)) {
618 ReportJNIFatalError(thr,
619 "Invalid global JNI handle passed to DeleteGlobalRef");
620 }
621 )
622 UNCHECKED()->DeleteGlobalRef(env,gref);
623 functionExit(env);
624 JNI_END
626 JNI_ENTRY_CHECKED(void,
627 checked_jni_DeleteLocalRef(JNIEnv *env,
628 jobject obj))
629 functionEnterExceptionAllowed(thr);
630 IN_VM(
631 jniCheck::validate_object(thr, obj);
632 if (obj && !(JNIHandles::is_local_handle(thr, obj) ||
633 JNIHandles::is_frame_handle(thr, obj)))
634 ReportJNIFatalError(thr,
635 "Invalid local JNI handle passed to DeleteLocalRef");
636 )
637 UNCHECKED()->DeleteLocalRef(env, obj);
638 functionExit(env);
639 JNI_END
641 JNI_ENTRY_CHECKED(jboolean,
642 checked_jni_IsSameObject(JNIEnv *env,
643 jobject obj1,
644 jobject obj2))
645 functionEnterExceptionAllowed(thr);
646 IN_VM(
647 /* This JNI function can be used to compare weak global references
648 * to NULL objects. If the handles are valid, but contain NULL,
649 * then don't attempt to validate the object.
650 */
651 if (obj1 != NULL && jniCheck::validate_handle(thr, obj1) != NULL) {
652 jniCheck::validate_object(thr, obj1);
653 }
654 if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {
655 jniCheck::validate_object(thr, obj2);
656 }
657 )
658 jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);
659 functionExit(env);
660 return result;
661 JNI_END
663 JNI_ENTRY_CHECKED(jobject,
664 checked_jni_NewLocalRef(JNIEnv *env,
665 jobject ref))
666 functionEnter(thr);
667 IN_VM(
668 if (ref != NULL) {
669 jniCheck::validate_handle(thr, ref);
670 }
671 )
672 jobject result = UNCHECKED()->NewLocalRef(env, ref);
673 functionExit(env);
674 return result;
675 JNI_END
677 JNI_ENTRY_CHECKED(jint,
678 checked_jni_EnsureLocalCapacity(JNIEnv *env,
679 jint capacity))
680 functionEnter(thr);
681 if (capacity < 0) {
682 NativeReportJNIFatalError(thr, "negative capacity");
683 }
684 jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);
685 functionExit(env);
686 return result;
687 JNI_END
689 JNI_ENTRY_CHECKED(jobject,
690 checked_jni_AllocObject(JNIEnv *env,
691 jclass clazz))
692 functionEnter(thr);
693 IN_VM(
694 jniCheck::validate_class(thr, clazz, false);
695 )
696 jobject result = UNCHECKED()->AllocObject(env,clazz);
697 functionExit(env);
698 return result;
699 JNI_END
701 JNI_ENTRY_CHECKED(jobject,
702 checked_jni_NewObject(JNIEnv *env,
703 jclass clazz,
704 jmethodID methodID,
705 ...))
706 functionEnter(thr);
707 va_list args;
708 IN_VM(
709 jniCheck::validate_class(thr, clazz, false);
710 jniCheck::validate_jmethod_id(thr, methodID);
711 )
712 va_start(args, methodID);
713 jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
714 va_end(args);
715 functionExit(env);
716 return result;
717 JNI_END
719 JNI_ENTRY_CHECKED(jobject,
720 checked_jni_NewObjectV(JNIEnv *env,
721 jclass clazz,
722 jmethodID methodID,
723 va_list args))
724 functionEnter(thr);
725 IN_VM(
726 jniCheck::validate_class(thr, clazz, false);
727 jniCheck::validate_jmethod_id(thr, methodID);
728 )
729 jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
730 functionExit(env);
731 return result;
732 JNI_END
734 JNI_ENTRY_CHECKED(jobject,
735 checked_jni_NewObjectA(JNIEnv *env,
736 jclass clazz,
737 jmethodID methodID,
738 const jvalue *args))
739 functionEnter(thr);
740 IN_VM(
741 jniCheck::validate_class(thr, clazz, false);
742 jniCheck::validate_jmethod_id(thr, methodID);
743 )
744 jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);
745 functionExit(env);
746 return result;
747 JNI_END
749 JNI_ENTRY_CHECKED(jclass,
750 checked_jni_GetObjectClass(JNIEnv *env,
751 jobject obj))
752 functionEnter(thr);
753 IN_VM(
754 jniCheck::validate_object(thr, obj);
755 )
756 jclass result = UNCHECKED()->GetObjectClass(env,obj);
757 functionExit(env);
758 return result;
759 JNI_END
761 JNI_ENTRY_CHECKED(jboolean,
762 checked_jni_IsInstanceOf(JNIEnv *env,
763 jobject obj,
764 jclass clazz))
765 functionEnter(thr);
766 IN_VM(
767 jniCheck::validate_object(thr, obj);
768 jniCheck::validate_class(thr, clazz, true);
769 )
770 jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);
771 functionExit(env);
772 return result;
773 JNI_END
775 JNI_ENTRY_CHECKED(jmethodID,
776 checked_jni_GetMethodID(JNIEnv *env,
777 jclass clazz,
778 const char *name,
779 const char *sig))
780 functionEnter(thr);
781 IN_VM(
782 jniCheck::validate_class(thr, clazz, false);
783 )
784 jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);
785 functionExit(env);
786 return result;
787 JNI_END
789 #define WRAPPER_CallMethod(ResultType, Result) \
790 JNI_ENTRY_CHECKED(ResultType, \
791 checked_jni_Call##Result##Method(JNIEnv *env, \
792 jobject obj, \
793 jmethodID methodID, \
794 ...)) \
795 functionEnter(thr); \
796 va_list args; \
797 IN_VM( \
798 jniCheck::validate_call_object(thr, obj, methodID); \
799 ) \
800 va_start(args,methodID); \
801 ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \
802 args); \
803 va_end(args); \
804 functionExit(env); \
805 return result; \
806 JNI_END \
807 \
808 JNI_ENTRY_CHECKED(ResultType, \
809 checked_jni_Call##Result##MethodV(JNIEnv *env, \
810 jobject obj, \
811 jmethodID methodID, \
812 va_list args)) \
813 functionEnter(thr); \
814 IN_VM(\
815 jniCheck::validate_call_object(thr, obj, methodID); \
816 ) \
817 ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\
818 args); \
819 functionExit(env); \
820 return result; \
821 JNI_END \
822 \
823 JNI_ENTRY_CHECKED(ResultType, \
824 checked_jni_Call##Result##MethodA(JNIEnv *env, \
825 jobject obj, \
826 jmethodID methodID, \
827 const jvalue * args)) \
828 functionEnter(thr); \
829 IN_VM( \
830 jniCheck::validate_call_object(thr, obj, methodID); \
831 ) \
832 ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\
833 args); \
834 functionExit(env); \
835 return result; \
836 JNI_END
838 WRAPPER_CallMethod(jobject,Object)
839 WRAPPER_CallMethod(jboolean,Boolean)
840 WRAPPER_CallMethod(jbyte,Byte)
841 WRAPPER_CallMethod(jshort,Short)
842 WRAPPER_CallMethod(jchar,Char)
843 WRAPPER_CallMethod(jint,Int)
844 WRAPPER_CallMethod(jlong,Long)
845 WRAPPER_CallMethod(jfloat,Float)
846 WRAPPER_CallMethod(jdouble,Double)
848 JNI_ENTRY_CHECKED(void,
849 checked_jni_CallVoidMethod(JNIEnv *env, \
850 jobject obj, \
851 jmethodID methodID, \
852 ...))
853 functionEnter(thr);
854 va_list args;
855 IN_VM(
856 jniCheck::validate_call_object(thr, obj, methodID);
857 )
858 va_start(args,methodID);
859 UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
860 va_end(args);
861 functionExit(env);
862 JNI_END
864 JNI_ENTRY_CHECKED(void,
865 checked_jni_CallVoidMethodV(JNIEnv *env,
866 jobject obj,
867 jmethodID methodID,
868 va_list args))
869 functionEnter(thr);
870 IN_VM(
871 jniCheck::validate_call_object(thr, obj, methodID);
872 )
873 UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
874 functionExit(env);
875 JNI_END
877 JNI_ENTRY_CHECKED(void,
878 checked_jni_CallVoidMethodA(JNIEnv *env,
879 jobject obj,
880 jmethodID methodID,
881 const jvalue * args))
882 functionEnter(thr);
883 IN_VM(
884 jniCheck::validate_call_object(thr, obj, methodID);
885 )
886 UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);
887 functionExit(env);
888 JNI_END
890 #define WRAPPER_CallNonvirtualMethod(ResultType, Result) \
891 JNI_ENTRY_CHECKED(ResultType, \
892 checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \
893 jobject obj, \
894 jclass clazz, \
895 jmethodID methodID, \
896 ...)) \
897 functionEnter(thr); \
898 va_list args; \
899 IN_VM( \
900 jniCheck::validate_call_object(thr, obj, methodID); \
901 jniCheck::validate_call_class(thr, clazz, methodID); \
902 ) \
903 va_start(args,methodID); \
904 ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
905 obj, \
906 clazz, \
907 methodID,\
908 args); \
909 va_end(args); \
910 functionExit(env); \
911 return result; \
912 JNI_END \
913 \
914 JNI_ENTRY_CHECKED(ResultType, \
915 checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \
916 jobject obj, \
917 jclass clazz, \
918 jmethodID methodID, \
919 va_list args)) \
920 functionEnter(thr); \
921 IN_VM( \
922 jniCheck::validate_call_object(thr, obj, methodID); \
923 jniCheck::validate_call_class(thr, clazz, methodID); \
924 ) \
925 ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
926 obj, \
927 clazz, \
928 methodID,\
929 args); \
930 functionExit(env); \
931 return result; \
932 JNI_END \
933 \
934 JNI_ENTRY_CHECKED(ResultType, \
935 checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \
936 jobject obj, \
937 jclass clazz, \
938 jmethodID methodID, \
939 const jvalue * args)) \
940 functionEnter(thr); \
941 IN_VM( \
942 jniCheck::validate_call_object(thr, obj, methodID); \
943 jniCheck::validate_call_class(thr, clazz, methodID); \
944 ) \
945 ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \
946 obj, \
947 clazz, \
948 methodID,\
949 args); \
950 functionExit(env); \
951 return result; \
952 JNI_END
954 WRAPPER_CallNonvirtualMethod(jobject,Object)
955 WRAPPER_CallNonvirtualMethod(jboolean,Boolean)
956 WRAPPER_CallNonvirtualMethod(jbyte,Byte)
957 WRAPPER_CallNonvirtualMethod(jshort,Short)
958 WRAPPER_CallNonvirtualMethod(jchar,Char)
959 WRAPPER_CallNonvirtualMethod(jint,Int)
960 WRAPPER_CallNonvirtualMethod(jlong,Long)
961 WRAPPER_CallNonvirtualMethod(jfloat,Float)
962 WRAPPER_CallNonvirtualMethod(jdouble,Double)
964 JNI_ENTRY_CHECKED(void,
965 checked_jni_CallNonvirtualVoidMethod(JNIEnv *env,
966 jobject obj,
967 jclass clazz,
968 jmethodID methodID,
969 ...))
970 functionEnter(thr);
971 va_list args;
972 IN_VM(
973 jniCheck::validate_call_object(thr, obj, methodID);
974 jniCheck::validate_call_class(thr, clazz, methodID);
975 )
976 va_start(args,methodID);
977 UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
978 va_end(args);
979 functionExit(env);
980 JNI_END
982 JNI_ENTRY_CHECKED(void,
983 checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,
984 jobject obj,
985 jclass clazz,
986 jmethodID methodID,
987 va_list args))
988 functionEnter(thr);
989 IN_VM(
990 jniCheck::validate_call_object(thr, obj, methodID);
991 jniCheck::validate_call_class(thr, clazz, methodID);
992 )
993 UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
994 functionExit(env);
995 JNI_END
997 JNI_ENTRY_CHECKED(void,
998 checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,
999 jobject obj,
1000 jclass clazz,
1001 jmethodID methodID,
1002 const jvalue * args))
1003 functionEnter(thr);
1004 IN_VM(
1005 jniCheck::validate_call_object(thr, obj, methodID);
1006 jniCheck::validate_call_class(thr, clazz, methodID);
1007 )
1008 UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);
1009 functionExit(env);
1010 JNI_END
1012 JNI_ENTRY_CHECKED(jfieldID,
1013 checked_jni_GetFieldID(JNIEnv *env,
1014 jclass clazz,
1015 const char *name,
1016 const char *sig))
1017 functionEnter(thr);
1018 IN_VM(
1019 jniCheck::validate_class(thr, clazz, false);
1020 )
1021 jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);
1022 functionExit(env);
1023 return result;
1024 JNI_END
1026 #define WRAPPER_GetField(ReturnType,Result,FieldType) \
1027 JNI_ENTRY_CHECKED(ReturnType, \
1028 checked_jni_Get##Result##Field(JNIEnv *env, \
1029 jobject obj, \
1030 jfieldID fieldID)) \
1031 functionEnter(thr); \
1032 IN_VM( \
1033 checkInstanceFieldID(thr, fieldID, obj, FieldType); \
1034 ) \
1035 ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \
1036 functionExit(env); \
1037 return result; \
1038 JNI_END
1040 WRAPPER_GetField(jobject, Object, T_OBJECT)
1041 WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)
1042 WRAPPER_GetField(jbyte, Byte, T_BYTE)
1043 WRAPPER_GetField(jshort, Short, T_SHORT)
1044 WRAPPER_GetField(jchar, Char, T_CHAR)
1045 WRAPPER_GetField(jint, Int, T_INT)
1046 WRAPPER_GetField(jlong, Long, T_LONG)
1047 WRAPPER_GetField(jfloat, Float, T_FLOAT)
1048 WRAPPER_GetField(jdouble, Double, T_DOUBLE)
1050 #define WRAPPER_SetField(ValueType,Result,FieldType) \
1051 JNI_ENTRY_CHECKED(void, \
1052 checked_jni_Set##Result##Field(JNIEnv *env, \
1053 jobject obj, \
1054 jfieldID fieldID, \
1055 ValueType val)) \
1056 functionEnter(thr); \
1057 IN_VM( \
1058 checkInstanceFieldID(thr, fieldID, obj, FieldType); \
1059 ) \
1060 UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \
1061 functionExit(env); \
1062 JNI_END
1064 WRAPPER_SetField(jobject, Object, T_OBJECT)
1065 WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)
1066 WRAPPER_SetField(jbyte, Byte, T_BYTE)
1067 WRAPPER_SetField(jshort, Short, T_SHORT)
1068 WRAPPER_SetField(jchar, Char, T_CHAR)
1069 WRAPPER_SetField(jint, Int, T_INT)
1070 WRAPPER_SetField(jlong, Long, T_LONG)
1071 WRAPPER_SetField(jfloat, Float, T_FLOAT)
1072 WRAPPER_SetField(jdouble, Double, T_DOUBLE)
1075 JNI_ENTRY_CHECKED(jmethodID,
1076 checked_jni_GetStaticMethodID(JNIEnv *env,
1077 jclass clazz,
1078 const char *name,
1079 const char *sig))
1080 functionEnter(thr);
1081 IN_VM(
1082 jniCheck::validate_class(thr, clazz, false);
1083 )
1084 jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);
1085 functionExit(env);
1086 return result;
1087 JNI_END
1089 #define WRAPPER_CallStaticMethod(ReturnType,Result) \
1090 JNI_ENTRY_CHECKED(ReturnType, \
1091 checked_jni_CallStatic##Result##Method(JNIEnv *env, \
1092 jclass clazz, \
1093 jmethodID methodID, \
1094 ...)) \
1095 functionEnter(thr); \
1096 va_list args; \
1097 IN_VM( \
1098 jniCheck::validate_jmethod_id(thr, methodID); \
1099 jniCheck::validate_class(thr, clazz, false); \
1100 ) \
1101 va_start(args,methodID); \
1102 ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
1103 clazz, \
1104 methodID, \
1105 args); \
1106 va_end(args); \
1107 functionExit(env); \
1108 return result; \
1109 JNI_END \
1110 \
1111 JNI_ENTRY_CHECKED(ReturnType, \
1112 checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \
1113 jclass clazz, \
1114 jmethodID methodID,\
1115 va_list args)) \
1116 functionEnter(thr); \
1117 IN_VM( \
1118 jniCheck::validate_jmethod_id(thr, methodID); \
1119 jniCheck::validate_class(thr, clazz, false); \
1120 ) \
1121 ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
1122 clazz, \
1123 methodID, \
1124 args); \
1125 functionExit(env); \
1126 return result; \
1127 JNI_END \
1128 \
1129 JNI_ENTRY_CHECKED(ReturnType, \
1130 checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \
1131 jclass clazz, \
1132 jmethodID methodID, \
1133 const jvalue *args)) \
1134 functionEnter(thr); \
1135 IN_VM( \
1136 jniCheck::validate_jmethod_id(thr, methodID); \
1137 jniCheck::validate_class(thr, clazz, false); \
1138 ) \
1139 ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \
1140 clazz, \
1141 methodID, \
1142 args); \
1143 functionExit(env); \
1144 return result; \
1145 JNI_END
1147 WRAPPER_CallStaticMethod(jobject,Object)
1148 WRAPPER_CallStaticMethod(jboolean,Boolean)
1149 WRAPPER_CallStaticMethod(jbyte,Byte)
1150 WRAPPER_CallStaticMethod(jshort,Short)
1151 WRAPPER_CallStaticMethod(jchar,Char)
1152 WRAPPER_CallStaticMethod(jint,Int)
1153 WRAPPER_CallStaticMethod(jlong,Long)
1154 WRAPPER_CallStaticMethod(jfloat,Float)
1155 WRAPPER_CallStaticMethod(jdouble,Double)
1157 JNI_ENTRY_CHECKED(void,
1158 checked_jni_CallStaticVoidMethod(JNIEnv *env,
1159 jclass cls,
1160 jmethodID methodID,
1161 ...))
1162 functionEnter(thr);
1163 va_list args;
1164 IN_VM(
1165 jniCheck::validate_jmethod_id(thr, methodID);
1166 jniCheck::validate_class(thr, cls, false);
1167 )
1168 va_start(args,methodID);
1169 UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
1170 va_end(args);
1171 functionExit(env);
1172 JNI_END
1174 JNI_ENTRY_CHECKED(void,
1175 checked_jni_CallStaticVoidMethodV(JNIEnv *env,
1176 jclass cls,
1177 jmethodID methodID,
1178 va_list args))
1179 functionEnter(thr);
1180 IN_VM(
1181 jniCheck::validate_jmethod_id(thr, methodID);
1182 jniCheck::validate_class(thr, cls, false);
1183 )
1184 UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
1185 functionExit(env);
1186 JNI_END
1188 JNI_ENTRY_CHECKED(void,
1189 checked_jni_CallStaticVoidMethodA(JNIEnv *env,
1190 jclass cls,
1191 jmethodID methodID,
1192 const jvalue * args))
1193 functionEnter(thr);
1194 IN_VM(
1195 jniCheck::validate_jmethod_id(thr, methodID);
1196 jniCheck::validate_class(thr, cls, false);
1197 )
1198 UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);
1199 functionExit(env);
1200 JNI_END
1202 JNI_ENTRY_CHECKED(jfieldID,
1203 checked_jni_GetStaticFieldID(JNIEnv *env,
1204 jclass clazz,
1205 const char *name,
1206 const char *sig))
1207 functionEnter(thr);
1208 IN_VM(
1209 jniCheck::validate_class(thr, clazz, false);
1210 )
1211 jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);
1212 functionExit(env);
1213 return result;
1214 JNI_END
1216 #define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \
1217 JNI_ENTRY_CHECKED(ReturnType, \
1218 checked_jni_GetStatic##Result##Field(JNIEnv *env, \
1219 jclass clazz, \
1220 jfieldID fieldID)) \
1221 functionEnter(thr); \
1222 IN_VM( \
1223 jniCheck::validate_class(thr, clazz, false); \
1224 checkStaticFieldID(thr, fieldID, clazz, FieldType); \
1225 ) \
1226 ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \
1227 clazz, \
1228 fieldID); \
1229 functionExit(env); \
1230 return result; \
1231 JNI_END
1233 WRAPPER_GetStaticField(jobject, Object, T_OBJECT)
1234 WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)
1235 WRAPPER_GetStaticField(jbyte, Byte, T_BYTE)
1236 WRAPPER_GetStaticField(jshort, Short, T_SHORT)
1237 WRAPPER_GetStaticField(jchar, Char, T_CHAR)
1238 WRAPPER_GetStaticField(jint, Int, T_INT)
1239 WRAPPER_GetStaticField(jlong, Long, T_LONG)
1240 WRAPPER_GetStaticField(jfloat, Float, T_FLOAT)
1241 WRAPPER_GetStaticField(jdouble, Double, T_DOUBLE)
1243 #define WRAPPER_SetStaticField(ValueType,Result,FieldType) \
1244 JNI_ENTRY_CHECKED(void, \
1245 checked_jni_SetStatic##Result##Field(JNIEnv *env, \
1246 jclass clazz, \
1247 jfieldID fieldID, \
1248 ValueType value)) \
1249 functionEnter(thr); \
1250 IN_VM( \
1251 jniCheck::validate_class(thr, clazz, false); \
1252 checkStaticFieldID(thr, fieldID, clazz, FieldType); \
1253 ) \
1254 UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \
1255 functionExit(env); \
1256 JNI_END
1258 WRAPPER_SetStaticField(jobject, Object, T_OBJECT)
1259 WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)
1260 WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)
1261 WRAPPER_SetStaticField(jshort, Short, T_SHORT)
1262 WRAPPER_SetStaticField(jchar, Char, T_CHAR)
1263 WRAPPER_SetStaticField(jint, Int, T_INT)
1264 WRAPPER_SetStaticField(jlong, Long, T_LONG)
1265 WRAPPER_SetStaticField(jfloat, Float, T_FLOAT)
1266 WRAPPER_SetStaticField(jdouble, Double, T_DOUBLE)
1269 JNI_ENTRY_CHECKED(jstring,
1270 checked_jni_NewString(JNIEnv *env,
1271 const jchar *unicode,
1272 jsize len))
1273 functionEnter(thr);
1274 jstring result = UNCHECKED()->NewString(env,unicode,len);
1275 functionExit(env);
1276 return result;
1277 JNI_END
1279 JNI_ENTRY_CHECKED(jsize,
1280 checked_jni_GetStringLength(JNIEnv *env,
1281 jstring str))
1282 functionEnter(thr);
1283 IN_VM(
1284 checkString(thr, str);
1285 )
1286 jsize result = UNCHECKED()->GetStringLength(env,str);
1287 functionExit(env);
1288 return result;
1289 JNI_END
1291 JNI_ENTRY_CHECKED(const jchar *,
1292 checked_jni_GetStringChars(JNIEnv *env,
1293 jstring str,
1294 jboolean *isCopy))
1295 functionEnter(thr);
1296 IN_VM(
1297 checkString(thr, str);
1298 )
1299 const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);
1300 functionExit(env);
1301 return result;
1302 JNI_END
1304 JNI_ENTRY_CHECKED(void,
1305 checked_jni_ReleaseStringChars(JNIEnv *env,
1306 jstring str,
1307 const jchar *chars))
1308 functionEnterExceptionAllowed(thr);
1309 IN_VM(
1310 checkString(thr, str);
1311 )
1312 /* cannot check validity of copy, unless every request is logged by
1313 * checking code. Implementation of this check is deferred until a
1314 * subsequent release.
1315 */
1316 UNCHECKED()->ReleaseStringChars(env,str,chars);
1317 functionExit(env);
1318 JNI_END
1320 JNI_ENTRY_CHECKED(jstring,
1321 checked_jni_NewStringUTF(JNIEnv *env,
1322 const char *utf))
1323 functionEnter(thr);
1324 jstring result = UNCHECKED()->NewStringUTF(env,utf);
1325 functionExit(env);
1326 return result;
1327 JNI_END
1329 JNI_ENTRY_CHECKED(jsize,
1330 checked_jni_GetStringUTFLength(JNIEnv *env,
1331 jstring str))
1332 functionEnter(thr);
1333 IN_VM(
1334 checkString(thr, str);
1335 )
1336 jsize result = UNCHECKED()->GetStringUTFLength(env,str);
1337 functionExit(env);
1338 return result;
1339 JNI_END
1341 JNI_ENTRY_CHECKED(const char *,
1342 checked_jni_GetStringUTFChars(JNIEnv *env,
1343 jstring str,
1344 jboolean *isCopy))
1345 functionEnter(thr);
1346 IN_VM(
1347 checkString(thr, str);
1348 )
1349 const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);
1350 functionExit(env);
1351 return result;
1352 JNI_END
1354 JNI_ENTRY_CHECKED(void,
1355 checked_jni_ReleaseStringUTFChars(JNIEnv *env,
1356 jstring str,
1357 const char* chars))
1358 functionEnterExceptionAllowed(thr);
1359 IN_VM(
1360 checkString(thr, str);
1361 )
1362 /* cannot check validity of copy, unless every request is logged by
1363 * checking code. Implementation of this check is deferred until a
1364 * subsequent release.
1365 */
1366 UNCHECKED()->ReleaseStringUTFChars(env,str,chars);
1367 functionExit(env);
1368 JNI_END
1370 JNI_ENTRY_CHECKED(jsize,
1371 checked_jni_GetArrayLength(JNIEnv *env,
1372 jarray array))
1373 functionEnter(thr);
1374 IN_VM(
1375 checkArray(thr, array, -1);
1376 )
1377 jsize result = UNCHECKED()->GetArrayLength(env,array);
1378 functionExit(env);
1379 return result;
1380 JNI_END
1382 JNI_ENTRY_CHECKED(jobjectArray,
1383 checked_jni_NewObjectArray(JNIEnv *env,
1384 jsize len,
1385 jclass clazz,
1386 jobject init))
1387 functionEnter(thr);
1388 jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1389 functionExit(env);
1390 return result;
1391 JNI_END
1393 JNI_ENTRY_CHECKED(jobject,
1394 checked_jni_GetObjectArrayElement(JNIEnv *env,
1395 jobjectArray array,
1396 jsize index))
1397 functionEnter(thr);
1398 IN_VM(
1399 checkArray(thr, array, T_OBJECT);
1400 )
1401 jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1402 functionExit(env);
1403 return result;
1404 JNI_END
1406 JNI_ENTRY_CHECKED(void,
1407 checked_jni_SetObjectArrayElement(JNIEnv *env,
1408 jobjectArray array,
1409 jsize index,
1410 jobject val))
1411 functionEnter(thr);
1412 IN_VM(
1413 checkArray(thr, array, T_OBJECT);
1414 )
1415 UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1416 functionExit(env);
1417 JNI_END
1419 #define WRAPPER_NewScalarArray(Return, Result) \
1420 JNI_ENTRY_CHECKED(Return, \
1421 checked_jni_New##Result##Array(JNIEnv *env, \
1422 jsize len)) \
1423 functionEnter(thr); \
1424 Return result = UNCHECKED()->New##Result##Array(env,len); \
1425 functionExit(env); \
1426 return (Return) result; \
1427 JNI_END
1429 WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1430 WRAPPER_NewScalarArray(jbyteArray, Byte)
1431 WRAPPER_NewScalarArray(jshortArray, Short)
1432 WRAPPER_NewScalarArray(jcharArray, Char)
1433 WRAPPER_NewScalarArray(jintArray, Int)
1434 WRAPPER_NewScalarArray(jlongArray, Long)
1435 WRAPPER_NewScalarArray(jfloatArray, Float)
1436 WRAPPER_NewScalarArray(jdoubleArray, Double)
1438 #define WRAPPER_GetScalarArrayElements(ElementTag,ElementType,Result) \
1439 JNI_ENTRY_CHECKED(ElementType *, \
1440 checked_jni_Get##Result##ArrayElements(JNIEnv *env, \
1441 ElementType##Array array, \
1442 jboolean *isCopy)) \
1443 functionEnter(thr); \
1444 IN_VM( \
1445 checkArray(thr, array, ElementTag); \
1446 ) \
1447 ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \
1448 array, \
1449 isCopy); \
1450 functionExit(env); \
1451 return result; \
1452 JNI_END
1454 WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)
1455 WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)
1456 WRAPPER_GetScalarArrayElements(T_SHORT, jshort, Short)
1457 WRAPPER_GetScalarArrayElements(T_CHAR, jchar, Char)
1458 WRAPPER_GetScalarArrayElements(T_INT, jint, Int)
1459 WRAPPER_GetScalarArrayElements(T_LONG, jlong, Long)
1460 WRAPPER_GetScalarArrayElements(T_FLOAT, jfloat, Float)
1461 WRAPPER_GetScalarArrayElements(T_DOUBLE, jdouble, Double)
1463 #define WRAPPER_ReleaseScalarArrayElements(ElementTag,ElementType,Result,Tag) \
1464 JNI_ENTRY_CHECKED(void, \
1465 checked_jni_Release##Result##ArrayElements(JNIEnv *env, \
1466 ElementType##Array array, \
1467 ElementType *elems, \
1468 jint mode)) \
1469 functionEnterExceptionAllowed(thr); \
1470 IN_VM( \
1471 checkArray(thr, array, ElementTag); \
1472 ASSERT_OOPS_ALLOWED; \
1473 typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
1474 /* cannot check validity of copy, unless every request is logged by
1475 * checking code. Implementation of this check is deferred until a
1476 * subsequent release.
1477 */ \
1478 ) \
1479 UNCHECKED()->Release##Result##ArrayElements(env,array,elems,mode); \
1480 functionExit(env); \
1481 JNI_END
1483 WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)
1484 WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)
1485 WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)
1486 WRAPPER_ReleaseScalarArrayElements(T_CHAR, jchar, Char, char)
1487 WRAPPER_ReleaseScalarArrayElements(T_INT, jint, Int, int)
1488 WRAPPER_ReleaseScalarArrayElements(T_LONG, jlong, Long, long)
1489 WRAPPER_ReleaseScalarArrayElements(T_FLOAT, jfloat, Float, float)
1490 WRAPPER_ReleaseScalarArrayElements(T_DOUBLE, jdouble, Double, double)
1492 #define WRAPPER_GetScalarArrayRegion(ElementTag,ElementType,Result) \
1493 JNI_ENTRY_CHECKED(void, \
1494 checked_jni_Get##Result##ArrayRegion(JNIEnv *env, \
1495 ElementType##Array array, \
1496 jsize start, \
1497 jsize len, \
1498 ElementType *buf)) \
1499 functionEnter(thr); \
1500 IN_VM( \
1501 checkArray(thr, array, ElementTag); \
1502 ) \
1503 UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \
1504 functionExit(env); \
1505 JNI_END
1507 WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
1508 WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)
1509 WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)
1510 WRAPPER_GetScalarArrayRegion(T_CHAR, jchar, Char)
1511 WRAPPER_GetScalarArrayRegion(T_INT, jint, Int)
1512 WRAPPER_GetScalarArrayRegion(T_LONG, jlong, Long)
1513 WRAPPER_GetScalarArrayRegion(T_FLOAT, jfloat, Float)
1514 WRAPPER_GetScalarArrayRegion(T_DOUBLE, jdouble, Double)
1516 #define WRAPPER_SetScalarArrayRegion(ElementTag,ElementType,Result) \
1517 JNI_ENTRY_CHECKED(void, \
1518 checked_jni_Set##Result##ArrayRegion(JNIEnv *env, \
1519 ElementType##Array array, \
1520 jsize start, \
1521 jsize len, \
1522 const ElementType *buf)) \
1523 functionEnter(thr); \
1524 IN_VM( \
1525 checkArray(thr, array, ElementTag); \
1526 ) \
1527 UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \
1528 functionExit(env); \
1529 JNI_END
1531 WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
1532 WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)
1533 WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)
1534 WRAPPER_SetScalarArrayRegion(T_CHAR, jchar, Char)
1535 WRAPPER_SetScalarArrayRegion(T_INT, jint, Int)
1536 WRAPPER_SetScalarArrayRegion(T_LONG, jlong, Long)
1537 WRAPPER_SetScalarArrayRegion(T_FLOAT, jfloat, Float)
1538 WRAPPER_SetScalarArrayRegion(T_DOUBLE, jdouble, Double)
1540 JNI_ENTRY_CHECKED(jint,
1541 checked_jni_RegisterNatives(JNIEnv *env,
1542 jclass clazz,
1543 const JNINativeMethod *methods,
1544 jint nMethods))
1545 functionEnter(thr);
1546 jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);
1547 functionExit(env);
1548 return result;
1549 JNI_END
1551 JNI_ENTRY_CHECKED(jint,
1552 checked_jni_UnregisterNatives(JNIEnv *env,
1553 jclass clazz))
1554 functionEnter(thr);
1555 jint result = UNCHECKED()->UnregisterNatives(env,clazz);
1556 functionExit(env);
1557 return result;
1558 JNI_END
1560 JNI_ENTRY_CHECKED(jint,
1561 checked_jni_MonitorEnter(JNIEnv *env,
1562 jobject obj))
1563 functionEnter(thr);
1564 IN_VM(
1565 jniCheck::validate_object(thr, obj);
1566 )
1567 jint result = UNCHECKED()->MonitorEnter(env,obj);
1568 functionExit(env);
1569 return result;
1570 JNI_END
1572 JNI_ENTRY_CHECKED(jint,
1573 checked_jni_MonitorExit(JNIEnv *env,
1574 jobject obj))
1575 functionEnterExceptionAllowed(thr);
1576 IN_VM(
1577 jniCheck::validate_object(thr, obj);
1578 )
1579 jint result = UNCHECKED()->MonitorExit(env,obj);
1580 functionExit(env);
1581 return result;
1582 JNI_END
1584 JNI_ENTRY_CHECKED(jint,
1585 checked_jni_GetJavaVM(JNIEnv *env,
1586 JavaVM **vm))
1587 functionEnter(thr);
1588 jint result = UNCHECKED()->GetJavaVM(env,vm);
1589 functionExit(env);
1590 return result;
1591 JNI_END
1593 JNI_ENTRY_CHECKED(void,
1594 checked_jni_GetStringRegion(JNIEnv *env,
1595 jstring str,
1596 jsize start,
1597 jsize len,
1598 jchar *buf))
1599 functionEnter(thr);
1600 IN_VM(
1601 checkString(thr, str);
1602 )
1603 UNCHECKED()->GetStringRegion(env, str, start, len, buf);
1604 functionExit(env);
1605 JNI_END
1607 JNI_ENTRY_CHECKED(void,
1608 checked_jni_GetStringUTFRegion(JNIEnv *env,
1609 jstring str,
1610 jsize start,
1611 jsize len,
1612 char *buf))
1613 functionEnter(thr);
1614 IN_VM(
1615 checkString(thr, str);
1616 )
1617 UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);
1618 functionExit(env);
1619 JNI_END
1621 JNI_ENTRY_CHECKED(void *,
1622 checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,
1623 jarray array,
1624 jboolean *isCopy))
1625 functionEnterCritical(thr);
1626 IN_VM(
1627 checkArray(thr, array, -1);
1628 )
1629 void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);
1630 functionExit(env);
1631 return result;
1632 JNI_END
1634 JNI_ENTRY_CHECKED(void,
1635 checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,
1636 jarray array,
1637 void *carray,
1638 jint mode))
1639 functionEnterCriticalExceptionAllowed(thr);
1640 IN_VM(
1641 checkArray(thr, array, -1);
1642 )
1643 /* The Hotspot JNI code does not use the parameters, so just check the
1644 * array parameter as a minor sanity check
1645 */
1646 UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, carray, mode);
1647 functionExit(env);
1648 JNI_END
1650 JNI_ENTRY_CHECKED(const jchar*,
1651 checked_jni_GetStringCritical(JNIEnv *env,
1652 jstring string,
1653 jboolean *isCopy))
1654 functionEnterCritical(thr);
1655 IN_VM(
1656 checkString(thr, string);
1657 )
1658 const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);
1659 functionExit(env);
1660 return result;
1661 JNI_END
1663 JNI_ENTRY_CHECKED(void,
1664 checked_jni_ReleaseStringCritical(JNIEnv *env,
1665 jstring str,
1666 const jchar *chars))
1667 functionEnterCriticalExceptionAllowed(thr);
1668 IN_VM(
1669 checkString(thr, str);
1670 )
1671 /* The Hotspot JNI code does not use the parameters, so just check the
1672 * string parameter as a minor sanity check
1673 */
1674 UNCHECKED()->ReleaseStringCritical(env, str, chars);
1675 functionExit(env);
1676 JNI_END
1678 JNI_ENTRY_CHECKED(jweak,
1679 checked_jni_NewWeakGlobalRef(JNIEnv *env,
1680 jobject obj))
1681 functionEnter(thr);
1682 IN_VM(
1683 if (obj != NULL) {
1684 jniCheck::validate_handle(thr, obj);
1685 }
1686 )
1687 jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);
1688 functionExit(env);
1689 return result;
1690 JNI_END
1692 JNI_ENTRY_CHECKED(void,
1693 checked_jni_DeleteWeakGlobalRef(JNIEnv *env,
1694 jweak ref))
1695 functionEnterExceptionAllowed(thr);
1696 UNCHECKED()->DeleteWeakGlobalRef(env, ref);
1697 functionExit(env);
1698 JNI_END
1700 JNI_ENTRY_CHECKED(jboolean,
1701 checked_jni_ExceptionCheck(JNIEnv *env))
1702 functionEnterExceptionAllowed(thr);
1703 jboolean result = UNCHECKED()->ExceptionCheck(env);
1704 functionExit(env);
1705 return result;
1706 JNI_END
1708 JNI_ENTRY_CHECKED(jobject,
1709 checked_jni_NewDirectByteBuffer(JNIEnv *env,
1710 void *address,
1711 jlong capacity))
1712 functionEnter(thr);
1713 jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);
1714 functionExit(env);
1715 return result;
1716 JNI_END
1718 JNI_ENTRY_CHECKED(void *,
1719 checked_jni_GetDirectBufferAddress(JNIEnv *env,
1720 jobject buf))
1721 functionEnter(thr);
1722 void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);
1723 functionExit(env);
1724 return result;
1725 JNI_END
1727 JNI_ENTRY_CHECKED(jlong,
1728 checked_jni_GetDirectBufferCapacity(JNIEnv *env,
1729 jobject buf))
1730 functionEnter(thr);
1731 jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);
1732 functionExit(env);
1733 return result;
1734 JNI_END
1736 JNI_ENTRY_CHECKED(jobjectRefType,
1737 checked_jni_GetObjectRefType(JNIEnv *env,
1738 jobject obj))
1739 functionEnter(thr);
1740 /* validate the object being passed */
1741 IN_VM(
1742 jniCheck::validate_object(thr, obj);
1743 )
1744 jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);
1745 functionExit(env);
1746 return result;
1747 JNI_END
1750 JNI_ENTRY_CHECKED(jint,
1751 checked_jni_GetVersion(JNIEnv *env))
1752 functionEnter(thr);
1753 jint result = UNCHECKED()->GetVersion(env);
1754 functionExit(env);
1755 return result;
1756 JNI_END
1760 /*
1761 * Structure containing all checked jni functions
1762 */
1763 struct JNINativeInterface_ checked_jni_NativeInterface = {
1764 NULL,
1765 NULL,
1766 NULL,
1768 NULL,
1770 checked_jni_GetVersion,
1772 checked_jni_DefineClass,
1773 checked_jni_FindClass,
1775 checked_jni_FromReflectedMethod,
1776 checked_jni_FromReflectedField,
1778 checked_jni_ToReflectedMethod,
1780 checked_jni_GetSuperclass,
1781 checked_jni_IsAssignableFrom,
1783 checked_jni_ToReflectedField,
1785 checked_jni_Throw,
1786 checked_jni_ThrowNew,
1787 checked_jni_ExceptionOccurred,
1788 checked_jni_ExceptionDescribe,
1789 checked_jni_ExceptionClear,
1790 checked_jni_FatalError,
1792 checked_jni_PushLocalFrame,
1793 checked_jni_PopLocalFrame,
1795 checked_jni_NewGlobalRef,
1796 checked_jni_DeleteGlobalRef,
1797 checked_jni_DeleteLocalRef,
1798 checked_jni_IsSameObject,
1800 checked_jni_NewLocalRef,
1801 checked_jni_EnsureLocalCapacity,
1803 checked_jni_AllocObject,
1804 checked_jni_NewObject,
1805 checked_jni_NewObjectV,
1806 checked_jni_NewObjectA,
1808 checked_jni_GetObjectClass,
1809 checked_jni_IsInstanceOf,
1811 checked_jni_GetMethodID,
1813 checked_jni_CallObjectMethod,
1814 checked_jni_CallObjectMethodV,
1815 checked_jni_CallObjectMethodA,
1816 checked_jni_CallBooleanMethod,
1817 checked_jni_CallBooleanMethodV,
1818 checked_jni_CallBooleanMethodA,
1819 checked_jni_CallByteMethod,
1820 checked_jni_CallByteMethodV,
1821 checked_jni_CallByteMethodA,
1822 checked_jni_CallCharMethod,
1823 checked_jni_CallCharMethodV,
1824 checked_jni_CallCharMethodA,
1825 checked_jni_CallShortMethod,
1826 checked_jni_CallShortMethodV,
1827 checked_jni_CallShortMethodA,
1828 checked_jni_CallIntMethod,
1829 checked_jni_CallIntMethodV,
1830 checked_jni_CallIntMethodA,
1831 checked_jni_CallLongMethod,
1832 checked_jni_CallLongMethodV,
1833 checked_jni_CallLongMethodA,
1834 checked_jni_CallFloatMethod,
1835 checked_jni_CallFloatMethodV,
1836 checked_jni_CallFloatMethodA,
1837 checked_jni_CallDoubleMethod,
1838 checked_jni_CallDoubleMethodV,
1839 checked_jni_CallDoubleMethodA,
1840 checked_jni_CallVoidMethod,
1841 checked_jni_CallVoidMethodV,
1842 checked_jni_CallVoidMethodA,
1844 checked_jni_CallNonvirtualObjectMethod,
1845 checked_jni_CallNonvirtualObjectMethodV,
1846 checked_jni_CallNonvirtualObjectMethodA,
1847 checked_jni_CallNonvirtualBooleanMethod,
1848 checked_jni_CallNonvirtualBooleanMethodV,
1849 checked_jni_CallNonvirtualBooleanMethodA,
1850 checked_jni_CallNonvirtualByteMethod,
1851 checked_jni_CallNonvirtualByteMethodV,
1852 checked_jni_CallNonvirtualByteMethodA,
1853 checked_jni_CallNonvirtualCharMethod,
1854 checked_jni_CallNonvirtualCharMethodV,
1855 checked_jni_CallNonvirtualCharMethodA,
1856 checked_jni_CallNonvirtualShortMethod,
1857 checked_jni_CallNonvirtualShortMethodV,
1858 checked_jni_CallNonvirtualShortMethodA,
1859 checked_jni_CallNonvirtualIntMethod,
1860 checked_jni_CallNonvirtualIntMethodV,
1861 checked_jni_CallNonvirtualIntMethodA,
1862 checked_jni_CallNonvirtualLongMethod,
1863 checked_jni_CallNonvirtualLongMethodV,
1864 checked_jni_CallNonvirtualLongMethodA,
1865 checked_jni_CallNonvirtualFloatMethod,
1866 checked_jni_CallNonvirtualFloatMethodV,
1867 checked_jni_CallNonvirtualFloatMethodA,
1868 checked_jni_CallNonvirtualDoubleMethod,
1869 checked_jni_CallNonvirtualDoubleMethodV,
1870 checked_jni_CallNonvirtualDoubleMethodA,
1871 checked_jni_CallNonvirtualVoidMethod,
1872 checked_jni_CallNonvirtualVoidMethodV,
1873 checked_jni_CallNonvirtualVoidMethodA,
1875 checked_jni_GetFieldID,
1877 checked_jni_GetObjectField,
1878 checked_jni_GetBooleanField,
1879 checked_jni_GetByteField,
1880 checked_jni_GetCharField,
1881 checked_jni_GetShortField,
1882 checked_jni_GetIntField,
1883 checked_jni_GetLongField,
1884 checked_jni_GetFloatField,
1885 checked_jni_GetDoubleField,
1887 checked_jni_SetObjectField,
1888 checked_jni_SetBooleanField,
1889 checked_jni_SetByteField,
1890 checked_jni_SetCharField,
1891 checked_jni_SetShortField,
1892 checked_jni_SetIntField,
1893 checked_jni_SetLongField,
1894 checked_jni_SetFloatField,
1895 checked_jni_SetDoubleField,
1897 checked_jni_GetStaticMethodID,
1899 checked_jni_CallStaticObjectMethod,
1900 checked_jni_CallStaticObjectMethodV,
1901 checked_jni_CallStaticObjectMethodA,
1902 checked_jni_CallStaticBooleanMethod,
1903 checked_jni_CallStaticBooleanMethodV,
1904 checked_jni_CallStaticBooleanMethodA,
1905 checked_jni_CallStaticByteMethod,
1906 checked_jni_CallStaticByteMethodV,
1907 checked_jni_CallStaticByteMethodA,
1908 checked_jni_CallStaticCharMethod,
1909 checked_jni_CallStaticCharMethodV,
1910 checked_jni_CallStaticCharMethodA,
1911 checked_jni_CallStaticShortMethod,
1912 checked_jni_CallStaticShortMethodV,
1913 checked_jni_CallStaticShortMethodA,
1914 checked_jni_CallStaticIntMethod,
1915 checked_jni_CallStaticIntMethodV,
1916 checked_jni_CallStaticIntMethodA,
1917 checked_jni_CallStaticLongMethod,
1918 checked_jni_CallStaticLongMethodV,
1919 checked_jni_CallStaticLongMethodA,
1920 checked_jni_CallStaticFloatMethod,
1921 checked_jni_CallStaticFloatMethodV,
1922 checked_jni_CallStaticFloatMethodA,
1923 checked_jni_CallStaticDoubleMethod,
1924 checked_jni_CallStaticDoubleMethodV,
1925 checked_jni_CallStaticDoubleMethodA,
1926 checked_jni_CallStaticVoidMethod,
1927 checked_jni_CallStaticVoidMethodV,
1928 checked_jni_CallStaticVoidMethodA,
1930 checked_jni_GetStaticFieldID,
1932 checked_jni_GetStaticObjectField,
1933 checked_jni_GetStaticBooleanField,
1934 checked_jni_GetStaticByteField,
1935 checked_jni_GetStaticCharField,
1936 checked_jni_GetStaticShortField,
1937 checked_jni_GetStaticIntField,
1938 checked_jni_GetStaticLongField,
1939 checked_jni_GetStaticFloatField,
1940 checked_jni_GetStaticDoubleField,
1942 checked_jni_SetStaticObjectField,
1943 checked_jni_SetStaticBooleanField,
1944 checked_jni_SetStaticByteField,
1945 checked_jni_SetStaticCharField,
1946 checked_jni_SetStaticShortField,
1947 checked_jni_SetStaticIntField,
1948 checked_jni_SetStaticLongField,
1949 checked_jni_SetStaticFloatField,
1950 checked_jni_SetStaticDoubleField,
1952 checked_jni_NewString,
1953 checked_jni_GetStringLength,
1954 checked_jni_GetStringChars,
1955 checked_jni_ReleaseStringChars,
1957 checked_jni_NewStringUTF,
1958 checked_jni_GetStringUTFLength,
1959 checked_jni_GetStringUTFChars,
1960 checked_jni_ReleaseStringUTFChars,
1962 checked_jni_GetArrayLength,
1964 checked_jni_NewObjectArray,
1965 checked_jni_GetObjectArrayElement,
1966 checked_jni_SetObjectArrayElement,
1968 checked_jni_NewBooleanArray,
1969 checked_jni_NewByteArray,
1970 checked_jni_NewCharArray,
1971 checked_jni_NewShortArray,
1972 checked_jni_NewIntArray,
1973 checked_jni_NewLongArray,
1974 checked_jni_NewFloatArray,
1975 checked_jni_NewDoubleArray,
1977 checked_jni_GetBooleanArrayElements,
1978 checked_jni_GetByteArrayElements,
1979 checked_jni_GetCharArrayElements,
1980 checked_jni_GetShortArrayElements,
1981 checked_jni_GetIntArrayElements,
1982 checked_jni_GetLongArrayElements,
1983 checked_jni_GetFloatArrayElements,
1984 checked_jni_GetDoubleArrayElements,
1986 checked_jni_ReleaseBooleanArrayElements,
1987 checked_jni_ReleaseByteArrayElements,
1988 checked_jni_ReleaseCharArrayElements,
1989 checked_jni_ReleaseShortArrayElements,
1990 checked_jni_ReleaseIntArrayElements,
1991 checked_jni_ReleaseLongArrayElements,
1992 checked_jni_ReleaseFloatArrayElements,
1993 checked_jni_ReleaseDoubleArrayElements,
1995 checked_jni_GetBooleanArrayRegion,
1996 checked_jni_GetByteArrayRegion,
1997 checked_jni_GetCharArrayRegion,
1998 checked_jni_GetShortArrayRegion,
1999 checked_jni_GetIntArrayRegion,
2000 checked_jni_GetLongArrayRegion,
2001 checked_jni_GetFloatArrayRegion,
2002 checked_jni_GetDoubleArrayRegion,
2004 checked_jni_SetBooleanArrayRegion,
2005 checked_jni_SetByteArrayRegion,
2006 checked_jni_SetCharArrayRegion,
2007 checked_jni_SetShortArrayRegion,
2008 checked_jni_SetIntArrayRegion,
2009 checked_jni_SetLongArrayRegion,
2010 checked_jni_SetFloatArrayRegion,
2011 checked_jni_SetDoubleArrayRegion,
2013 checked_jni_RegisterNatives,
2014 checked_jni_UnregisterNatives,
2016 checked_jni_MonitorEnter,
2017 checked_jni_MonitorExit,
2019 checked_jni_GetJavaVM,
2021 checked_jni_GetStringRegion,
2022 checked_jni_GetStringUTFRegion,
2024 checked_jni_GetPrimitiveArrayCritical,
2025 checked_jni_ReleasePrimitiveArrayCritical,
2027 checked_jni_GetStringCritical,
2028 checked_jni_ReleaseStringCritical,
2030 checked_jni_NewWeakGlobalRef,
2031 checked_jni_DeleteWeakGlobalRef,
2033 checked_jni_ExceptionCheck,
2035 checked_jni_NewDirectByteBuffer,
2036 checked_jni_GetDirectBufferAddress,
2037 checked_jni_GetDirectBufferCapacity,
2039 // New 1.6 Features
2041 checked_jni_GetObjectRefType
2042 };
2045 // Returns the function structure
2046 struct JNINativeInterface_* jni_functions_check() {
2048 unchecked_jni_NativeInterface = jni_functions_nocheck();
2050 // make sure the last pointer in the checked table is not null, indicating
2051 // an addition to the JNINativeInterface_ structure without initializing
2052 // it in the checked table.
2053 debug_only(int *lastPtr = (int *)((char *)&checked_jni_NativeInterface + \
2054 sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));)
2055 assert(*lastPtr != 0,
2056 "Mismatched JNINativeInterface tables, check for new entries");
2058 // with -verbose:jni this message will print
2059 if (PrintJNIResolving) {
2060 tty->print_cr("Checked JNI functions are being used to " \
2061 "validate JNI usage");
2062 }
2064 return &checked_jni_NativeInterface;
2065 }