Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/prims/jniCheck.cpp
32285 views
1
/*
2
* Copyright (c) 2001, 2019, 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
*/
24
25
#include "precompiled.hpp"
26
#include "classfile/systemDictionary.hpp"
27
#include "classfile/vmSymbols.hpp"
28
#include "memory/guardedMemory.hpp"
29
#include "oops/instanceKlass.hpp"
30
#include "oops/oop.inline.hpp"
31
#include "oops/symbol.hpp"
32
#include "prims/jni.h"
33
#include "prims/jniCheck.hpp"
34
#include "prims/jvm_misc.hpp"
35
#include "runtime/fieldDescriptor.hpp"
36
#include "runtime/handles.hpp"
37
#include "runtime/interfaceSupport.hpp"
38
#include "runtime/jfieldIDWorkaround.hpp"
39
#include "runtime/thread.inline.hpp"
40
#ifdef TARGET_ARCH_x86
41
# include "jniTypes_x86.hpp"
42
#endif
43
#ifdef TARGET_ARCH_aarch32
44
# include "jniTypes_aarch32.hpp"
45
#endif
46
#ifdef TARGET_ARCH_aarch64
47
# include "jniTypes_aarch64.hpp"
48
#endif
49
#ifdef TARGET_ARCH_sparc
50
# include "jniTypes_sparc.hpp"
51
#endif
52
#ifdef TARGET_ARCH_zero
53
# include "jniTypes_zero.hpp"
54
#endif
55
#ifdef TARGET_ARCH_arm
56
# include "jniTypes_arm.hpp"
57
#endif
58
#ifdef TARGET_ARCH_ppc
59
# include "jniTypes_ppc.hpp"
60
#endif
61
62
// Complain every extra number of unplanned local refs
63
#define CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD 32
64
65
// Heap objects are allowed to be directly referenced only in VM code,
66
// not in native code.
67
68
#define ASSERT_OOPS_ALLOWED \
69
assert(JavaThread::current()->thread_state() == _thread_in_vm, \
70
"jniCheck examining oops in bad state.")
71
72
73
// Execute the given block of source code with the thread in VM state.
74
// To do this, transition from the NATIVE state to the VM state, execute
75
// the code, and transtition back. The ThreadInVMfromNative constructor
76
// performs the transition to VM state, its destructor restores the
77
// NATIVE state.
78
79
#define IN_VM(source_code) { \
80
{ \
81
ThreadInVMfromNative __tiv(thr); \
82
source_code \
83
} \
84
}
85
86
87
/*
88
* DECLARATIONS
89
*/
90
91
static struct JNINativeInterface_ * unchecked_jni_NativeInterface;
92
93
94
/*
95
* MACRO DEFINITIONS
96
*/
97
98
// All JNI checked functions here use JNI_ENTRY_CHECKED() instead of the
99
// QUICK_ENTRY or LEAF variants found in jni.cpp. This allows handles
100
// to be created if a fatal error should occur.
101
102
// Check for thread not attached to VM; need to catch this before
103
// assertions in the wrapper routines might fire
104
105
// Check for env being the one value appropriate for this thread.
106
107
#define JNI_ENTRY_CHECKED(result_type, header) \
108
extern "C" { \
109
result_type JNICALL header { \
110
JavaThread* thr = (JavaThread*)ThreadLocalStorage::get_thread_slow();\
111
if (thr == NULL || !thr->is_Java_thread()) { \
112
tty->print_cr("%s", fatal_using_jnienv_in_nonjava); \
113
os::abort(true); \
114
} \
115
JNIEnv* xenv = thr->jni_environment(); \
116
if (env != xenv) { \
117
NativeReportJNIFatalError(thr, warn_wrong_jnienv); \
118
} \
119
MACOS_AARCH64_ONLY(ThreadWXEnable __wx(WXWrite, thr)); \
120
VM_ENTRY_BASE(result_type, header, thr)
121
122
123
#define UNCHECKED() (unchecked_jni_NativeInterface)
124
125
static const char * warn_wrong_jnienv = "Using JNIEnv in the wrong thread";
126
static const char * warn_bad_class_descriptor = "JNI FindClass received a bad class descriptor \"%s\". A correct class descriptor " \
127
"has no leading \"L\" or trailing \";\". Incorrect descriptors will not be accepted in future releases.";
128
static const char * fatal_using_jnienv_in_nonjava = "FATAL ERROR in native method: Using JNIEnv in non-Java thread";
129
static const char * warn_other_function_in_critical = "Warning: Calling other JNI functions in the scope of " \
130
"Get/ReleasePrimitiveArrayCritical or Get/ReleaseStringCritical";
131
static const char * fatal_bad_ref_to_jni = "Bad global or local ref passed to JNI";
132
static const char * fatal_received_null_class = "JNI received a null class";
133
static const char * fatal_class_not_a_class = "JNI received a class argument that is not a class";
134
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";
135
static const char * fatal_wrong_class_or_method = "Wrong object class or methodID passed to JNI call";
136
static const char * fatal_non_weak_method = "non-weak methodID passed to JNI call";
137
static const char * fatal_unknown_array_object = "Unknown array object passed to JNI array operations";
138
static const char * fatal_object_array_expected = "Object array expected but not received for JNI array operation";
139
static const char * fatal_prim_type_array_expected = "Primitive type array expected but not received for JNI array operation";
140
static const char * fatal_non_array = "Non-array passed to JNI array operations";
141
static const char * fatal_element_type_mismatch = "Array element type mismatch in JNI";
142
static const char * fatal_should_be_static = "Non-static field ID passed to JNI";
143
static const char * fatal_wrong_static_field = "Wrong static field ID passed to JNI";
144
static const char * fatal_static_field_not_found = "Static field not found in JNI get/set field operations";
145
static const char * fatal_static_field_mismatch = "Field type (static) mismatch in JNI get/set field operations";
146
static const char * fatal_should_be_nonstatic = "Static field ID passed to JNI";
147
static const char * fatal_null_object = "Null object passed to JNI";
148
static const char * fatal_wrong_field = "Wrong field ID passed to JNI";
149
static const char * fatal_instance_field_not_found = "Instance field not found in JNI get/set field operations";
150
static const char * fatal_instance_field_mismatch = "Field type (instance) mismatch in JNI get/set field operations";
151
static const char * fatal_non_string = "JNI string operation received a non-string";
152
153
154
// When in VM state:
155
static void ReportJNIWarning(JavaThread* thr, const char *msg) {
156
tty->print_cr("WARNING in native method: %s", msg);
157
thr->print_stack();
158
}
159
160
// When in NATIVE state:
161
static void NativeReportJNIFatalError(JavaThread* thr, const char *msg) {
162
IN_VM(
163
ReportJNIFatalError(thr, msg);
164
)
165
}
166
167
static void NativeReportJNIWarning(JavaThread* thr, const char *msg) {
168
IN_VM(
169
ReportJNIWarning(thr, msg);
170
)
171
}
172
173
174
175
176
/*
177
* SUPPORT FUNCTIONS
178
*/
179
180
/**
181
* Check whether or not a programmer has actually checked for exceptions. According
182
* to the JNI Specification ("jni/spec/design.html#java_exceptions"):
183
*
184
* There are two cases where the programmer needs to check for exceptions without
185
* being able to first check an error code:
186
*
187
* - The JNI functions that invoke a Java method return the result of the Java method.
188
* The programmer must call ExceptionOccurred() to check for possible exceptions
189
* that occurred during the execution of the Java method.
190
*
191
* - Some of the JNI array access functions do not return an error code, but may
192
* throw an ArrayIndexOutOfBoundsException or ArrayStoreException.
193
*
194
* In all other cases, a non-error return value guarantees that no exceptions have been thrown.
195
*
196
* Programmers often defend against ArrayIndexOutOfBoundsException, so warning
197
* for these functions would be pedantic.
198
*/
199
static inline void
200
check_pending_exception(JavaThread* thr) {
201
if (thr->has_pending_exception()) {
202
NativeReportJNIWarning(thr, "JNI call made with exception pending");
203
}
204
if (thr->is_pending_jni_exception_check()) {
205
IN_VM(
206
tty->print_cr("WARNING in native method: JNI call made without checking exceptions when required to from %s",
207
thr->get_pending_jni_exception_check());
208
thr->print_stack();
209
)
210
thr->clear_pending_jni_exception_check(); // Just complain once
211
}
212
}
213
214
/**
215
* Add to the planned number of handles. I.e. plus current live & warning threshold
216
*/
217
static inline void
218
add_planned_handle_capacity(JNIHandleBlock* handles, size_t capacity) {
219
handles->set_planned_capacity(capacity +
220
handles->get_number_of_live_handles() +
221
CHECK_JNI_LOCAL_REF_CAP_WARN_THRESHOLD);
222
}
223
224
225
static inline void
226
functionEnterCritical(JavaThread* thr)
227
{
228
check_pending_exception(thr);
229
}
230
231
static inline void
232
functionEnterCriticalExceptionAllowed(JavaThread* thr)
233
{
234
}
235
236
static inline void
237
functionEnter(JavaThread* thr)
238
{
239
if (thr->in_critical()) {
240
tty->print_cr("%s", warn_other_function_in_critical);
241
}
242
check_pending_exception(thr);
243
}
244
245
static inline void
246
functionEnterExceptionAllowed(JavaThread* thr)
247
{
248
if (thr->in_critical()) {
249
tty->print_cr("%s", warn_other_function_in_critical);
250
}
251
}
252
253
static inline void
254
functionExit(JavaThread* thr)
255
{
256
JNIHandleBlock* handles = thr->active_handles();
257
size_t planned_capacity = handles->get_planned_capacity();
258
size_t live_handles = handles->get_number_of_live_handles();
259
if (live_handles > planned_capacity) {
260
IN_VM(
261
tty->print_cr("WARNING: JNI local refs: %zu, exceeds capacity: %zu",
262
live_handles, planned_capacity);
263
thr->print_stack();
264
)
265
// Complain just the once, reset to current + warn threshold
266
add_planned_handle_capacity(handles, 0);
267
}
268
}
269
270
static inline void
271
checkStaticFieldID(JavaThread* thr, jfieldID fid, jclass cls, int ftype)
272
{
273
fieldDescriptor fd;
274
275
/* make sure it is a static field */
276
if (!jfieldIDWorkaround::is_static_jfieldID(fid))
277
ReportJNIFatalError(thr, fatal_should_be_static);
278
279
/* validate the class being passed */
280
ASSERT_OOPS_ALLOWED;
281
Klass* k_oop = jniCheck::validate_class(thr, cls, false);
282
283
/* check for proper subclass hierarchy */
284
JNIid* id = jfieldIDWorkaround::from_static_jfieldID(fid);
285
Klass* f_oop = id->holder();
286
if (!InstanceKlass::cast(k_oop)->is_subtype_of(f_oop))
287
ReportJNIFatalError(thr, fatal_wrong_static_field);
288
289
/* check for proper field type */
290
if (!id->find_local_field(&fd))
291
ReportJNIFatalError(thr, fatal_static_field_not_found);
292
if ((fd.field_type() != ftype) &&
293
!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
294
ReportJNIFatalError(thr, fatal_static_field_mismatch);
295
}
296
}
297
298
static inline void
299
checkInstanceFieldID(JavaThread* thr, jfieldID fid, jobject obj, int ftype)
300
{
301
fieldDescriptor fd;
302
303
/* make sure it is an instance field */
304
if (jfieldIDWorkaround::is_static_jfieldID(fid))
305
ReportJNIFatalError(thr, fatal_should_be_nonstatic);
306
307
/* validate the object being passed and then get its class */
308
ASSERT_OOPS_ALLOWED;
309
oop oopObj = jniCheck::validate_object(thr, obj);
310
if (!oopObj) {
311
ReportJNIFatalError(thr, fatal_null_object);
312
}
313
Klass* k_oop = oopObj->klass();
314
315
if (!jfieldIDWorkaround::is_valid_jfieldID(k_oop, fid)) {
316
ReportJNIFatalError(thr, fatal_wrong_field);
317
}
318
319
/* make sure the field exists */
320
int offset = jfieldIDWorkaround::from_instance_jfieldID(k_oop, fid);
321
if (!InstanceKlass::cast(k_oop)->contains_field_offset(offset))
322
ReportJNIFatalError(thr, fatal_wrong_field);
323
324
/* check for proper field type */
325
if (!InstanceKlass::cast(k_oop)->find_field_from_offset(offset,
326
false, &fd))
327
ReportJNIFatalError(thr, fatal_instance_field_not_found);
328
329
if ((fd.field_type() != ftype) &&
330
!(fd.field_type() == T_ARRAY && ftype == T_OBJECT)) {
331
ReportJNIFatalError(thr, fatal_instance_field_mismatch);
332
}
333
}
334
335
static inline void
336
checkString(JavaThread* thr, jstring js)
337
{
338
ASSERT_OOPS_ALLOWED;
339
oop s = jniCheck::validate_object(thr, js);
340
if (!s || !java_lang_String::is_instance(s))
341
ReportJNIFatalError(thr, fatal_non_string);
342
}
343
344
static inline arrayOop
345
check_is_array(JavaThread* thr, jarray jArray)
346
{
347
ASSERT_OOPS_ALLOWED;
348
arrayOop aOop;
349
350
aOop = (arrayOop)jniCheck::validate_object(thr, jArray);
351
if (aOop == NULL || !aOop->is_array()) {
352
ReportJNIFatalError(thr, fatal_non_array);
353
}
354
return aOop;
355
}
356
357
static inline arrayOop
358
check_is_primitive_array(JavaThread* thr, jarray jArray) {
359
arrayOop aOop = check_is_array(thr, jArray);
360
361
if (!aOop->is_typeArray()) {
362
ReportJNIFatalError(thr, fatal_prim_type_array_expected);
363
}
364
return aOop;
365
}
366
367
static inline void
368
check_primitive_array_type(JavaThread* thr, jarray jArray, BasicType elementType)
369
{
370
BasicType array_type;
371
arrayOop aOop;
372
373
aOop = check_is_primitive_array(thr, jArray);
374
array_type = TypeArrayKlass::cast(aOop->klass())->element_type();
375
if (array_type != elementType) {
376
ReportJNIFatalError(thr, fatal_element_type_mismatch);
377
}
378
}
379
380
static inline void
381
check_is_obj_array(JavaThread* thr, jarray jArray) {
382
arrayOop aOop = check_is_array(thr, jArray);
383
if (!aOop->is_objArray()) {
384
ReportJNIFatalError(thr, fatal_object_array_expected);
385
}
386
}
387
388
/*
389
* Copy and wrap array elements for bounds checking.
390
* Remember the original elements (GuardedMemory::get_tag())
391
*/
392
static void* check_jni_wrap_copy_array(JavaThread* thr, jarray array,
393
void* orig_elements) {
394
void* result;
395
IN_VM(
396
oop a = JNIHandles::resolve_non_null(array);
397
size_t len = arrayOop(a)->length() <<
398
TypeArrayKlass::cast(a->klass())->log2_element_size();
399
result = GuardedMemory::wrap_copy(orig_elements, len, orig_elements);
400
)
401
return result;
402
}
403
404
static void* check_wrapped_array(JavaThread* thr, const char* fn_name,
405
void* obj, void* carray, size_t* rsz) {
406
if (carray == NULL) {
407
tty->print_cr("%s: elements vector NULL" PTR_FORMAT, fn_name, p2i(obj));
408
NativeReportJNIFatalError(thr, "Elements vector NULL");
409
}
410
GuardedMemory guarded(carray);
411
void* orig_result = guarded.get_tag();
412
if (!guarded.verify_guards()) {
413
tty->print_cr("ReleasePrimitiveArrayCritical: release array failed bounds "
414
"check, incorrect pointer returned ? array: " PTR_FORMAT " carray: "
415
PTR_FORMAT, p2i(obj), p2i(carray));
416
guarded.print_on(tty);
417
NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "
418
"failed bounds check");
419
}
420
if (orig_result == NULL) {
421
tty->print_cr("ReleasePrimitiveArrayCritical: unrecognized elements. array: "
422
PTR_FORMAT " carray: " PTR_FORMAT, p2i(obj), p2i(carray));
423
guarded.print_on(tty);
424
NativeReportJNIFatalError(thr, "ReleasePrimitiveArrayCritical: "
425
"unrecognized elements");
426
}
427
if (rsz != NULL) {
428
*rsz = guarded.get_user_size();
429
}
430
return orig_result;
431
}
432
433
static void* check_wrapped_array_release(JavaThread* thr, const char* fn_name,
434
void* obj, void* carray, jint mode) {
435
size_t sz;
436
void* orig_result = check_wrapped_array(thr, fn_name, obj, carray, &sz);
437
switch (mode) {
438
// As we never make copies, mode 0 and JNI_COMMIT are the same.
439
case 0:
440
case JNI_COMMIT:
441
memcpy(orig_result, carray, sz);
442
break;
443
case JNI_ABORT:
444
break;
445
default:
446
tty->print_cr("%s: Unrecognized mode %i releasing array "
447
PTR_FORMAT " elements " PTR_FORMAT, fn_name, mode, p2i(obj), p2i(carray));
448
NativeReportJNIFatalError(thr, "Unrecognized array release mode");
449
}
450
// We always need to release the copy we made with GuardedMemory
451
GuardedMemory::free_copy(carray);
452
return orig_result;
453
}
454
455
oop jniCheck::validate_handle(JavaThread* thr, jobject obj) {
456
if (JNIHandles::is_frame_handle(thr, obj) ||
457
JNIHandles::is_local_handle(thr, obj) ||
458
JNIHandles::is_global_handle(obj) ||
459
JNIHandles::is_weak_global_handle(obj)) {
460
ASSERT_OOPS_ALLOWED;
461
return JNIHandles::resolve_external_guard(obj);
462
}
463
ReportJNIFatalError(thr, fatal_bad_ref_to_jni);
464
return NULL;
465
}
466
467
468
Method* jniCheck::validate_jmethod_id(JavaThread* thr, jmethodID method_id) {
469
ASSERT_OOPS_ALLOWED;
470
// Do the jmethodID check
471
Method* moop = Method::checked_resolve_jmethod_id(method_id);
472
if (moop == NULL) {
473
ReportJNIFatalError(thr, fatal_wrong_class_or_method);
474
}
475
return moop;
476
}
477
478
479
oop jniCheck::validate_object(JavaThread* thr, jobject obj) {
480
if (!obj)
481
return NULL;
482
ASSERT_OOPS_ALLOWED;
483
oop oopObj = jniCheck::validate_handle(thr, obj);
484
if (!oopObj) {
485
ReportJNIFatalError(thr, fatal_bad_ref_to_jni);
486
}
487
return oopObj;
488
}
489
490
// Warn if a class descriptor is in decorated form; class descriptors
491
// passed to JNI findClass should not be decorated unless they are
492
// array descriptors.
493
void jniCheck::validate_class_descriptor(JavaThread* thr, const char* name) {
494
if (name == NULL) return; // implementation accepts NULL so just return
495
496
size_t len = strlen(name);
497
498
if (len >= 2 &&
499
name[0] == JVM_SIGNATURE_CLASS && // 'L'
500
name[len-1] == JVM_SIGNATURE_ENDCLASS ) { // ';'
501
char msg[JVM_MAXPATHLEN];
502
jio_snprintf(msg, JVM_MAXPATHLEN, warn_bad_class_descriptor, name);
503
ReportJNIWarning(thr, msg);
504
}
505
}
506
507
Klass* jniCheck::validate_class(JavaThread* thr, jclass clazz, bool allow_primitive) {
508
ASSERT_OOPS_ALLOWED;
509
oop mirror = jniCheck::validate_handle(thr, clazz);
510
if (!mirror) {
511
ReportJNIFatalError(thr, fatal_received_null_class);
512
}
513
514
if (mirror->klass() != SystemDictionary::Class_klass()) {
515
ReportJNIFatalError(thr, fatal_class_not_a_class);
516
}
517
518
Klass* k = java_lang_Class::as_Klass(mirror);
519
// Make allowances for primitive classes ...
520
if (!(k != NULL || allow_primitive && java_lang_Class::is_primitive(mirror))) {
521
ReportJNIFatalError(thr, fatal_class_not_a_class);
522
}
523
return k;
524
}
525
526
void jniCheck::validate_throwable_klass(JavaThread* thr, Klass* klass) {
527
ASSERT_OOPS_ALLOWED;
528
assert(klass != NULL, "klass argument must have a value");
529
530
if (!klass->oop_is_instance() ||
531
!InstanceKlass::cast(klass)->is_subclass_of(SystemDictionary::Throwable_klass())) {
532
ReportJNIFatalError(thr, fatal_class_not_a_throwable_class);
533
}
534
}
535
536
void jniCheck::validate_call_object(JavaThread* thr, jobject obj, jmethodID method_id) {
537
/* validate the object being passed */
538
ASSERT_OOPS_ALLOWED;
539
jniCheck::validate_jmethod_id(thr, method_id);
540
jniCheck::validate_object(thr, obj);
541
}
542
543
void jniCheck::validate_call_class(JavaThread* thr, jclass clazz, jmethodID method_id) {
544
/* validate the class being passed */
545
ASSERT_OOPS_ALLOWED;
546
jniCheck::validate_jmethod_id(thr, method_id);
547
jniCheck::validate_class(thr, clazz, false);
548
}
549
550
551
/*
552
* IMPLEMENTATION OF FUNCTIONS IN CHECKED TABLE
553
*/
554
555
JNI_ENTRY_CHECKED(jclass,
556
checked_jni_DefineClass(JNIEnv *env,
557
const char *name,
558
jobject loader,
559
const jbyte *buf,
560
jsize len))
561
functionEnter(thr);
562
IN_VM(
563
jniCheck::validate_object(thr, loader);
564
)
565
jclass result = UNCHECKED()->DefineClass(env, name, loader, buf, len);
566
functionExit(thr);
567
return result;
568
JNI_END
569
570
JNI_ENTRY_CHECKED(jclass,
571
checked_jni_FindClass(JNIEnv *env,
572
const char *name))
573
functionEnter(thr);
574
IN_VM(
575
jniCheck::validate_class_descriptor(thr, name);
576
)
577
jclass result = UNCHECKED()->FindClass(env, name);
578
functionExit(thr);
579
return result;
580
JNI_END
581
582
JNI_ENTRY_CHECKED(jmethodID,
583
checked_jni_FromReflectedMethod(JNIEnv *env,
584
jobject method))
585
functionEnter(thr);
586
IN_VM(
587
jniCheck::validate_object(thr, method);
588
)
589
jmethodID result = UNCHECKED()->FromReflectedMethod(env, method);
590
functionExit(thr);
591
return result;
592
JNI_END
593
594
JNI_ENTRY_CHECKED(jfieldID,
595
checked_jni_FromReflectedField(JNIEnv *env,
596
jobject field))
597
functionEnter(thr);
598
IN_VM(
599
jniCheck::validate_object(thr, field);
600
)
601
jfieldID result = UNCHECKED()->FromReflectedField(env, field);
602
functionExit(thr);
603
return result;
604
JNI_END
605
606
JNI_ENTRY_CHECKED(jobject,
607
checked_jni_ToReflectedMethod(JNIEnv *env,
608
jclass cls,
609
jmethodID methodID,
610
jboolean isStatic))
611
functionEnter(thr);
612
IN_VM(
613
jniCheck::validate_class(thr, cls, false);
614
jniCheck::validate_jmethod_id(thr, methodID);
615
)
616
jobject result = UNCHECKED()->ToReflectedMethod(env, cls, methodID,
617
isStatic);
618
functionExit(thr);
619
return result;
620
JNI_END
621
622
JNI_ENTRY_CHECKED(jclass,
623
checked_jni_GetSuperclass(JNIEnv *env,
624
jclass sub))
625
functionEnter(thr);
626
IN_VM(
627
jniCheck::validate_class(thr, sub, true);
628
)
629
jclass result = UNCHECKED()->GetSuperclass(env, sub);
630
functionExit(thr);
631
return result;
632
JNI_END
633
634
JNI_ENTRY_CHECKED(jboolean,
635
checked_jni_IsAssignableFrom(JNIEnv *env,
636
jclass sub,
637
jclass sup))
638
functionEnter(thr);
639
IN_VM(
640
jniCheck::validate_class(thr, sub, true);
641
jniCheck::validate_class(thr, sup, true);
642
)
643
jboolean result = UNCHECKED()->IsAssignableFrom(env, sub, sup);
644
functionExit(thr);
645
return result;
646
JNI_END
647
648
JNI_ENTRY_CHECKED(jobject,
649
checked_jni_ToReflectedField(JNIEnv *env,
650
jclass cls,
651
jfieldID fieldID,
652
jboolean isStatic))
653
functionEnter(thr);
654
IN_VM(
655
jniCheck::validate_class(thr, cls, false);
656
)
657
jobject result = UNCHECKED()->ToReflectedField(env, cls, fieldID,
658
isStatic);
659
functionExit(thr);
660
return result;
661
JNI_END
662
663
JNI_ENTRY_CHECKED(jint,
664
checked_jni_Throw(JNIEnv *env,
665
jthrowable obj))
666
functionEnter(thr);
667
IN_VM(
668
oop oopObj = jniCheck::validate_object(thr, obj);
669
if (oopObj == NULL) {
670
// Unchecked Throw tolerates a NULL obj, so just warn
671
ReportJNIWarning(thr, "JNI Throw called with NULL throwable");
672
} else {
673
jniCheck::validate_throwable_klass(thr, oopObj->klass());
674
}
675
)
676
jint result = UNCHECKED()->Throw(env, obj);
677
functionExit(thr);
678
return result;
679
JNI_END
680
681
JNI_ENTRY_CHECKED(jint,
682
checked_jni_ThrowNew(JNIEnv *env,
683
jclass clazz,
684
const char *msg))
685
functionEnter(thr);
686
IN_VM(
687
Klass* k = jniCheck::validate_class(thr, clazz, false);
688
assert(k != NULL, "validate_class shouldn't return NULL Klass*");
689
jniCheck::validate_throwable_klass(thr, k);
690
)
691
jint result = UNCHECKED()->ThrowNew(env, clazz, msg);
692
functionExit(thr);
693
return result;
694
JNI_END
695
696
JNI_ENTRY_CHECKED(jthrowable,
697
checked_jni_ExceptionOccurred(JNIEnv *env))
698
thr->clear_pending_jni_exception_check();
699
functionEnterExceptionAllowed(thr);
700
jthrowable result = UNCHECKED()->ExceptionOccurred(env);
701
functionExit(thr);
702
return result;
703
JNI_END
704
705
JNI_ENTRY_CHECKED(void,
706
checked_jni_ExceptionDescribe(JNIEnv *env))
707
functionEnterExceptionAllowed(thr);
708
UNCHECKED()->ExceptionDescribe(env);
709
functionExit(thr);
710
JNI_END
711
712
JNI_ENTRY_CHECKED(void,
713
checked_jni_ExceptionClear(JNIEnv *env))
714
thr->clear_pending_jni_exception_check();
715
functionEnterExceptionAllowed(thr);
716
UNCHECKED()->ExceptionClear(env);
717
functionExit(thr);
718
JNI_END
719
720
JNI_ENTRY_CHECKED(void,
721
checked_jni_FatalError(JNIEnv *env,
722
const char *msg))
723
thr->clear_pending_jni_exception_check();
724
functionEnter(thr);
725
UNCHECKED()->FatalError(env, msg);
726
functionExit(thr);
727
JNI_END
728
729
JNI_ENTRY_CHECKED(jint,
730
checked_jni_PushLocalFrame(JNIEnv *env,
731
jint capacity))
732
functionEnterExceptionAllowed(thr);
733
if (capacity < 0)
734
NativeReportJNIFatalError(thr, "negative capacity");
735
jint result = UNCHECKED()->PushLocalFrame(env, capacity);
736
if (result == JNI_OK) {
737
add_planned_handle_capacity(thr->active_handles(), capacity);
738
}
739
functionExit(thr);
740
return result;
741
JNI_END
742
743
JNI_ENTRY_CHECKED(jobject,
744
checked_jni_PopLocalFrame(JNIEnv *env,
745
jobject result))
746
functionEnterExceptionAllowed(thr);
747
jobject res = UNCHECKED()->PopLocalFrame(env, result);
748
functionExit(thr);
749
return res;
750
JNI_END
751
752
JNI_ENTRY_CHECKED(jobject,
753
checked_jni_NewGlobalRef(JNIEnv *env,
754
jobject lobj))
755
functionEnter(thr);
756
IN_VM(
757
if (lobj != NULL) {
758
jniCheck::validate_handle(thr, lobj);
759
}
760
)
761
jobject result = UNCHECKED()->NewGlobalRef(env,lobj);
762
functionExit(thr);
763
return result;
764
JNI_END
765
766
JNI_ENTRY_CHECKED(void,
767
checked_jni_DeleteGlobalRef(JNIEnv *env,
768
jobject gref))
769
functionEnterExceptionAllowed(thr);
770
IN_VM(
771
jniCheck::validate_object(thr, gref);
772
if (gref && !JNIHandles::is_global_handle(gref)) {
773
ReportJNIFatalError(thr,
774
"Invalid global JNI handle passed to DeleteGlobalRef");
775
}
776
)
777
UNCHECKED()->DeleteGlobalRef(env,gref);
778
functionExit(thr);
779
JNI_END
780
781
JNI_ENTRY_CHECKED(void,
782
checked_jni_DeleteLocalRef(JNIEnv *env,
783
jobject obj))
784
functionEnterExceptionAllowed(thr);
785
IN_VM(
786
jniCheck::validate_object(thr, obj);
787
if (obj && !(JNIHandles::is_local_handle(thr, obj) ||
788
JNIHandles::is_frame_handle(thr, obj)))
789
ReportJNIFatalError(thr,
790
"Invalid local JNI handle passed to DeleteLocalRef");
791
)
792
UNCHECKED()->DeleteLocalRef(env, obj);
793
functionExit(thr);
794
JNI_END
795
796
JNI_ENTRY_CHECKED(jboolean,
797
checked_jni_IsSameObject(JNIEnv *env,
798
jobject obj1,
799
jobject obj2))
800
functionEnterExceptionAllowed(thr);
801
IN_VM(
802
/* This JNI function can be used to compare weak global references
803
* to NULL objects. If the handles are valid, but contain NULL,
804
* then don't attempt to validate the object.
805
*/
806
if (obj1 != NULL && jniCheck::validate_handle(thr, obj1) != NULL) {
807
jniCheck::validate_object(thr, obj1);
808
}
809
if (obj2 != NULL && jniCheck::validate_handle(thr, obj2) != NULL) {
810
jniCheck::validate_object(thr, obj2);
811
}
812
)
813
jboolean result = UNCHECKED()->IsSameObject(env,obj1,obj2);
814
functionExit(thr);
815
return result;
816
JNI_END
817
818
JNI_ENTRY_CHECKED(jobject,
819
checked_jni_NewLocalRef(JNIEnv *env,
820
jobject ref))
821
functionEnter(thr);
822
IN_VM(
823
if (ref != NULL) {
824
jniCheck::validate_handle(thr, ref);
825
}
826
)
827
jobject result = UNCHECKED()->NewLocalRef(env, ref);
828
functionExit(thr);
829
return result;
830
JNI_END
831
832
JNI_ENTRY_CHECKED(jint,
833
checked_jni_EnsureLocalCapacity(JNIEnv *env,
834
jint capacity))
835
functionEnter(thr);
836
if (capacity < 0) {
837
NativeReportJNIFatalError(thr, "negative capacity");
838
}
839
jint result = UNCHECKED()->EnsureLocalCapacity(env, capacity);
840
if (result == JNI_OK) {
841
add_planned_handle_capacity(thr->active_handles(), capacity);
842
}
843
functionExit(thr);
844
return result;
845
JNI_END
846
847
JNI_ENTRY_CHECKED(jobject,
848
checked_jni_AllocObject(JNIEnv *env,
849
jclass clazz))
850
functionEnter(thr);
851
IN_VM(
852
jniCheck::validate_class(thr, clazz, false);
853
)
854
jobject result = UNCHECKED()->AllocObject(env,clazz);
855
functionExit(thr);
856
return result;
857
JNI_END
858
859
JNI_ENTRY_CHECKED(jobject,
860
checked_jni_NewObject(JNIEnv *env,
861
jclass clazz,
862
jmethodID methodID,
863
...))
864
functionEnter(thr);
865
va_list args;
866
IN_VM(
867
jniCheck::validate_class(thr, clazz, false);
868
jniCheck::validate_jmethod_id(thr, methodID);
869
)
870
va_start(args, methodID);
871
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
872
va_end(args);
873
functionExit(thr);
874
return result;
875
JNI_END
876
877
JNI_ENTRY_CHECKED(jobject,
878
checked_jni_NewObjectV(JNIEnv *env,
879
jclass clazz,
880
jmethodID methodID,
881
va_list args))
882
functionEnter(thr);
883
IN_VM(
884
jniCheck::validate_class(thr, clazz, false);
885
jniCheck::validate_jmethod_id(thr, methodID);
886
)
887
jobject result = UNCHECKED()->NewObjectV(env,clazz,methodID,args);
888
functionExit(thr);
889
return result;
890
JNI_END
891
892
JNI_ENTRY_CHECKED(jobject,
893
checked_jni_NewObjectA(JNIEnv *env,
894
jclass clazz,
895
jmethodID methodID,
896
const jvalue *args))
897
functionEnter(thr);
898
IN_VM(
899
jniCheck::validate_class(thr, clazz, false);
900
jniCheck::validate_jmethod_id(thr, methodID);
901
)
902
jobject result = UNCHECKED()->NewObjectA(env,clazz,methodID,args);
903
functionExit(thr);
904
return result;
905
JNI_END
906
907
JNI_ENTRY_CHECKED(jclass,
908
checked_jni_GetObjectClass(JNIEnv *env,
909
jobject obj))
910
functionEnter(thr);
911
IN_VM(
912
jniCheck::validate_object(thr, obj);
913
)
914
jclass result = UNCHECKED()->GetObjectClass(env,obj);
915
functionExit(thr);
916
return result;
917
JNI_END
918
919
JNI_ENTRY_CHECKED(jboolean,
920
checked_jni_IsInstanceOf(JNIEnv *env,
921
jobject obj,
922
jclass clazz))
923
functionEnter(thr);
924
IN_VM(
925
jniCheck::validate_object(thr, obj);
926
jniCheck::validate_class(thr, clazz, true);
927
)
928
jboolean result = UNCHECKED()->IsInstanceOf(env,obj,clazz);
929
functionExit(thr);
930
return result;
931
JNI_END
932
933
JNI_ENTRY_CHECKED(jmethodID,
934
checked_jni_GetMethodID(JNIEnv *env,
935
jclass clazz,
936
const char *name,
937
const char *sig))
938
functionEnter(thr);
939
IN_VM(
940
jniCheck::validate_class(thr, clazz, false);
941
)
942
jmethodID result = UNCHECKED()->GetMethodID(env,clazz,name,sig);
943
functionExit(thr);
944
return result;
945
JNI_END
946
947
#define WRAPPER_CallMethod(ResultType, Result) \
948
JNI_ENTRY_CHECKED(ResultType, \
949
checked_jni_Call##Result##Method(JNIEnv *env, \
950
jobject obj, \
951
jmethodID methodID, \
952
...)) \
953
functionEnter(thr); \
954
va_list args; \
955
IN_VM( \
956
jniCheck::validate_call_object(thr, obj, methodID); \
957
) \
958
va_start(args,methodID); \
959
ResultType result =UNCHECKED()->Call##Result##MethodV(env, obj, methodID, \
960
args); \
961
va_end(args); \
962
thr->set_pending_jni_exception_check("Call"#Result"Method"); \
963
functionExit(thr); \
964
return result; \
965
JNI_END \
966
\
967
JNI_ENTRY_CHECKED(ResultType, \
968
checked_jni_Call##Result##MethodV(JNIEnv *env, \
969
jobject obj, \
970
jmethodID methodID, \
971
va_list args)) \
972
functionEnter(thr); \
973
IN_VM(\
974
jniCheck::validate_call_object(thr, obj, methodID); \
975
) \
976
ResultType result = UNCHECKED()->Call##Result##MethodV(env, obj, methodID,\
977
args); \
978
thr->set_pending_jni_exception_check("Call"#Result"MethodV"); \
979
functionExit(thr); \
980
return result; \
981
JNI_END \
982
\
983
JNI_ENTRY_CHECKED(ResultType, \
984
checked_jni_Call##Result##MethodA(JNIEnv *env, \
985
jobject obj, \
986
jmethodID methodID, \
987
const jvalue * args)) \
988
functionEnter(thr); \
989
IN_VM( \
990
jniCheck::validate_call_object(thr, obj, methodID); \
991
) \
992
ResultType result = UNCHECKED()->Call##Result##MethodA(env, obj, methodID,\
993
args); \
994
thr->set_pending_jni_exception_check("Call"#Result"MethodA"); \
995
functionExit(thr); \
996
return result; \
997
JNI_END
998
999
WRAPPER_CallMethod(jobject,Object)
1000
WRAPPER_CallMethod(jboolean,Boolean)
1001
WRAPPER_CallMethod(jbyte,Byte)
1002
WRAPPER_CallMethod(jshort,Short)
1003
WRAPPER_CallMethod(jchar,Char)
1004
WRAPPER_CallMethod(jint,Int)
1005
WRAPPER_CallMethod(jlong,Long)
1006
WRAPPER_CallMethod(jfloat,Float)
1007
WRAPPER_CallMethod(jdouble,Double)
1008
1009
JNI_ENTRY_CHECKED(void,
1010
checked_jni_CallVoidMethod(JNIEnv *env, \
1011
jobject obj, \
1012
jmethodID methodID, \
1013
...))
1014
functionEnter(thr);
1015
va_list args;
1016
IN_VM(
1017
jniCheck::validate_call_object(thr, obj, methodID);
1018
)
1019
va_start(args,methodID);
1020
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
1021
va_end(args);
1022
thr->set_pending_jni_exception_check("CallVoidMethod");
1023
functionExit(thr);
1024
JNI_END
1025
1026
JNI_ENTRY_CHECKED(void,
1027
checked_jni_CallVoidMethodV(JNIEnv *env,
1028
jobject obj,
1029
jmethodID methodID,
1030
va_list args))
1031
functionEnter(thr);
1032
IN_VM(
1033
jniCheck::validate_call_object(thr, obj, methodID);
1034
)
1035
UNCHECKED()->CallVoidMethodV(env,obj,methodID,args);
1036
thr->set_pending_jni_exception_check("CallVoidMethodV");
1037
functionExit(thr);
1038
JNI_END
1039
1040
JNI_ENTRY_CHECKED(void,
1041
checked_jni_CallVoidMethodA(JNIEnv *env,
1042
jobject obj,
1043
jmethodID methodID,
1044
const jvalue * args))
1045
functionEnter(thr);
1046
IN_VM(
1047
jniCheck::validate_call_object(thr, obj, methodID);
1048
)
1049
UNCHECKED()->CallVoidMethodA(env,obj,methodID,args);
1050
thr->set_pending_jni_exception_check("CallVoidMethodA");
1051
functionExit(thr);
1052
JNI_END
1053
1054
#define WRAPPER_CallNonvirtualMethod(ResultType, Result) \
1055
JNI_ENTRY_CHECKED(ResultType, \
1056
checked_jni_CallNonvirtual##Result##Method(JNIEnv *env, \
1057
jobject obj, \
1058
jclass clazz, \
1059
jmethodID methodID, \
1060
...)) \
1061
functionEnter(thr); \
1062
va_list args; \
1063
IN_VM( \
1064
jniCheck::validate_call_object(thr, obj, methodID); \
1065
jniCheck::validate_call_class(thr, clazz, methodID); \
1066
) \
1067
va_start(args,methodID); \
1068
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
1069
obj, \
1070
clazz, \
1071
methodID,\
1072
args); \
1073
va_end(args); \
1074
thr->set_pending_jni_exception_check("CallNonvirtual"#Result"Method"); \
1075
functionExit(thr); \
1076
return result; \
1077
JNI_END \
1078
\
1079
JNI_ENTRY_CHECKED(ResultType, \
1080
checked_jni_CallNonvirtual##Result##MethodV(JNIEnv *env, \
1081
jobject obj, \
1082
jclass clazz, \
1083
jmethodID methodID, \
1084
va_list args)) \
1085
functionEnter(thr); \
1086
IN_VM( \
1087
jniCheck::validate_call_object(thr, obj, methodID); \
1088
jniCheck::validate_call_class(thr, clazz, methodID); \
1089
) \
1090
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodV(env, \
1091
obj, \
1092
clazz, \
1093
methodID,\
1094
args); \
1095
thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodV"); \
1096
functionExit(thr); \
1097
return result; \
1098
JNI_END \
1099
\
1100
JNI_ENTRY_CHECKED(ResultType, \
1101
checked_jni_CallNonvirtual##Result##MethodA(JNIEnv *env, \
1102
jobject obj, \
1103
jclass clazz, \
1104
jmethodID methodID, \
1105
const jvalue * args)) \
1106
functionEnter(thr); \
1107
IN_VM( \
1108
jniCheck::validate_call_object(thr, obj, methodID); \
1109
jniCheck::validate_call_class(thr, clazz, methodID); \
1110
) \
1111
ResultType result = UNCHECKED()->CallNonvirtual##Result##MethodA(env, \
1112
obj, \
1113
clazz, \
1114
methodID,\
1115
args); \
1116
thr->set_pending_jni_exception_check("CallNonvirtual"#Result"MethodA"); \
1117
functionExit(thr); \
1118
return result; \
1119
JNI_END
1120
1121
WRAPPER_CallNonvirtualMethod(jobject,Object)
1122
WRAPPER_CallNonvirtualMethod(jboolean,Boolean)
1123
WRAPPER_CallNonvirtualMethod(jbyte,Byte)
1124
WRAPPER_CallNonvirtualMethod(jshort,Short)
1125
WRAPPER_CallNonvirtualMethod(jchar,Char)
1126
WRAPPER_CallNonvirtualMethod(jint,Int)
1127
WRAPPER_CallNonvirtualMethod(jlong,Long)
1128
WRAPPER_CallNonvirtualMethod(jfloat,Float)
1129
WRAPPER_CallNonvirtualMethod(jdouble,Double)
1130
1131
JNI_ENTRY_CHECKED(void,
1132
checked_jni_CallNonvirtualVoidMethod(JNIEnv *env,
1133
jobject obj,
1134
jclass clazz,
1135
jmethodID methodID,
1136
...))
1137
functionEnter(thr);
1138
va_list args;
1139
IN_VM(
1140
jniCheck::validate_call_object(thr, obj, methodID);
1141
jniCheck::validate_call_class(thr, clazz, methodID);
1142
)
1143
va_start(args,methodID);
1144
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
1145
va_end(args);
1146
thr->set_pending_jni_exception_check("CallNonvirtualVoidMethod");
1147
functionExit(thr);
1148
JNI_END
1149
1150
JNI_ENTRY_CHECKED(void,
1151
checked_jni_CallNonvirtualVoidMethodV(JNIEnv *env,
1152
jobject obj,
1153
jclass clazz,
1154
jmethodID methodID,
1155
va_list args))
1156
functionEnter(thr);
1157
IN_VM(
1158
jniCheck::validate_call_object(thr, obj, methodID);
1159
jniCheck::validate_call_class(thr, clazz, methodID);
1160
)
1161
UNCHECKED()->CallNonvirtualVoidMethodV(env,obj,clazz,methodID,args);
1162
thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodV");
1163
functionExit(thr);
1164
JNI_END
1165
1166
JNI_ENTRY_CHECKED(void,
1167
checked_jni_CallNonvirtualVoidMethodA(JNIEnv *env,
1168
jobject obj,
1169
jclass clazz,
1170
jmethodID methodID,
1171
const jvalue * args))
1172
functionEnter(thr);
1173
IN_VM(
1174
jniCheck::validate_call_object(thr, obj, methodID);
1175
jniCheck::validate_call_class(thr, clazz, methodID);
1176
)
1177
UNCHECKED()->CallNonvirtualVoidMethodA(env,obj,clazz,methodID,args);
1178
thr->set_pending_jni_exception_check("CallNonvirtualVoidMethodA");
1179
functionExit(thr);
1180
JNI_END
1181
1182
JNI_ENTRY_CHECKED(jfieldID,
1183
checked_jni_GetFieldID(JNIEnv *env,
1184
jclass clazz,
1185
const char *name,
1186
const char *sig))
1187
functionEnter(thr);
1188
IN_VM(
1189
jniCheck::validate_class(thr, clazz, false);
1190
)
1191
jfieldID result = UNCHECKED()->GetFieldID(env,clazz,name,sig);
1192
functionExit(thr);
1193
return result;
1194
JNI_END
1195
1196
#define WRAPPER_GetField(ReturnType,Result,FieldType) \
1197
JNI_ENTRY_CHECKED(ReturnType, \
1198
checked_jni_Get##Result##Field(JNIEnv *env, \
1199
jobject obj, \
1200
jfieldID fieldID)) \
1201
functionEnter(thr); \
1202
IN_VM( \
1203
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
1204
) \
1205
ReturnType result = UNCHECKED()->Get##Result##Field(env,obj,fieldID); \
1206
functionExit(thr); \
1207
return result; \
1208
JNI_END
1209
1210
WRAPPER_GetField(jobject, Object, T_OBJECT)
1211
WRAPPER_GetField(jboolean, Boolean, T_BOOLEAN)
1212
WRAPPER_GetField(jbyte, Byte, T_BYTE)
1213
WRAPPER_GetField(jshort, Short, T_SHORT)
1214
WRAPPER_GetField(jchar, Char, T_CHAR)
1215
WRAPPER_GetField(jint, Int, T_INT)
1216
WRAPPER_GetField(jlong, Long, T_LONG)
1217
WRAPPER_GetField(jfloat, Float, T_FLOAT)
1218
WRAPPER_GetField(jdouble, Double, T_DOUBLE)
1219
1220
#define WRAPPER_SetField(ValueType,Result,FieldType) \
1221
JNI_ENTRY_CHECKED(void, \
1222
checked_jni_Set##Result##Field(JNIEnv *env, \
1223
jobject obj, \
1224
jfieldID fieldID, \
1225
ValueType val)) \
1226
functionEnter(thr); \
1227
IN_VM( \
1228
checkInstanceFieldID(thr, fieldID, obj, FieldType); \
1229
) \
1230
UNCHECKED()->Set##Result##Field(env,obj,fieldID,val); \
1231
functionExit(thr); \
1232
JNI_END
1233
1234
WRAPPER_SetField(jobject, Object, T_OBJECT)
1235
WRAPPER_SetField(jboolean, Boolean, T_BOOLEAN)
1236
WRAPPER_SetField(jbyte, Byte, T_BYTE)
1237
WRAPPER_SetField(jshort, Short, T_SHORT)
1238
WRAPPER_SetField(jchar, Char, T_CHAR)
1239
WRAPPER_SetField(jint, Int, T_INT)
1240
WRAPPER_SetField(jlong, Long, T_LONG)
1241
WRAPPER_SetField(jfloat, Float, T_FLOAT)
1242
WRAPPER_SetField(jdouble, Double, T_DOUBLE)
1243
1244
1245
JNI_ENTRY_CHECKED(jmethodID,
1246
checked_jni_GetStaticMethodID(JNIEnv *env,
1247
jclass clazz,
1248
const char *name,
1249
const char *sig))
1250
functionEnter(thr);
1251
IN_VM(
1252
jniCheck::validate_class(thr, clazz, false);
1253
)
1254
jmethodID result = UNCHECKED()->GetStaticMethodID(env,clazz,name,sig);
1255
functionExit(thr);
1256
return result;
1257
JNI_END
1258
1259
#define WRAPPER_CallStaticMethod(ReturnType,Result) \
1260
JNI_ENTRY_CHECKED(ReturnType, \
1261
checked_jni_CallStatic##Result##Method(JNIEnv *env, \
1262
jclass clazz, \
1263
jmethodID methodID, \
1264
...)) \
1265
functionEnter(thr); \
1266
va_list args; \
1267
IN_VM( \
1268
jniCheck::validate_jmethod_id(thr, methodID); \
1269
jniCheck::validate_class(thr, clazz, false); \
1270
) \
1271
va_start(args,methodID); \
1272
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
1273
clazz, \
1274
methodID, \
1275
args); \
1276
va_end(args); \
1277
thr->set_pending_jni_exception_check("CallStatic"#Result"Method"); \
1278
functionExit(thr); \
1279
return result; \
1280
JNI_END \
1281
\
1282
JNI_ENTRY_CHECKED(ReturnType, \
1283
checked_jni_CallStatic##Result##MethodV(JNIEnv *env, \
1284
jclass clazz, \
1285
jmethodID methodID,\
1286
va_list args)) \
1287
functionEnter(thr); \
1288
IN_VM( \
1289
jniCheck::validate_jmethod_id(thr, methodID); \
1290
jniCheck::validate_class(thr, clazz, false); \
1291
) \
1292
ReturnType result = UNCHECKED()->CallStatic##Result##MethodV(env, \
1293
clazz, \
1294
methodID, \
1295
args); \
1296
thr->set_pending_jni_exception_check("CallStatic"#Result"MethodV"); \
1297
functionExit(thr); \
1298
return result; \
1299
JNI_END \
1300
\
1301
JNI_ENTRY_CHECKED(ReturnType, \
1302
checked_jni_CallStatic##Result##MethodA(JNIEnv *env, \
1303
jclass clazz, \
1304
jmethodID methodID, \
1305
const jvalue *args)) \
1306
functionEnter(thr); \
1307
IN_VM( \
1308
jniCheck::validate_jmethod_id(thr, methodID); \
1309
jniCheck::validate_class(thr, clazz, false); \
1310
) \
1311
ReturnType result = UNCHECKED()->CallStatic##Result##MethodA(env, \
1312
clazz, \
1313
methodID, \
1314
args); \
1315
thr->set_pending_jni_exception_check("CallStatic"#Result"MethodA"); \
1316
functionExit(thr); \
1317
return result; \
1318
JNI_END
1319
1320
WRAPPER_CallStaticMethod(jobject,Object)
1321
WRAPPER_CallStaticMethod(jboolean,Boolean)
1322
WRAPPER_CallStaticMethod(jbyte,Byte)
1323
WRAPPER_CallStaticMethod(jshort,Short)
1324
WRAPPER_CallStaticMethod(jchar,Char)
1325
WRAPPER_CallStaticMethod(jint,Int)
1326
WRAPPER_CallStaticMethod(jlong,Long)
1327
WRAPPER_CallStaticMethod(jfloat,Float)
1328
WRAPPER_CallStaticMethod(jdouble,Double)
1329
1330
JNI_ENTRY_CHECKED(void,
1331
checked_jni_CallStaticVoidMethod(JNIEnv *env,
1332
jclass cls,
1333
jmethodID methodID,
1334
...))
1335
functionEnter(thr);
1336
va_list args;
1337
IN_VM(
1338
jniCheck::validate_jmethod_id(thr, methodID);
1339
jniCheck::validate_class(thr, cls, false);
1340
)
1341
va_start(args,methodID);
1342
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
1343
va_end(args);
1344
thr->set_pending_jni_exception_check("CallStaticVoidMethod");
1345
functionExit(thr);
1346
JNI_END
1347
1348
JNI_ENTRY_CHECKED(void,
1349
checked_jni_CallStaticVoidMethodV(JNIEnv *env,
1350
jclass cls,
1351
jmethodID methodID,
1352
va_list args))
1353
functionEnter(thr);
1354
IN_VM(
1355
jniCheck::validate_jmethod_id(thr, methodID);
1356
jniCheck::validate_class(thr, cls, false);
1357
)
1358
UNCHECKED()->CallStaticVoidMethodV(env,cls,methodID,args);
1359
thr->set_pending_jni_exception_check("CallStaticVoidMethodV");
1360
functionExit(thr);
1361
JNI_END
1362
1363
JNI_ENTRY_CHECKED(void,
1364
checked_jni_CallStaticVoidMethodA(JNIEnv *env,
1365
jclass cls,
1366
jmethodID methodID,
1367
const jvalue * args))
1368
functionEnter(thr);
1369
IN_VM(
1370
jniCheck::validate_jmethod_id(thr, methodID);
1371
jniCheck::validate_class(thr, cls, false);
1372
)
1373
UNCHECKED()->CallStaticVoidMethodA(env,cls,methodID,args);
1374
thr->set_pending_jni_exception_check("CallStaticVoidMethodA");
1375
functionExit(thr);
1376
JNI_END
1377
1378
JNI_ENTRY_CHECKED(jfieldID,
1379
checked_jni_GetStaticFieldID(JNIEnv *env,
1380
jclass clazz,
1381
const char *name,
1382
const char *sig))
1383
functionEnter(thr);
1384
IN_VM(
1385
jniCheck::validate_class(thr, clazz, false);
1386
)
1387
jfieldID result = UNCHECKED()->GetStaticFieldID(env,clazz,name,sig);
1388
functionExit(thr);
1389
return result;
1390
JNI_END
1391
1392
#define WRAPPER_GetStaticField(ReturnType,Result,FieldType) \
1393
JNI_ENTRY_CHECKED(ReturnType, \
1394
checked_jni_GetStatic##Result##Field(JNIEnv *env, \
1395
jclass clazz, \
1396
jfieldID fieldID)) \
1397
functionEnter(thr); \
1398
IN_VM( \
1399
jniCheck::validate_class(thr, clazz, false); \
1400
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
1401
) \
1402
ReturnType result = UNCHECKED()->GetStatic##Result##Field(env, \
1403
clazz, \
1404
fieldID); \
1405
functionExit(thr); \
1406
return result; \
1407
JNI_END
1408
1409
WRAPPER_GetStaticField(jobject, Object, T_OBJECT)
1410
WRAPPER_GetStaticField(jboolean, Boolean, T_BOOLEAN)
1411
WRAPPER_GetStaticField(jbyte, Byte, T_BYTE)
1412
WRAPPER_GetStaticField(jshort, Short, T_SHORT)
1413
WRAPPER_GetStaticField(jchar, Char, T_CHAR)
1414
WRAPPER_GetStaticField(jint, Int, T_INT)
1415
WRAPPER_GetStaticField(jlong, Long, T_LONG)
1416
WRAPPER_GetStaticField(jfloat, Float, T_FLOAT)
1417
WRAPPER_GetStaticField(jdouble, Double, T_DOUBLE)
1418
1419
#define WRAPPER_SetStaticField(ValueType,Result,FieldType) \
1420
JNI_ENTRY_CHECKED(void, \
1421
checked_jni_SetStatic##Result##Field(JNIEnv *env, \
1422
jclass clazz, \
1423
jfieldID fieldID, \
1424
ValueType value)) \
1425
functionEnter(thr); \
1426
IN_VM( \
1427
jniCheck::validate_class(thr, clazz, false); \
1428
checkStaticFieldID(thr, fieldID, clazz, FieldType); \
1429
) \
1430
UNCHECKED()->SetStatic##Result##Field(env,clazz,fieldID,value); \
1431
functionExit(thr); \
1432
JNI_END
1433
1434
WRAPPER_SetStaticField(jobject, Object, T_OBJECT)
1435
WRAPPER_SetStaticField(jboolean, Boolean, T_BOOLEAN)
1436
WRAPPER_SetStaticField(jbyte, Byte, T_BYTE)
1437
WRAPPER_SetStaticField(jshort, Short, T_SHORT)
1438
WRAPPER_SetStaticField(jchar, Char, T_CHAR)
1439
WRAPPER_SetStaticField(jint, Int, T_INT)
1440
WRAPPER_SetStaticField(jlong, Long, T_LONG)
1441
WRAPPER_SetStaticField(jfloat, Float, T_FLOAT)
1442
WRAPPER_SetStaticField(jdouble, Double, T_DOUBLE)
1443
1444
1445
JNI_ENTRY_CHECKED(jstring,
1446
checked_jni_NewString(JNIEnv *env,
1447
const jchar *unicode,
1448
jsize len))
1449
functionEnter(thr);
1450
jstring result = UNCHECKED()->NewString(env,unicode,len);
1451
functionExit(thr);
1452
return result;
1453
JNI_END
1454
1455
JNI_ENTRY_CHECKED(jsize,
1456
checked_jni_GetStringLength(JNIEnv *env,
1457
jstring str))
1458
functionEnter(thr);
1459
IN_VM(
1460
checkString(thr, str);
1461
)
1462
jsize result = UNCHECKED()->GetStringLength(env,str);
1463
functionExit(thr);
1464
return result;
1465
JNI_END
1466
1467
// Arbitrary (but well-known) tag
1468
const void* STRING_TAG = (void*)0x47114711;
1469
1470
JNI_ENTRY_CHECKED(const jchar *,
1471
checked_jni_GetStringChars(JNIEnv *env,
1472
jstring str,
1473
jboolean *isCopy))
1474
functionEnter(thr);
1475
IN_VM(
1476
checkString(thr, str);
1477
)
1478
jchar* new_result = NULL;
1479
const jchar *result = UNCHECKED()->GetStringChars(env,str,isCopy);
1480
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringChars didn't return a copy as expected");
1481
if (result != NULL) {
1482
size_t len = UNCHECKED()->GetStringLength(env,str) + 1; // + 1 for NULL termination
1483
len *= sizeof(jchar);
1484
new_result = (jchar*) GuardedMemory::wrap_copy(result, len, STRING_TAG);
1485
if (new_result == NULL) {
1486
vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringChars");
1487
}
1488
// Avoiding call to UNCHECKED()->ReleaseStringChars() since that will fire unexpected dtrace probes
1489
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
1490
FreeHeap((char*)result);
1491
}
1492
functionExit(thr);
1493
return new_result;
1494
JNI_END
1495
1496
JNI_ENTRY_CHECKED(void,
1497
checked_jni_ReleaseStringChars(JNIEnv *env,
1498
jstring str,
1499
const jchar *chars))
1500
functionEnterExceptionAllowed(thr);
1501
IN_VM(
1502
checkString(thr, str);
1503
)
1504
if (chars == NULL) {
1505
// still do the unchecked call to allow dtrace probes
1506
UNCHECKED()->ReleaseStringChars(env,str,chars);
1507
}
1508
else {
1509
GuardedMemory guarded((void*)chars);
1510
if (!guarded.verify_guards()) {
1511
tty->print_cr("ReleaseStringChars: release chars failed bounds check. "
1512
"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));
1513
guarded.print_on(tty);
1514
NativeReportJNIFatalError(thr, "ReleaseStringChars: "
1515
"release chars failed bounds check.");
1516
}
1517
if (guarded.get_tag() != STRING_TAG) {
1518
tty->print_cr("ReleaseStringChars: called on something not allocated "
1519
"by GetStringChars. string: " PTR_FORMAT " chars: " PTR_FORMAT,
1520
p2i(str), p2i(chars));
1521
NativeReportJNIFatalError(thr, "ReleaseStringChars called on something "
1522
"not allocated by GetStringChars");
1523
}
1524
UNCHECKED()->ReleaseStringChars(env, str,
1525
(const jchar*) guarded.release_for_freeing());
1526
}
1527
functionExit(thr);
1528
JNI_END
1529
1530
JNI_ENTRY_CHECKED(jstring,
1531
checked_jni_NewStringUTF(JNIEnv *env,
1532
const char *utf))
1533
functionEnter(thr);
1534
jstring result = UNCHECKED()->NewStringUTF(env,utf);
1535
functionExit(thr);
1536
return result;
1537
JNI_END
1538
1539
JNI_ENTRY_CHECKED(jsize,
1540
checked_jni_GetStringUTFLength(JNIEnv *env,
1541
jstring str))
1542
functionEnter(thr);
1543
IN_VM(
1544
checkString(thr, str);
1545
)
1546
jsize result = UNCHECKED()->GetStringUTFLength(env,str);
1547
functionExit(thr);
1548
return result;
1549
JNI_END
1550
1551
// Arbitrary (but well-known) tag - different than GetStringChars
1552
const void* STRING_UTF_TAG = (void*) 0x48124812;
1553
1554
JNI_ENTRY_CHECKED(const char *,
1555
checked_jni_GetStringUTFChars(JNIEnv *env,
1556
jstring str,
1557
jboolean *isCopy))
1558
functionEnter(thr);
1559
IN_VM(
1560
checkString(thr, str);
1561
)
1562
char* new_result = NULL;
1563
const char *result = UNCHECKED()->GetStringUTFChars(env,str,isCopy);
1564
assert (isCopy == NULL || *isCopy == JNI_TRUE, "GetStringUTFChars didn't return a copy as expected");
1565
if (result != NULL) {
1566
size_t len = strlen(result) + 1; // + 1 for NULL termination
1567
new_result = (char*) GuardedMemory::wrap_copy(result, len, STRING_UTF_TAG);
1568
if (new_result == NULL) {
1569
vm_exit_out_of_memory(len, OOM_MALLOC_ERROR, "checked_jni_GetStringUTFChars");
1570
}
1571
// Avoiding call to UNCHECKED()->ReleaseStringUTFChars() since that will fire unexpected dtrace probes
1572
// Note that the dtrace arguments for the allocated memory will not match up with this solution.
1573
FreeHeap((char*)result, mtInternal);
1574
}
1575
functionExit(thr);
1576
return new_result;
1577
JNI_END
1578
1579
JNI_ENTRY_CHECKED(void,
1580
checked_jni_ReleaseStringUTFChars(JNIEnv *env,
1581
jstring str,
1582
const char* chars))
1583
functionEnterExceptionAllowed(thr);
1584
IN_VM(
1585
checkString(thr, str);
1586
)
1587
if (chars == NULL) {
1588
// still do the unchecked call to allow dtrace probes
1589
UNCHECKED()->ReleaseStringUTFChars(env,str,chars);
1590
}
1591
else {
1592
GuardedMemory guarded((void*)chars);
1593
if (!guarded.verify_guards()) {
1594
tty->print_cr("ReleaseStringUTFChars: release chars failed bounds check. "
1595
"string: " PTR_FORMAT " chars: " PTR_FORMAT, p2i(str), p2i(chars));
1596
guarded.print_on(tty);
1597
NativeReportJNIFatalError(thr, "ReleaseStringUTFChars: "
1598
"release chars failed bounds check.");
1599
}
1600
if (guarded.get_tag() != STRING_UTF_TAG) {
1601
tty->print_cr("ReleaseStringUTFChars: called on something not "
1602
"allocated by GetStringUTFChars. string: " PTR_FORMAT " chars: "
1603
PTR_FORMAT, p2i(str), p2i(chars));
1604
NativeReportJNIFatalError(thr, "ReleaseStringUTFChars "
1605
"called on something not allocated by GetStringUTFChars");
1606
}
1607
UNCHECKED()->ReleaseStringUTFChars(env, str,
1608
(const char*) guarded.release_for_freeing());
1609
}
1610
functionExit(thr);
1611
JNI_END
1612
1613
JNI_ENTRY_CHECKED(jsize,
1614
checked_jni_GetArrayLength(JNIEnv *env,
1615
jarray array))
1616
functionEnter(thr);
1617
IN_VM(
1618
check_is_array(thr, array);
1619
)
1620
jsize result = UNCHECKED()->GetArrayLength(env,array);
1621
functionExit(thr);
1622
return result;
1623
JNI_END
1624
1625
JNI_ENTRY_CHECKED(jobjectArray,
1626
checked_jni_NewObjectArray(JNIEnv *env,
1627
jsize len,
1628
jclass clazz,
1629
jobject init))
1630
functionEnter(thr);
1631
jobjectArray result = UNCHECKED()->NewObjectArray(env,len,clazz,init);
1632
functionExit(thr);
1633
return result;
1634
JNI_END
1635
1636
JNI_ENTRY_CHECKED(jobject,
1637
checked_jni_GetObjectArrayElement(JNIEnv *env,
1638
jobjectArray array,
1639
jsize index))
1640
functionEnter(thr);
1641
IN_VM(
1642
check_is_obj_array(thr, array);
1643
)
1644
jobject result = UNCHECKED()->GetObjectArrayElement(env,array,index);
1645
functionExit(thr);
1646
return result;
1647
JNI_END
1648
1649
JNI_ENTRY_CHECKED(void,
1650
checked_jni_SetObjectArrayElement(JNIEnv *env,
1651
jobjectArray array,
1652
jsize index,
1653
jobject val))
1654
functionEnter(thr);
1655
IN_VM(
1656
check_is_obj_array(thr, array);
1657
)
1658
UNCHECKED()->SetObjectArrayElement(env,array,index,val);
1659
functionExit(thr);
1660
JNI_END
1661
1662
#define WRAPPER_NewScalarArray(Return, Result) \
1663
JNI_ENTRY_CHECKED(Return, \
1664
checked_jni_New##Result##Array(JNIEnv *env, \
1665
jsize len)) \
1666
functionEnter(thr); \
1667
Return result = UNCHECKED()->New##Result##Array(env,len); \
1668
functionExit(thr); \
1669
return (Return) result; \
1670
JNI_END
1671
1672
WRAPPER_NewScalarArray(jbooleanArray, Boolean)
1673
WRAPPER_NewScalarArray(jbyteArray, Byte)
1674
WRAPPER_NewScalarArray(jshortArray, Short)
1675
WRAPPER_NewScalarArray(jcharArray, Char)
1676
WRAPPER_NewScalarArray(jintArray, Int)
1677
WRAPPER_NewScalarArray(jlongArray, Long)
1678
WRAPPER_NewScalarArray(jfloatArray, Float)
1679
WRAPPER_NewScalarArray(jdoubleArray, Double)
1680
1681
#define WRAPPER_GetScalarArrayElements(ElementTag,ElementType,Result) \
1682
JNI_ENTRY_CHECKED(ElementType *, \
1683
checked_jni_Get##Result##ArrayElements(JNIEnv *env, \
1684
ElementType##Array array, \
1685
jboolean *isCopy)) \
1686
functionEnter(thr); \
1687
IN_VM( \
1688
check_primitive_array_type(thr, array, ElementTag); \
1689
) \
1690
ElementType *result = UNCHECKED()->Get##Result##ArrayElements(env, \
1691
array, \
1692
isCopy); \
1693
if (result != NULL) { \
1694
result = (ElementType *) check_jni_wrap_copy_array(thr, array, result); \
1695
} \
1696
functionExit(thr); \
1697
return result; \
1698
JNI_END
1699
1700
WRAPPER_GetScalarArrayElements(T_BOOLEAN, jboolean, Boolean)
1701
WRAPPER_GetScalarArrayElements(T_BYTE, jbyte, Byte)
1702
WRAPPER_GetScalarArrayElements(T_SHORT, jshort, Short)
1703
WRAPPER_GetScalarArrayElements(T_CHAR, jchar, Char)
1704
WRAPPER_GetScalarArrayElements(T_INT, jint, Int)
1705
WRAPPER_GetScalarArrayElements(T_LONG, jlong, Long)
1706
WRAPPER_GetScalarArrayElements(T_FLOAT, jfloat, Float)
1707
WRAPPER_GetScalarArrayElements(T_DOUBLE, jdouble, Double)
1708
1709
#define WRAPPER_ReleaseScalarArrayElements(ElementTag,ElementType,Result,Tag) \
1710
JNI_ENTRY_CHECKED(void, \
1711
checked_jni_Release##Result##ArrayElements(JNIEnv *env, \
1712
ElementType##Array array, \
1713
ElementType *elems, \
1714
jint mode)) \
1715
functionEnterExceptionAllowed(thr); \
1716
IN_VM( \
1717
check_primitive_array_type(thr, array, ElementTag); \
1718
ASSERT_OOPS_ALLOWED; \
1719
typeArrayOop a = typeArrayOop(JNIHandles::resolve_non_null(array)); \
1720
) \
1721
ElementType* orig_result = (ElementType *) check_wrapped_array_release( \
1722
thr, "checked_jni_Release"#Result"ArrayElements", array, elems, mode); \
1723
UNCHECKED()->Release##Result##ArrayElements(env, array, orig_result, mode); \
1724
functionExit(thr); \
1725
JNI_END
1726
1727
WRAPPER_ReleaseScalarArrayElements(T_BOOLEAN,jboolean, Boolean, bool)
1728
WRAPPER_ReleaseScalarArrayElements(T_BYTE, jbyte, Byte, byte)
1729
WRAPPER_ReleaseScalarArrayElements(T_SHORT, jshort, Short, short)
1730
WRAPPER_ReleaseScalarArrayElements(T_CHAR, jchar, Char, char)
1731
WRAPPER_ReleaseScalarArrayElements(T_INT, jint, Int, int)
1732
WRAPPER_ReleaseScalarArrayElements(T_LONG, jlong, Long, long)
1733
WRAPPER_ReleaseScalarArrayElements(T_FLOAT, jfloat, Float, float)
1734
WRAPPER_ReleaseScalarArrayElements(T_DOUBLE, jdouble, Double, double)
1735
1736
#define WRAPPER_GetScalarArrayRegion(ElementTag,ElementType,Result) \
1737
JNI_ENTRY_CHECKED(void, \
1738
checked_jni_Get##Result##ArrayRegion(JNIEnv *env, \
1739
ElementType##Array array, \
1740
jsize start, \
1741
jsize len, \
1742
ElementType *buf)) \
1743
functionEnter(thr); \
1744
IN_VM( \
1745
check_primitive_array_type(thr, array, ElementTag); \
1746
) \
1747
UNCHECKED()->Get##Result##ArrayRegion(env,array,start,len,buf); \
1748
functionExit(thr); \
1749
JNI_END
1750
1751
WRAPPER_GetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
1752
WRAPPER_GetScalarArrayRegion(T_BYTE, jbyte, Byte)
1753
WRAPPER_GetScalarArrayRegion(T_SHORT, jshort, Short)
1754
WRAPPER_GetScalarArrayRegion(T_CHAR, jchar, Char)
1755
WRAPPER_GetScalarArrayRegion(T_INT, jint, Int)
1756
WRAPPER_GetScalarArrayRegion(T_LONG, jlong, Long)
1757
WRAPPER_GetScalarArrayRegion(T_FLOAT, jfloat, Float)
1758
WRAPPER_GetScalarArrayRegion(T_DOUBLE, jdouble, Double)
1759
1760
#define WRAPPER_SetScalarArrayRegion(ElementTag,ElementType,Result) \
1761
JNI_ENTRY_CHECKED(void, \
1762
checked_jni_Set##Result##ArrayRegion(JNIEnv *env, \
1763
ElementType##Array array, \
1764
jsize start, \
1765
jsize len, \
1766
const ElementType *buf)) \
1767
functionEnter(thr); \
1768
IN_VM( \
1769
check_primitive_array_type(thr, array, ElementTag); \
1770
) \
1771
UNCHECKED()->Set##Result##ArrayRegion(env,array,start,len,buf); \
1772
functionExit(thr); \
1773
JNI_END
1774
1775
WRAPPER_SetScalarArrayRegion(T_BOOLEAN, jboolean, Boolean)
1776
WRAPPER_SetScalarArrayRegion(T_BYTE, jbyte, Byte)
1777
WRAPPER_SetScalarArrayRegion(T_SHORT, jshort, Short)
1778
WRAPPER_SetScalarArrayRegion(T_CHAR, jchar, Char)
1779
WRAPPER_SetScalarArrayRegion(T_INT, jint, Int)
1780
WRAPPER_SetScalarArrayRegion(T_LONG, jlong, Long)
1781
WRAPPER_SetScalarArrayRegion(T_FLOAT, jfloat, Float)
1782
WRAPPER_SetScalarArrayRegion(T_DOUBLE, jdouble, Double)
1783
1784
JNI_ENTRY_CHECKED(jint,
1785
checked_jni_RegisterNatives(JNIEnv *env,
1786
jclass clazz,
1787
const JNINativeMethod *methods,
1788
jint nMethods))
1789
functionEnter(thr);
1790
jint result = UNCHECKED()->RegisterNatives(env,clazz,methods,nMethods);
1791
functionExit(thr);
1792
return result;
1793
JNI_END
1794
1795
JNI_ENTRY_CHECKED(jint,
1796
checked_jni_UnregisterNatives(JNIEnv *env,
1797
jclass clazz))
1798
functionEnter(thr);
1799
jint result = UNCHECKED()->UnregisterNatives(env,clazz);
1800
functionExit(thr);
1801
return result;
1802
JNI_END
1803
1804
JNI_ENTRY_CHECKED(jint,
1805
checked_jni_MonitorEnter(JNIEnv *env,
1806
jobject obj))
1807
functionEnter(thr);
1808
IN_VM(
1809
jniCheck::validate_object(thr, obj);
1810
)
1811
jint result = UNCHECKED()->MonitorEnter(env,obj);
1812
functionExit(thr);
1813
return result;
1814
JNI_END
1815
1816
JNI_ENTRY_CHECKED(jint,
1817
checked_jni_MonitorExit(JNIEnv *env,
1818
jobject obj))
1819
functionEnterExceptionAllowed(thr);
1820
IN_VM(
1821
jniCheck::validate_object(thr, obj);
1822
)
1823
jint result = UNCHECKED()->MonitorExit(env,obj);
1824
functionExit(thr);
1825
return result;
1826
JNI_END
1827
1828
JNI_ENTRY_CHECKED(jint,
1829
checked_jni_GetJavaVM(JNIEnv *env,
1830
JavaVM **vm))
1831
functionEnter(thr);
1832
jint result = UNCHECKED()->GetJavaVM(env,vm);
1833
functionExit(thr);
1834
return result;
1835
JNI_END
1836
1837
JNI_ENTRY_CHECKED(void,
1838
checked_jni_GetStringRegion(JNIEnv *env,
1839
jstring str,
1840
jsize start,
1841
jsize len,
1842
jchar *buf))
1843
functionEnter(thr);
1844
IN_VM(
1845
checkString(thr, str);
1846
)
1847
UNCHECKED()->GetStringRegion(env, str, start, len, buf);
1848
functionExit(thr);
1849
JNI_END
1850
1851
JNI_ENTRY_CHECKED(void,
1852
checked_jni_GetStringUTFRegion(JNIEnv *env,
1853
jstring str,
1854
jsize start,
1855
jsize len,
1856
char *buf))
1857
functionEnter(thr);
1858
IN_VM(
1859
checkString(thr, str);
1860
)
1861
UNCHECKED()->GetStringUTFRegion(env, str, start, len, buf);
1862
functionExit(thr);
1863
JNI_END
1864
1865
JNI_ENTRY_CHECKED(void *,
1866
checked_jni_GetPrimitiveArrayCritical(JNIEnv *env,
1867
jarray array,
1868
jboolean *isCopy))
1869
functionEnterCritical(thr);
1870
IN_VM(
1871
check_is_primitive_array(thr, array);
1872
)
1873
void *result = UNCHECKED()->GetPrimitiveArrayCritical(env, array, isCopy);
1874
if (result != NULL) {
1875
result = check_jni_wrap_copy_array(thr, array, result);
1876
}
1877
functionExit(thr);
1878
return result;
1879
JNI_END
1880
1881
JNI_ENTRY_CHECKED(void,
1882
checked_jni_ReleasePrimitiveArrayCritical(JNIEnv *env,
1883
jarray array,
1884
void *carray,
1885
jint mode))
1886
functionEnterCriticalExceptionAllowed(thr);
1887
IN_VM(
1888
check_is_primitive_array(thr, array);
1889
)
1890
// Check the element array...
1891
void* orig_result = check_wrapped_array_release(thr, "ReleasePrimitiveArrayCritical", array, carray, mode);
1892
UNCHECKED()->ReleasePrimitiveArrayCritical(env, array, orig_result, mode);
1893
functionExit(thr);
1894
JNI_END
1895
1896
JNI_ENTRY_CHECKED(const jchar*,
1897
checked_jni_GetStringCritical(JNIEnv *env,
1898
jstring string,
1899
jboolean *isCopy))
1900
functionEnterCritical(thr);
1901
IN_VM(
1902
checkString(thr, string);
1903
)
1904
const jchar *result = UNCHECKED()->GetStringCritical(env, string, isCopy);
1905
functionExit(thr);
1906
return result;
1907
JNI_END
1908
1909
JNI_ENTRY_CHECKED(void,
1910
checked_jni_ReleaseStringCritical(JNIEnv *env,
1911
jstring str,
1912
const jchar *chars))
1913
functionEnterCriticalExceptionAllowed(thr);
1914
IN_VM(
1915
checkString(thr, str);
1916
)
1917
/* The Hotspot JNI code does not use the parameters, so just check the
1918
* string parameter as a minor sanity check
1919
*/
1920
UNCHECKED()->ReleaseStringCritical(env, str, chars);
1921
functionExit(thr);
1922
JNI_END
1923
1924
JNI_ENTRY_CHECKED(jweak,
1925
checked_jni_NewWeakGlobalRef(JNIEnv *env,
1926
jobject obj))
1927
functionEnter(thr);
1928
IN_VM(
1929
if (obj != NULL) {
1930
jniCheck::validate_handle(thr, obj);
1931
}
1932
)
1933
jweak result = UNCHECKED()->NewWeakGlobalRef(env, obj);
1934
functionExit(thr);
1935
return result;
1936
JNI_END
1937
1938
JNI_ENTRY_CHECKED(void,
1939
checked_jni_DeleteWeakGlobalRef(JNIEnv *env,
1940
jweak ref))
1941
functionEnterExceptionAllowed(thr);
1942
UNCHECKED()->DeleteWeakGlobalRef(env, ref);
1943
functionExit(thr);
1944
JNI_END
1945
1946
JNI_ENTRY_CHECKED(jboolean,
1947
checked_jni_ExceptionCheck(JNIEnv *env))
1948
thr->clear_pending_jni_exception_check();
1949
functionEnterExceptionAllowed(thr);
1950
jboolean result = UNCHECKED()->ExceptionCheck(env);
1951
functionExit(thr);
1952
return result;
1953
JNI_END
1954
1955
JNI_ENTRY_CHECKED(jobject,
1956
checked_jni_NewDirectByteBuffer(JNIEnv *env,
1957
void *address,
1958
jlong capacity))
1959
functionEnter(thr);
1960
jobject result = UNCHECKED()->NewDirectByteBuffer(env, address, capacity);
1961
functionExit(thr);
1962
return result;
1963
JNI_END
1964
1965
JNI_ENTRY_CHECKED(void *,
1966
checked_jni_GetDirectBufferAddress(JNIEnv *env,
1967
jobject buf))
1968
functionEnter(thr);
1969
void* result = UNCHECKED()->GetDirectBufferAddress(env, buf);
1970
functionExit(thr);
1971
return result;
1972
JNI_END
1973
1974
JNI_ENTRY_CHECKED(jlong,
1975
checked_jni_GetDirectBufferCapacity(JNIEnv *env,
1976
jobject buf))
1977
functionEnter(thr);
1978
jlong result = UNCHECKED()->GetDirectBufferCapacity(env, buf);
1979
functionExit(thr);
1980
return result;
1981
JNI_END
1982
1983
JNI_ENTRY_CHECKED(jobjectRefType,
1984
checked_jni_GetObjectRefType(JNIEnv *env,
1985
jobject obj))
1986
functionEnter(thr);
1987
/* validate the object being passed */
1988
IN_VM(
1989
jniCheck::validate_object(thr, obj);
1990
)
1991
jobjectRefType result = UNCHECKED()->GetObjectRefType(env, obj);
1992
functionExit(thr);
1993
return result;
1994
JNI_END
1995
1996
1997
JNI_ENTRY_CHECKED(jint,
1998
checked_jni_GetVersion(JNIEnv *env))
1999
functionEnter(thr);
2000
jint result = UNCHECKED()->GetVersion(env);
2001
functionExit(thr);
2002
return result;
2003
JNI_END
2004
2005
2006
2007
/*
2008
* Structure containing all checked jni functions
2009
*/
2010
struct JNINativeInterface_ checked_jni_NativeInterface = {
2011
NULL,
2012
NULL,
2013
NULL,
2014
2015
NULL,
2016
2017
checked_jni_GetVersion,
2018
2019
checked_jni_DefineClass,
2020
checked_jni_FindClass,
2021
2022
checked_jni_FromReflectedMethod,
2023
checked_jni_FromReflectedField,
2024
2025
checked_jni_ToReflectedMethod,
2026
2027
checked_jni_GetSuperclass,
2028
checked_jni_IsAssignableFrom,
2029
2030
checked_jni_ToReflectedField,
2031
2032
checked_jni_Throw,
2033
checked_jni_ThrowNew,
2034
checked_jni_ExceptionOccurred,
2035
checked_jni_ExceptionDescribe,
2036
checked_jni_ExceptionClear,
2037
checked_jni_FatalError,
2038
2039
checked_jni_PushLocalFrame,
2040
checked_jni_PopLocalFrame,
2041
2042
checked_jni_NewGlobalRef,
2043
checked_jni_DeleteGlobalRef,
2044
checked_jni_DeleteLocalRef,
2045
checked_jni_IsSameObject,
2046
2047
checked_jni_NewLocalRef,
2048
checked_jni_EnsureLocalCapacity,
2049
2050
checked_jni_AllocObject,
2051
checked_jni_NewObject,
2052
checked_jni_NewObjectV,
2053
checked_jni_NewObjectA,
2054
2055
checked_jni_GetObjectClass,
2056
checked_jni_IsInstanceOf,
2057
2058
checked_jni_GetMethodID,
2059
2060
checked_jni_CallObjectMethod,
2061
checked_jni_CallObjectMethodV,
2062
checked_jni_CallObjectMethodA,
2063
checked_jni_CallBooleanMethod,
2064
checked_jni_CallBooleanMethodV,
2065
checked_jni_CallBooleanMethodA,
2066
checked_jni_CallByteMethod,
2067
checked_jni_CallByteMethodV,
2068
checked_jni_CallByteMethodA,
2069
checked_jni_CallCharMethod,
2070
checked_jni_CallCharMethodV,
2071
checked_jni_CallCharMethodA,
2072
checked_jni_CallShortMethod,
2073
checked_jni_CallShortMethodV,
2074
checked_jni_CallShortMethodA,
2075
checked_jni_CallIntMethod,
2076
checked_jni_CallIntMethodV,
2077
checked_jni_CallIntMethodA,
2078
checked_jni_CallLongMethod,
2079
checked_jni_CallLongMethodV,
2080
checked_jni_CallLongMethodA,
2081
checked_jni_CallFloatMethod,
2082
checked_jni_CallFloatMethodV,
2083
checked_jni_CallFloatMethodA,
2084
checked_jni_CallDoubleMethod,
2085
checked_jni_CallDoubleMethodV,
2086
checked_jni_CallDoubleMethodA,
2087
checked_jni_CallVoidMethod,
2088
checked_jni_CallVoidMethodV,
2089
checked_jni_CallVoidMethodA,
2090
2091
checked_jni_CallNonvirtualObjectMethod,
2092
checked_jni_CallNonvirtualObjectMethodV,
2093
checked_jni_CallNonvirtualObjectMethodA,
2094
checked_jni_CallNonvirtualBooleanMethod,
2095
checked_jni_CallNonvirtualBooleanMethodV,
2096
checked_jni_CallNonvirtualBooleanMethodA,
2097
checked_jni_CallNonvirtualByteMethod,
2098
checked_jni_CallNonvirtualByteMethodV,
2099
checked_jni_CallNonvirtualByteMethodA,
2100
checked_jni_CallNonvirtualCharMethod,
2101
checked_jni_CallNonvirtualCharMethodV,
2102
checked_jni_CallNonvirtualCharMethodA,
2103
checked_jni_CallNonvirtualShortMethod,
2104
checked_jni_CallNonvirtualShortMethodV,
2105
checked_jni_CallNonvirtualShortMethodA,
2106
checked_jni_CallNonvirtualIntMethod,
2107
checked_jni_CallNonvirtualIntMethodV,
2108
checked_jni_CallNonvirtualIntMethodA,
2109
checked_jni_CallNonvirtualLongMethod,
2110
checked_jni_CallNonvirtualLongMethodV,
2111
checked_jni_CallNonvirtualLongMethodA,
2112
checked_jni_CallNonvirtualFloatMethod,
2113
checked_jni_CallNonvirtualFloatMethodV,
2114
checked_jni_CallNonvirtualFloatMethodA,
2115
checked_jni_CallNonvirtualDoubleMethod,
2116
checked_jni_CallNonvirtualDoubleMethodV,
2117
checked_jni_CallNonvirtualDoubleMethodA,
2118
checked_jni_CallNonvirtualVoidMethod,
2119
checked_jni_CallNonvirtualVoidMethodV,
2120
checked_jni_CallNonvirtualVoidMethodA,
2121
2122
checked_jni_GetFieldID,
2123
2124
checked_jni_GetObjectField,
2125
checked_jni_GetBooleanField,
2126
checked_jni_GetByteField,
2127
checked_jni_GetCharField,
2128
checked_jni_GetShortField,
2129
checked_jni_GetIntField,
2130
checked_jni_GetLongField,
2131
checked_jni_GetFloatField,
2132
checked_jni_GetDoubleField,
2133
2134
checked_jni_SetObjectField,
2135
checked_jni_SetBooleanField,
2136
checked_jni_SetByteField,
2137
checked_jni_SetCharField,
2138
checked_jni_SetShortField,
2139
checked_jni_SetIntField,
2140
checked_jni_SetLongField,
2141
checked_jni_SetFloatField,
2142
checked_jni_SetDoubleField,
2143
2144
checked_jni_GetStaticMethodID,
2145
2146
checked_jni_CallStaticObjectMethod,
2147
checked_jni_CallStaticObjectMethodV,
2148
checked_jni_CallStaticObjectMethodA,
2149
checked_jni_CallStaticBooleanMethod,
2150
checked_jni_CallStaticBooleanMethodV,
2151
checked_jni_CallStaticBooleanMethodA,
2152
checked_jni_CallStaticByteMethod,
2153
checked_jni_CallStaticByteMethodV,
2154
checked_jni_CallStaticByteMethodA,
2155
checked_jni_CallStaticCharMethod,
2156
checked_jni_CallStaticCharMethodV,
2157
checked_jni_CallStaticCharMethodA,
2158
checked_jni_CallStaticShortMethod,
2159
checked_jni_CallStaticShortMethodV,
2160
checked_jni_CallStaticShortMethodA,
2161
checked_jni_CallStaticIntMethod,
2162
checked_jni_CallStaticIntMethodV,
2163
checked_jni_CallStaticIntMethodA,
2164
checked_jni_CallStaticLongMethod,
2165
checked_jni_CallStaticLongMethodV,
2166
checked_jni_CallStaticLongMethodA,
2167
checked_jni_CallStaticFloatMethod,
2168
checked_jni_CallStaticFloatMethodV,
2169
checked_jni_CallStaticFloatMethodA,
2170
checked_jni_CallStaticDoubleMethod,
2171
checked_jni_CallStaticDoubleMethodV,
2172
checked_jni_CallStaticDoubleMethodA,
2173
checked_jni_CallStaticVoidMethod,
2174
checked_jni_CallStaticVoidMethodV,
2175
checked_jni_CallStaticVoidMethodA,
2176
2177
checked_jni_GetStaticFieldID,
2178
2179
checked_jni_GetStaticObjectField,
2180
checked_jni_GetStaticBooleanField,
2181
checked_jni_GetStaticByteField,
2182
checked_jni_GetStaticCharField,
2183
checked_jni_GetStaticShortField,
2184
checked_jni_GetStaticIntField,
2185
checked_jni_GetStaticLongField,
2186
checked_jni_GetStaticFloatField,
2187
checked_jni_GetStaticDoubleField,
2188
2189
checked_jni_SetStaticObjectField,
2190
checked_jni_SetStaticBooleanField,
2191
checked_jni_SetStaticByteField,
2192
checked_jni_SetStaticCharField,
2193
checked_jni_SetStaticShortField,
2194
checked_jni_SetStaticIntField,
2195
checked_jni_SetStaticLongField,
2196
checked_jni_SetStaticFloatField,
2197
checked_jni_SetStaticDoubleField,
2198
2199
checked_jni_NewString,
2200
checked_jni_GetStringLength,
2201
checked_jni_GetStringChars,
2202
checked_jni_ReleaseStringChars,
2203
2204
checked_jni_NewStringUTF,
2205
checked_jni_GetStringUTFLength,
2206
checked_jni_GetStringUTFChars,
2207
checked_jni_ReleaseStringUTFChars,
2208
2209
checked_jni_GetArrayLength,
2210
2211
checked_jni_NewObjectArray,
2212
checked_jni_GetObjectArrayElement,
2213
checked_jni_SetObjectArrayElement,
2214
2215
checked_jni_NewBooleanArray,
2216
checked_jni_NewByteArray,
2217
checked_jni_NewCharArray,
2218
checked_jni_NewShortArray,
2219
checked_jni_NewIntArray,
2220
checked_jni_NewLongArray,
2221
checked_jni_NewFloatArray,
2222
checked_jni_NewDoubleArray,
2223
2224
checked_jni_GetBooleanArrayElements,
2225
checked_jni_GetByteArrayElements,
2226
checked_jni_GetCharArrayElements,
2227
checked_jni_GetShortArrayElements,
2228
checked_jni_GetIntArrayElements,
2229
checked_jni_GetLongArrayElements,
2230
checked_jni_GetFloatArrayElements,
2231
checked_jni_GetDoubleArrayElements,
2232
2233
checked_jni_ReleaseBooleanArrayElements,
2234
checked_jni_ReleaseByteArrayElements,
2235
checked_jni_ReleaseCharArrayElements,
2236
checked_jni_ReleaseShortArrayElements,
2237
checked_jni_ReleaseIntArrayElements,
2238
checked_jni_ReleaseLongArrayElements,
2239
checked_jni_ReleaseFloatArrayElements,
2240
checked_jni_ReleaseDoubleArrayElements,
2241
2242
checked_jni_GetBooleanArrayRegion,
2243
checked_jni_GetByteArrayRegion,
2244
checked_jni_GetCharArrayRegion,
2245
checked_jni_GetShortArrayRegion,
2246
checked_jni_GetIntArrayRegion,
2247
checked_jni_GetLongArrayRegion,
2248
checked_jni_GetFloatArrayRegion,
2249
checked_jni_GetDoubleArrayRegion,
2250
2251
checked_jni_SetBooleanArrayRegion,
2252
checked_jni_SetByteArrayRegion,
2253
checked_jni_SetCharArrayRegion,
2254
checked_jni_SetShortArrayRegion,
2255
checked_jni_SetIntArrayRegion,
2256
checked_jni_SetLongArrayRegion,
2257
checked_jni_SetFloatArrayRegion,
2258
checked_jni_SetDoubleArrayRegion,
2259
2260
checked_jni_RegisterNatives,
2261
checked_jni_UnregisterNatives,
2262
2263
checked_jni_MonitorEnter,
2264
checked_jni_MonitorExit,
2265
2266
checked_jni_GetJavaVM,
2267
2268
checked_jni_GetStringRegion,
2269
checked_jni_GetStringUTFRegion,
2270
2271
checked_jni_GetPrimitiveArrayCritical,
2272
checked_jni_ReleasePrimitiveArrayCritical,
2273
2274
checked_jni_GetStringCritical,
2275
checked_jni_ReleaseStringCritical,
2276
2277
checked_jni_NewWeakGlobalRef,
2278
checked_jni_DeleteWeakGlobalRef,
2279
2280
checked_jni_ExceptionCheck,
2281
2282
checked_jni_NewDirectByteBuffer,
2283
checked_jni_GetDirectBufferAddress,
2284
checked_jni_GetDirectBufferCapacity,
2285
2286
// New 1.6 Features
2287
2288
checked_jni_GetObjectRefType
2289
};
2290
2291
2292
// Returns the function structure
2293
struct JNINativeInterface_* jni_functions_check() {
2294
2295
unchecked_jni_NativeInterface = jni_functions_nocheck();
2296
2297
// make sure the last pointer in the checked table is not null, indicating
2298
// an addition to the JNINativeInterface_ structure without initializing
2299
// it in the checked table.
2300
debug_only(int *lastPtr = (int *)((char *)&checked_jni_NativeInterface + \
2301
sizeof(*unchecked_jni_NativeInterface) - sizeof(char *));)
2302
assert(*lastPtr != 0,
2303
"Mismatched JNINativeInterface tables, check for new entries");
2304
2305
// with -verbose:jni this message will print
2306
if (PrintJNIResolving) {
2307
tty->print_cr("Checked JNI functions are being used to " \
2308
"validate JNI usage");
2309
}
2310
2311
return &checked_jni_NativeInterface;
2312
}
2313
2314