Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/j9vm31/jnicsup.cpp
5985 views
1
/*******************************************************************************
2
* Copyright (c) 2021, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "j9vm31.h"
24
#include "omrcomp.h"
25
26
extern "C" {
27
28
#define GET_BOOLEAN_ARRAY_ELEMENTS ((jboolean * (JNICALL *)(JNIEnv *env, jbooleanArray array, jboolean * isCopy))getArrayElements)
29
#define GET_BYTE_ARRAY_ELEMENTS ((jbyte * (JNICALL *)(JNIEnv *env, jbyteArray array, jboolean * isCopy))getArrayElements)
30
#define GET_CHAR_ARRAY_ELEMENTS ((jchar * (JNICALL *)(JNIEnv *env, jcharArray array, jboolean * isCopy))getArrayElements)
31
#define GET_SHORT_ARRAY_ELEMENTS ((jshort * (JNICALL *)(JNIEnv *env, jshortArray array, jboolean * isCopy))getArrayElements)
32
#define GET_INT_ARRAY_ELEMENTS ((jint * (JNICALL *)(JNIEnv *env, jintArray array, jboolean * isCopy))getArrayElements)
33
#define GET_LONG_ARRAY_ELEMENTS ((jlong * (JNICALL *)(JNIEnv *env, jlongArray array, jboolean * isCopy))getArrayElements)
34
#define GET_FLOAT_ARRAY_ELEMENTS ((jfloat * (JNICALL *)(JNIEnv *env, jfloatArray array, jboolean * isCopy))getArrayElements)
35
#define GET_DOUBLE_ARRAY_ELEMENTS ((jdouble * (JNICALL *)(JNIEnv *env, jdoubleArray array, jboolean * isCopy))getArrayElements)
36
#define GET_PRIMITIVE_ARRAY_CRITICAL ((void * (JNICALL *)(JNIEnv *env, jarray array, jboolean * isCopy))getArrayElements)
37
38
#define RELEASE_BOOLEAN_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jbooleanArray array, jboolean * elems, jint mode))releaseArrayElements)
39
#define RELEASE_BYTE_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jbyteArray array, jbyte * elems, jint mode))releaseArrayElements)
40
#define RELEASE_CHAR_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jcharArray array, jchar * elems, jint mode))releaseArrayElements)
41
#define RELEASE_SHORT_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jshortArray array, jshort * elems, jint mode))releaseArrayElements)
42
#define RELEASE_INT_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jintArray array, jint * elems, jint mode))releaseArrayElements)
43
#define RELEASE_LONG_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jlongArray array, jlong * elems, jint mode))releaseArrayElements)
44
#define RELEASE_FLOAT_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jfloatArray array, jfloat * elems, jint mode))releaseArrayElements)
45
#define RELEASE_DOUBLE_ARRAY_ELEMENTS ((void (JNICALL *)(JNIEnv *env, jdoubleArray array, jdouble * elems, jint mode))releaseArrayElements)
46
#define RELEASE_PRIMITIVE_ARRAY_CRITICAL ((void (JNICALL *)(JNIEnv *env, jarray carray, void * elems, jint mode))releaseArrayElements)
47
48
#define GET_BOOLEAN_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jbooleanArray array, jsize start, jsize len, jboolean *buf))getArrayRegion)
49
#define GET_BYTE_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf))getArrayRegion)
50
#define GET_CHAR_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf))getArrayRegion)
51
#define GET_SHORT_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf))getArrayRegion)
52
#define GET_INT_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf))getArrayRegion)
53
#define GET_LONG_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf))getArrayRegion)
54
#define GET_FLOAT_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf))getArrayRegion)
55
#define GET_DOUBLE_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf))getArrayRegion)
56
57
#define SET_BOOLEAN_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jbooleanArray array, jsize start, jsize len, jboolean *buf))setArrayRegion)
58
#define SET_BYTE_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jbyteArray array, jsize start, jsize len, jbyte *buf))setArrayRegion)
59
#define SET_CHAR_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jcharArray array, jsize start, jsize len, jchar *buf))setArrayRegion)
60
#define SET_SHORT_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jshortArray array, jsize start, jsize len, jshort *buf))setArrayRegion)
61
#define SET_INT_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jintArray array, jsize start, jsize len, jint *buf))setArrayRegion)
62
#define SET_LONG_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jlongArray array, jsize start, jsize len, jlong *buf))setArrayRegion)
63
#define SET_FLOAT_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jfloatArray array, jsize start, jsize len, jfloat *buf))setArrayRegion)
64
#define SET_DOUBLE_ARRAY_REGION ((void (JNICALL *)(JNIEnv *env, jdoubleArray array, jsize start, jsize len, jdouble *buf))setArrayRegion)
65
66
#define GET_STRING_CRITICAL ((const jchar * (JNICALL *)(JNIEnv *env, jstring string, jboolean *isCopy))GetStringChars)
67
#define RELEASE_STRING_CRITICAL ((void (JNICALL *)(JNIEnv *env, jstring string, const jchar *carray))ReleaseStringChars)
68
69
/* Given LE supports only one TCB that can cross AMODE boundary, most likely
70
* we will only have 1 JNIEnv31 in the address space. Use a static to
71
* track the live JNIEnv31 instances in case this gets expanded in the future.
72
*/
73
static JNIEnv31* globalRootJNIEnv31 = NULL;
74
75
/* A handle on the global table from 64-bit JVM with set of function pointers. */
76
static const jlong * global64BitJNIInterface_ = NULL;
77
78
/* This is the function table of the 31-bit shim JNINativeInterface functions. */
79
struct JNINativeInterface_ EsJNIFunctions = {
80
NULL,
81
NULL,
82
NULL,
83
NULL,
84
GetVersion,
85
DefineClass,
86
FindClass,
87
FromReflectedMethod,
88
FromReflectedField,
89
ToReflectedMethod,
90
GetSuperclass,
91
IsAssignableFrom,
92
ToReflectedField,
93
Throw,
94
ThrowNew,
95
ExceptionOccurred,
96
ExceptionDescribe,
97
ExceptionClear,
98
FatalError,
99
PushLocalFrame,
100
PopLocalFrame,
101
NewGlobalRef,
102
DeleteGlobalRef,
103
DeleteLocalRef,
104
IsSameObject,
105
NewLocalRef,
106
EnsureLocalCapacity,
107
AllocObject,
108
NewObject,
109
NewObjectV,
110
NewObjectA,
111
GetObjectClass,
112
IsInstanceOf,
113
GetMethodID,
114
CallObjectMethod,
115
CallObjectMethodV,
116
CallObjectMethodA,
117
CallBooleanMethod,
118
CallBooleanMethodV,
119
CallBooleanMethodA,
120
CallByteMethod,
121
CallByteMethodV,
122
CallByteMethodA,
123
CallCharMethod,
124
CallCharMethodV,
125
CallCharMethodA,
126
CallShortMethod,
127
CallShortMethodV,
128
CallShortMethodA,
129
CallIntMethod,
130
CallIntMethodV,
131
CallIntMethodA,
132
CallLongMethod,
133
CallLongMethodV,
134
CallLongMethodA,
135
CallFloatMethod,
136
CallFloatMethodV,
137
CallFloatMethodA,
138
CallDoubleMethod,
139
CallDoubleMethodV,
140
CallDoubleMethodA,
141
CallVoidMethod,
142
CallVoidMethodV,
143
CallVoidMethodA,
144
CallNonvirtualObjectMethod,
145
CallNonvirtualObjectMethodV,
146
CallNonvirtualObjectMethodA,
147
CallNonvirtualBooleanMethod,
148
CallNonvirtualBooleanMethodV,
149
CallNonvirtualBooleanMethodA,
150
CallNonvirtualByteMethod,
151
CallNonvirtualByteMethodV,
152
CallNonvirtualByteMethodA,
153
CallNonvirtualCharMethod,
154
CallNonvirtualCharMethodV,
155
CallNonvirtualCharMethodA,
156
CallNonvirtualShortMethod,
157
CallNonvirtualShortMethodV,
158
CallNonvirtualShortMethodA,
159
CallNonvirtualIntMethod,
160
CallNonvirtualIntMethodV,
161
CallNonvirtualIntMethodA,
162
CallNonvirtualLongMethod,
163
CallNonvirtualLongMethodV,
164
CallNonvirtualLongMethodA,
165
CallNonvirtualFloatMethod,
166
CallNonvirtualFloatMethodV,
167
CallNonvirtualFloatMethodA,
168
CallNonvirtualDoubleMethod,
169
CallNonvirtualDoubleMethodV,
170
CallNonvirtualDoubleMethodA,
171
CallNonvirtualVoidMethod,
172
CallNonvirtualVoidMethodV,
173
CallNonvirtualVoidMethodA,
174
GetFieldID,
175
GetObjectField,
176
GetBooleanField,
177
GetByteField,
178
GetCharField,
179
GetShortField,
180
GetIntField,
181
GetLongField,
182
GetFloatField,
183
GetDoubleField,
184
SetObjectField,
185
SetBooleanField,
186
SetByteField,
187
SetCharField,
188
SetShortField,
189
SetIntField,
190
SetLongField,
191
SetFloatField,
192
SetDoubleField,
193
GetStaticMethodID,
194
CallStaticObjectMethod,
195
CallStaticObjectMethodV,
196
CallStaticObjectMethodA,
197
CallStaticBooleanMethod,
198
CallStaticBooleanMethodV,
199
CallStaticBooleanMethodA,
200
CallStaticByteMethod,
201
CallStaticByteMethodV,
202
CallStaticByteMethodA,
203
CallStaticCharMethod,
204
CallStaticCharMethodV,
205
CallStaticCharMethodA,
206
CallStaticShortMethod,
207
CallStaticShortMethodV,
208
CallStaticShortMethodA,
209
CallStaticIntMethod,
210
CallStaticIntMethodV,
211
CallStaticIntMethodA,
212
CallStaticLongMethod,
213
CallStaticLongMethodV,
214
CallStaticLongMethodA,
215
CallStaticFloatMethod,
216
CallStaticFloatMethodV,
217
CallStaticFloatMethodA,
218
CallStaticDoubleMethod,
219
CallStaticDoubleMethodV,
220
CallStaticDoubleMethodA,
221
CallStaticVoidMethod,
222
CallStaticVoidMethodV,
223
CallStaticVoidMethodA,
224
GetStaticFieldID,
225
GetStaticObjectField,
226
GetStaticBooleanField,
227
GetStaticByteField,
228
GetStaticCharField,
229
GetStaticShortField,
230
GetStaticIntField,
231
GetStaticLongField,
232
GetStaticFloatField,
233
GetStaticDoubleField,
234
SetStaticObjectField,
235
SetStaticBooleanField,
236
SetStaticByteField,
237
SetStaticCharField,
238
SetStaticShortField,
239
SetStaticIntField,
240
SetStaticLongField,
241
SetStaticFloatField,
242
SetStaticDoubleField,
243
NewString,
244
GetStringLength,
245
GetStringChars,
246
ReleaseStringChars,
247
NewStringUTF,
248
GetStringUTFLength,
249
GetStringUTFChars,
250
ReleaseStringUTFChars,
251
GetArrayLength,
252
NewObjectArray,
253
GetObjectArrayElement,
254
SetObjectArrayElement,
255
NewBooleanArray,
256
NewByteArray,
257
NewCharArray,
258
NewShortArray,
259
NewIntArray,
260
NewLongArray,
261
NewFloatArray,
262
NewDoubleArray,
263
GET_BOOLEAN_ARRAY_ELEMENTS,
264
GET_BYTE_ARRAY_ELEMENTS,
265
GET_CHAR_ARRAY_ELEMENTS,
266
GET_SHORT_ARRAY_ELEMENTS,
267
GET_INT_ARRAY_ELEMENTS,
268
GET_LONG_ARRAY_ELEMENTS,
269
GET_FLOAT_ARRAY_ELEMENTS,
270
GET_DOUBLE_ARRAY_ELEMENTS,
271
RELEASE_BOOLEAN_ARRAY_ELEMENTS,
272
RELEASE_BYTE_ARRAY_ELEMENTS,
273
RELEASE_CHAR_ARRAY_ELEMENTS,
274
RELEASE_SHORT_ARRAY_ELEMENTS,
275
RELEASE_INT_ARRAY_ELEMENTS,
276
RELEASE_LONG_ARRAY_ELEMENTS,
277
RELEASE_FLOAT_ARRAY_ELEMENTS,
278
RELEASE_DOUBLE_ARRAY_ELEMENTS,
279
GET_BOOLEAN_ARRAY_REGION,
280
GET_BYTE_ARRAY_REGION,
281
GET_CHAR_ARRAY_REGION,
282
GET_SHORT_ARRAY_REGION,
283
GET_INT_ARRAY_REGION,
284
GET_LONG_ARRAY_REGION,
285
GET_FLOAT_ARRAY_REGION,
286
GET_DOUBLE_ARRAY_REGION,
287
SET_BOOLEAN_ARRAY_REGION,
288
SET_BYTE_ARRAY_REGION,
289
SET_CHAR_ARRAY_REGION,
290
SET_SHORT_ARRAY_REGION,
291
SET_INT_ARRAY_REGION,
292
SET_LONG_ARRAY_REGION,
293
SET_FLOAT_ARRAY_REGION,
294
SET_DOUBLE_ARRAY_REGION,
295
RegisterNatives,
296
UnregisterNatives,
297
MonitorEnter,
298
MonitorExit,
299
GetJavaVM,
300
GetStringRegion,
301
GetStringUTFRegion,
302
GET_PRIMITIVE_ARRAY_CRITICAL,
303
RELEASE_PRIMITIVE_ARRAY_CRITICAL,
304
GET_STRING_CRITICAL,
305
RELEASE_STRING_CRITICAL,
306
NewWeakGlobalRef,
307
DeleteWeakGlobalRef,
308
ExceptionCheck,
309
NewDirectByteBuffer,
310
GetDirectBufferAddress,
311
GetDirectBufferCapacity,
312
GetObjectRefType,
313
#if JAVA_SPEC_VERSION >= 9
314
GetModule,
315
#endif /* JAVA_SPEC_VERSION >= 9 */
316
};
317
318
static void initializeJNIEnv31(JNIEnv31 * jniEnv31, jlong jniEnv64);
319
320
jint JNICALL
321
GetVersion(JNIEnv *env)
322
{
323
const jint NUM_ARGS = 1;
324
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64 };
325
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env) };
326
jint returnValue;
327
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetVersion);
328
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
329
return returnValue;
330
}
331
332
jclass JNICALL
333
DefineClass(JNIEnv *env, const char *name, jobject loader, const jbyte *buf, jsize bufLen)
334
{
335
const jint NUM_ARGS = 5;
336
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jobject, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jsize };
337
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)name, loader, (uint64_t) buf, (uint64_t) bufLen };
338
jclass returnValue;
339
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, DefineClass);
340
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jclass, &returnValue);
341
return returnValue;
342
}
343
344
jint JNICALL
345
ThrowNew(JNIEnv *env, jclass clazz, const char *message)
346
{
347
const jint NUM_ARGS = 3;
348
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_uint32_ptr };
349
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, (uint64_t)message };
350
jint returnValue;
351
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ThrowNew);
352
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
353
return returnValue;
354
}
355
356
jthrowable JNICALL
357
ExceptionOccurred(JNIEnv *env)
358
{
359
const jint NUM_ARGS = 1;
360
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64 };
361
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env) };
362
jthrowable returnValue;
363
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ExceptionOccurred);
364
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jthrowable, &returnValue);
365
return returnValue;
366
}
367
368
void JNICALL
369
ExceptionDescribe(JNIEnv *env)
370
{
371
const jint NUM_ARGS = 1;
372
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64 };
373
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env) };
374
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ExceptionDescribe);
375
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
376
return;
377
}
378
379
void JNICALL
380
ExceptionClear(JNIEnv *env)
381
{
382
const jint NUM_ARGS = 1;
383
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64 };
384
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env) };
385
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ExceptionClear);
386
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
387
return;
388
}
389
390
void JNICALL
391
FatalError(JNIEnv *env, const char *msg)
392
{
393
const jint NUM_ARGS = 2;
394
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
395
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)msg };
396
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, FatalError);
397
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
398
return;
399
}
400
401
jint JNICALL
402
PushLocalFrame(JNIEnv *env, jint capacity)
403
{
404
const jint NUM_ARGS = 2;
405
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
406
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), capacity };
407
jint returnValue;
408
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, PushLocalFrame);
409
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
410
return returnValue;
411
}
412
413
jobject JNICALL
414
PopLocalFrame(JNIEnv *env, jobject result)
415
{
416
const jint NUM_ARGS = 2;
417
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
418
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), result };
419
jobject returnValue;
420
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, PopLocalFrame);
421
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
422
return returnValue;
423
}
424
425
jobject JNICALL
426
NewGlobalRef(JNIEnv *env, jobject obj)
427
{
428
const jint NUM_ARGS = 2;
429
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
430
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
431
jobject returnValue;
432
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewGlobalRef);
433
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
434
return returnValue;
435
}
436
437
void JNICALL
438
DeleteGlobalRef(JNIEnv *env, jobject gref)
439
{
440
const jint NUM_ARGS = 2;
441
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
442
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), gref };
443
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, DeleteGlobalRef);
444
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
445
return;
446
}
447
448
void JNICALL
449
DeleteLocalRef(JNIEnv *env, jobject localRef)
450
{
451
const jint NUM_ARGS = 2;
452
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
453
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), localRef };
454
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, DeleteLocalRef);
455
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
456
return;
457
}
458
459
jobject JNICALL
460
NewLocalRef(JNIEnv *env, jobject ref)
461
{
462
const jint NUM_ARGS = 2;
463
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
464
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), ref };
465
jobject returnValue;
466
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewLocalRef);
467
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
468
return returnValue;
469
}
470
471
jint JNICALL
472
EnsureLocalCapacity(JNIEnv *env, jint capacity)
473
{
474
const jint NUM_ARGS = 2;
475
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jint };
476
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), capacity };
477
jint returnValue;
478
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, EnsureLocalCapacity);
479
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
480
return returnValue;
481
}
482
483
static jobject
484
NewObjectV_64(JNIEnv *env, jclass clazz, jmethodID methodID, va_list_64 parms)
485
{
486
const jint NUM_ARGS = 4;
487
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_jmethodID, CEL4RO64_type_uint32_ptr };
488
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, methodID, (uint64_t)parms };
489
jobject returnValue = NULL;
490
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewObjectV);
491
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
492
return returnValue;
493
}
494
495
jobject JNICALL
496
NewObject(JNIEnv *env, jclass clazz, jmethodID methodID, ...)
497
{
498
va_list_64 parms;
499
(void)( (parms)[0] = 0, (parms)[1] = (char *)&(methodID), (parms)[2] = 0, (parms)[3] = (parms)[1] + sizeof(jmethodID) );
500
501
return NewObjectV_64(env, clazz, methodID, parms);
502
}
503
504
jobject JNICALL
505
NewObjectV(JNIEnv *env, jclass clazz, jmethodID methodID, va_list args)
506
{
507
va_list_64 parms;
508
509
// Extract the arguments pointer from 31-bit va_list.
510
char *arguments = (char *)((int *)args)[1];
511
(void)( (parms)[0] = 0, (parms)[1] = (char *)&(methodID), (parms)[2] = 0, (parms)[3] = arguments );
512
513
return NewObjectV_64(env, clazz, methodID, parms);
514
}
515
516
jobject JNICALL
517
NewObjectA(JNIEnv *env, jclass clazz, jmethodID methodID, jvalue *args)
518
{
519
const jint NUM_ARGS = 4;
520
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_jmethodID, CEL4RO64_type_uint32_ptr };
521
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, methodID, (uint64_t)args };
522
jobject returnValue = NULL;
523
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewObjectA);
524
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
525
return returnValue;
526
}
527
528
jboolean JNICALL
529
IsInstanceOf(JNIEnv *env, jobject obj, jclass clazz)
530
{
531
const jint NUM_ARGS = 3;
532
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject, CEL4RO64_type_jclass };
533
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj, clazz };
534
jboolean returnValue;
535
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, IsInstanceOf);
536
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jboolean, &returnValue);
537
return returnValue;
538
}
539
540
jmethodID JNICALL
541
GetMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
542
{
543
const jint NUM_ARGS = 4;
544
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr };
545
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, (uint64_t)name, (uint64_t)sig };
546
jmethodID returnValue = NULL;
547
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetMethodID);
548
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jmethodID, &returnValue);
549
return returnValue;
550
}
551
552
jfieldID JNICALL
553
GetFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
554
{
555
const jint NUM_ARGS = 4;
556
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr };
557
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, (uint64_t)name, (uint64_t)sig };
558
jfieldID returnValue = NULL;
559
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetFieldID);
560
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jfieldID, &returnValue);
561
return returnValue;
562
}
563
564
jmethodID JNICALL
565
GetStaticMethodID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
566
{
567
const jint NUM_ARGS = 4;
568
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr };
569
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, (uint64_t)name, (uint64_t)sig };
570
jmethodID returnValue = NULL;
571
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStaticMethodID);
572
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jmethodID, &returnValue);
573
return returnValue;
574
}
575
576
jfieldID JNICALL
577
GetStaticFieldID(JNIEnv *env, jclass clazz, const char *name, const char *sig)
578
{
579
const jint NUM_ARGS = 4;
580
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr };
581
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, (uint64_t)name, (uint64_t)sig };
582
jfieldID returnValue = NULL;
583
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStaticFieldID);
584
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jfieldID, &returnValue);
585
return returnValue;
586
}
587
588
jbooleanArray JNICALL
589
NewBooleanArray(JNIEnv *env, jsize length)
590
{
591
const jint NUM_ARGS = 2;
592
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
593
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
594
jbooleanArray returnValue = NULL;
595
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewBooleanArray);
596
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
597
return returnValue;
598
}
599
600
jbyteArray JNICALL
601
NewByteArray(JNIEnv *env, jsize length)
602
{
603
const jint NUM_ARGS = 2;
604
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
605
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
606
jbyteArray returnValue = NULL;
607
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewByteArray);
608
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
609
return returnValue;
610
}
611
612
jcharArray JNICALL
613
NewCharArray(JNIEnv *env, jsize length)
614
{
615
const jint NUM_ARGS = 2;
616
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
617
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
618
jcharArray returnValue = NULL;
619
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewCharArray);
620
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
621
return returnValue;
622
}
623
624
jshortArray JNICALL
625
NewShortArray(JNIEnv *env, jsize length)
626
{
627
const jint NUM_ARGS = 2;
628
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
629
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
630
jshortArray returnValue = NULL;
631
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewShortArray);
632
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
633
return returnValue;
634
}
635
636
jintArray JNICALL
637
NewIntArray(JNIEnv *env, jsize length)
638
{
639
const jint NUM_ARGS = 2;
640
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
641
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
642
jintArray returnValue = NULL;
643
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewIntArray);
644
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
645
return returnValue;
646
}
647
648
jlongArray JNICALL
649
NewLongArray(JNIEnv *env, jsize length)
650
{
651
const jint NUM_ARGS = 2;
652
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
653
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
654
jlongArray returnValue = NULL;
655
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewLongArray);
656
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
657
return returnValue;
658
}
659
660
jfloatArray JNICALL
661
NewFloatArray(JNIEnv *env, jsize length)
662
{
663
const jint NUM_ARGS = 2;
664
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
665
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
666
jfloatArray returnValue = NULL;
667
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewFloatArray);
668
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
669
return returnValue;
670
}
671
672
jdoubleArray JNICALL
673
NewDoubleArray(JNIEnv *env, jsize length)
674
{
675
const jint NUM_ARGS = 2;
676
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize };
677
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length };
678
jdoubleArray returnValue = NULL;
679
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewDoubleArray);
680
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
681
return returnValue;
682
}
683
684
jint JNICALL
685
MonitorEnter(JNIEnv *env, jobject obj)
686
{
687
const jint NUM_ARGS = 2;
688
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
689
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
690
jint returnValue = JNI_ERR;
691
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, MonitorEnter);
692
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
693
return returnValue;
694
}
695
696
jint JNICALL
697
MonitorExit(JNIEnv *env, jobject obj)
698
{
699
const jint NUM_ARGS = 2;
700
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
701
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
702
jint returnValue = JNI_ERR;
703
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, MonitorExit);
704
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
705
return returnValue;
706
}
707
708
jint JNICALL
709
GetJavaVM(JNIEnv *env, JavaVM **vm)
710
{
711
if (NULL != ((JNIEnv31 *)env)->javaVM31) {
712
/* Return cached instance of JavaVM31, if available. */
713
*vm = (JavaVM *)((JNIEnv31 *)env)->javaVM31;
714
return JNI_OK;
715
}
716
717
/* Query the JVM to get the 64-bit JavaVM pointer first, and we will return the corresponding 31-bit
718
* JavaVM instance
719
*/
720
uint64_t JavaVM64Result = 0;
721
const jint NUM_ARGS = 2;
722
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
723
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)&JavaVM64Result };
724
jint returnValue = JNI_ERR;
725
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetJavaVM);
726
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
727
728
if (JNI_OK == returnValue) {
729
/* Find or create a matching 31-bit JavaVM instance. */
730
JavaVM31 *javaVM31 = getJavaVM31(JavaVM64Result);
731
((JNIEnv31 *)env)->javaVM31 = javaVM31;
732
*vm = (JavaVM *)javaVM31;
733
}
734
return returnValue;
735
}
736
737
jweak JNICALL
738
NewWeakGlobalRef(JNIEnv *env, jobject obj)
739
{
740
const jint NUM_ARGS = 2;
741
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
742
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
743
jweak returnValue = NULL;
744
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewWeakGlobalRef);
745
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jweak, &returnValue);
746
return returnValue;
747
}
748
749
void JNICALL
750
DeleteWeakGlobalRef(JNIEnv *env, jweak obj)
751
{
752
const jint NUM_ARGS = 2;
753
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jweak };
754
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
755
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, DeleteWeakGlobalRef);
756
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
757
return;
758
}
759
760
jboolean JNICALL
761
ExceptionCheck(JNIEnv *env)
762
{
763
const jint NUM_ARGS = 1;
764
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64 };
765
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env) };
766
jboolean returnValue = NULL;
767
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ExceptionCheck);
768
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jboolean, &returnValue);
769
return returnValue;
770
}
771
772
jobject JNICALL
773
NewDirectByteBuffer(JNIEnv *env, void *address, jlong capacity)
774
{
775
const jint NUM_ARGS = 3;
776
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jlong};
777
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint32_t)address, capacity};
778
jobject returnValue;
779
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewDirectByteBuffer);
780
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
781
return returnValue;
782
}
783
784
void * JNICALL
785
GetDirectBufferAddress(JNIEnv *env, jobject buf)
786
{
787
/* It is the user's responsibility to invoke GetDirectBufferAddress on DBB objects that are backed by memory
788
* below-the-bar in order for this to be accessible. However, we will check the final address and return NULL,
789
* which should fail more gracefully.
790
*/
791
const jint NUM_ARGS = 2;
792
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
793
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), buf };
794
jlong returnValue = NULL;
795
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetDirectBufferAddress);
796
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jlong, &returnValue);
797
798
if (0 != returnValue) {
799
/* If the upper 33-bits are non-zero, then the backing memory is not accessible in AMODE31.
800
* Return NULL if that's the case.
801
*/
802
if (returnValue != (returnValue & 0x7FFFFFFF)) {
803
return NULL;
804
}
805
}
806
return (void *)returnValue;
807
}
808
809
jlong JNICALL
810
GetDirectBufferCapacity(JNIEnv *env, jobject buf)
811
{
812
const jint NUM_ARGS = 2;
813
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
814
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), buf };
815
jlong returnValue = NULL;
816
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetDirectBufferCapacity);
817
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jlong, &returnValue);
818
return returnValue;
819
}
820
821
jobjectRefType JNICALL
822
GetObjectRefType(JNIEnv* env, jobject obj)
823
{
824
const jint NUM_ARGS = 2;
825
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
826
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
827
jobjectRefType returnValue;
828
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetObjectRefType);
829
/* Note: jobjectRefType is a 4-byte enum -- using CEL4RO64_type_jint as return type. */
830
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
831
return returnValue;
832
}
833
834
#if JAVA_SPEC_VERSION >= 9
835
jobject JNICALL
836
GetModule(JNIEnv *env, jclass clazz)
837
{
838
const jint NUM_ARGS = 2;
839
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass };
840
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz };
841
jobject returnValue = NULL;
842
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetModule);
843
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
844
return returnValue;
845
}
846
#endif /* JAVA_SPEC_VERSION >= 9 */
847
848
/**
849
* Following set of functions are JNIEnv31 utility routines.
850
*/
851
852
853
JNIEnv31 * JNICALL
854
getJNIEnv31(uint64_t jniEnv64)
855
{
856
/* Traverse list to find matching JavaVM31. */
857
for (JNIEnv31 *curJNIEnv31 = globalRootJNIEnv31; curJNIEnv31 != NULL; curJNIEnv31 = curJNIEnv31->next) {
858
if (jniEnv64 == curJNIEnv31->jniEnv64) {
859
return curJNIEnv31;
860
}
861
}
862
863
/* Create and initialize a new instance. */
864
JNIEnv31 *newJNIEnv31 = (JNIEnv31 *)malloc(sizeof(JNIEnv31));
865
if (NULL != newJNIEnv31) {
866
initializeJNIEnv31(newJNIEnv31, jniEnv64);
867
}
868
return newJNIEnv31;
869
}
870
871
/**
872
* Initialize new JNIEnv31 structure, with references to the corresponding 64-bit
873
* JNIEnv, along with both 31-bit and 64-bit JNI function tables. Add to our
874
* list of JNIEnv31.
875
*
876
* @param[in] javaVM31 The 31-bit JNIEnv* instance to initialize.
877
* @param[in] javaVM64 The matching 64-bit JNIEnv* from JVM.
878
*/
879
static void
880
initializeJNIEnv31(JNIEnv31 * jniEnv31, jlong jniEnv64)
881
{
882
jniEnv31->functions = (JNINativeInterface_ *)GLOBAL_TABLE(EsJNIFunctions);
883
jniEnv31->jniEnv64 = jniEnv64;
884
885
/* Look up the 64-bit JNIInterface_ function table if necessary. */
886
if (NULL == global64BitJNIInterface_) {
887
const jint NUM_ARGS = 1;
888
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64 };
889
890
uint64_t argValues[NUM_ARGS] = { (uint64_t)jniEnv64 };
891
uintptr_t returnValue = NULL;
892
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
893
LIBJ9VM29_NAME, "J9VM_initializeJNI31Table",
894
argTypes, argValues, NUM_ARGS, CEL4RO64_type_uint32_ptr, &returnValue);
895
global64BitJNIInterface_ = (jlong *)returnValue;
896
}
897
jniEnv31->functions64 = global64BitJNIInterface_;
898
jniEnv31->next = globalRootJNIEnv31;
899
globalRootJNIEnv31 = jniEnv31;
900
}
901
902
void
903
j9vm31TrcJNIMethodEntry(JNIEnv* env, const char *functionName) {
904
const char* isDebug = getenv("TR_3164Debug");
905
if (isDebug) {
906
fprintf(stderr, "j9vm31Trc - 31:[%p] 64:[%llx] invoking function: %s\n", env, JNIENV64_FROM_JNIENV31(env), functionName);
907
}
908
}
909
910
} /* extern "C" */
911
912