Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/j9vm31/jnimisc.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
25
jclass JNICALL
26
FindClass(JNIEnv *env, const char *name)
27
{
28
const jint NUM_ARGS = 2;
29
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
30
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)name};
31
jclass returnValue = NULL;
32
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, FindClass);
33
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jclass, &returnValue);
34
return returnValue;
35
}
36
37
jclass JNICALL
38
GetSuperclass(JNIEnv *env, jclass clazz)
39
{
40
const jint NUM_ARGS = 2;
41
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass };
42
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz };
43
jclass returnValue = NULL;
44
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetSuperclass);
45
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jclass, &returnValue);
46
return returnValue;
47
}
48
49
jboolean JNICALL
50
IsAssignableFrom(JNIEnv *env, jclass clazz1, jclass clazz2)
51
{
52
const jint NUM_ARGS = 3;
53
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_jclass };
54
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz1, clazz2 };
55
jboolean returnValue = NULL;
56
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, IsAssignableFrom);
57
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jboolean, &returnValue);
58
return returnValue;
59
}
60
61
jint JNICALL
62
Throw(JNIEnv *env, jthrowable obj)
63
{
64
const jint NUM_ARGS = 2;
65
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jthrowable };
66
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
67
jint returnValue = NULL;
68
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, Throw);
69
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
70
return returnValue;
71
}
72
73
jboolean JNICALL
74
IsSameObject(JNIEnv *env, jobject ref1, jobject ref2)
75
{
76
const jint NUM_ARGS = 3;
77
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject, CEL4RO64_type_jobject };
78
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), ref1, ref2 };
79
jboolean returnValue;
80
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, IsSameObject);
81
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jboolean, &returnValue);
82
return returnValue;
83
}
84
85
jobject JNICALL
86
AllocObject(JNIEnv *env, jclass clazz)
87
{
88
const jint NUM_ARGS = 2;
89
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass };
90
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz };
91
jobject returnValue;
92
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, AllocObject);
93
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jobject, &returnValue);
94
return returnValue;
95
}
96
97
jclass JNICALL
98
GetObjectClass(JNIEnv *env, jobject obj)
99
{
100
const jint NUM_ARGS = 2;
101
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jobject };
102
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), obj };
103
jclass returnValue = NULL;
104
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetObjectClass);
105
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jclass, &returnValue);
106
return returnValue;
107
}
108
109
jstring JNICALL
110
NewString(JNIEnv *env, const jchar *unicodeChars, jsize len)
111
{
112
const jint NUM_ARGS = 3;
113
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jsize };
114
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)unicodeChars, len };
115
jstring returnValue = NULL;
116
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewString);
117
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jstring, &returnValue);
118
return returnValue;
119
}
120
121
jsize JNICALL
122
GetStringLength(JNIEnv *env, jstring string)
123
{
124
const jint NUM_ARGS = 2;
125
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring };
126
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), string };
127
jsize returnValue = NULL;
128
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStringLength);
129
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jsize, &returnValue);
130
return returnValue;
131
}
132
133
const jchar *JNICALL
134
GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy)
135
{
136
/* This routine handles both GetStringChars and GetStringCritical, as the Java Heap is not accessible in AMODE31. */
137
const jint NUM_ARGS = 3;
138
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_uint32_ptr };
139
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), string, (uint64_t)isCopy };
140
const jchar *returnValue = NULL;
141
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStringChars);
142
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_uint32_ptr, &returnValue);
143
return returnValue;
144
}
145
146
void JNICALL
147
ReleaseStringChars(JNIEnv *env, jstring string, const jchar *utf)
148
{
149
/* This routine handles both GetStringChars and ReleaseStringCritical, GetStringCritical invokes GetStringChars. */
150
const jint NUM_ARGS = 3;
151
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_uint32_ptr };
152
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), string, (uint64_t)utf };
153
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ReleaseStringChars);
154
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
155
return;
156
}
157
158
jstring JNICALL
159
NewStringUTF(JNIEnv *env, const char *bytes)
160
{
161
const jint NUM_ARGS = 2;
162
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
163
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)bytes };
164
jstring returnValue = NULL;
165
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewStringUTF);
166
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jstring, &returnValue);
167
return returnValue;
168
}
169
170
jsize JNICALL
171
GetStringUTFLength(JNIEnv *env, jstring string)
172
{
173
const jint NUM_ARGS = 2;
174
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring };
175
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), string };
176
jsize returnValue = NULL;
177
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStringUTFLength);
178
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jsize, &returnValue);
179
return returnValue;
180
}
181
182
const char* JNICALL
183
GetStringUTFChars(JNIEnv *env, jstring string, jboolean *isCopy)
184
{
185
const jint NUM_ARGS = 3;
186
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_uint32_ptr };
187
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), string, (uint64_t)isCopy };
188
const char* returnValue = NULL;
189
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStringUTFChars);
190
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_uint32_ptr, &returnValue);
191
return returnValue;
192
}
193
194
void JNICALL
195
ReleaseStringUTFChars(JNIEnv *env, jstring string, const char* utf)
196
{
197
const jint NUM_ARGS = 3;
198
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_uint32_ptr };
199
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), string, (uint64_t)utf };
200
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ReleaseStringUTFChars);
201
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
202
return;
203
}
204
205
jsize JNICALL
206
GetArrayLength(JNIEnv *env, jarray array)
207
{
208
const jint NUM_ARGS = 2;
209
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jarray };
210
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), array };
211
jsize returnValue = NULL;
212
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetArrayLength);
213
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jsize, &returnValue);
214
return returnValue;
215
}
216
217
jobjectArray JNICALL
218
NewObjectArray(JNIEnv *env, jsize length, jclass clazz, jobject initialElement) {
219
const jint NUM_ARGS = 4;
220
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jsize, CEL4RO64_type_jclass, CEL4RO64_type_jobject };
221
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), length, clazz, initialElement };
222
jobjectArray returnValue = NULL;
223
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, NewObjectArray);
224
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jarray, &returnValue);
225
return returnValue;
226
}
227
228
void* JNICALL
229
getArrayElements(JNIEnv *env, jarray array, jboolean *isCopy)
230
{
231
/* This routine is used for all Get*ArrayElements and GetPrimitiveArrayCritical. The latter because
232
* the Java heap is not addressible in AMODE 31, as such, will always return a copy.
233
*/
234
const jint NUM_ARGS = 3;
235
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jarray, CEL4RO64_type_uint32_ptr };
236
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), array, (uint64_t)isCopy };
237
void* returnValue = NULL;
238
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetBooleanArrayElements);
239
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_uint32_ptr, &returnValue);
240
return returnValue;
241
}
242
243
void JNICALL
244
releaseArrayElements(JNIEnv *env, jarray array, void *elems, jint mode)
245
{
246
/* This routine is used for all Release*ArrayElements and ReleasePrimitiveArrayCritical. The latter because
247
* GetPrimitiveArrayCritical actually calls getArrayElements, so we need to release the array elements
248
* the same way.
249
*/
250
const jint NUM_ARGS = 4;
251
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jarray, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jint };
252
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), array, (uint64_t) elems, mode };
253
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, ReleaseBooleanArrayElements);
254
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
255
return;
256
}
257
258
void JNICALL
259
getArrayRegion(JNIEnv *env, jarray array, jsize start, jsize len, void *buf)
260
{
261
/* This routine is used for all Get*ArrayRegion. */
262
const jint NUM_ARGS = 5;
263
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jarray, CEL4RO64_type_jsize, CEL4RO64_type_jsize, CEL4RO64_type_uint32_ptr };
264
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), array, start, len, (uint64_t)buf };
265
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetBooleanArrayRegion);
266
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
267
return;
268
}
269
270
void JNICALL
271
setArrayRegion(JNIEnv *env, jarray array, jsize start, jsize len, void *buf)
272
{
273
/* This routine is used for all Get*ArrayRegion. */
274
const jint NUM_ARGS = 5;
275
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jarray, CEL4RO64_type_jsize, CEL4RO64_type_jsize, CEL4RO64_type_uint32_ptr };
276
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), array, start, len, (uint64_t)buf };
277
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, SetBooleanArrayRegion);
278
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
279
return;
280
}
281
282
/**
283
* A 64-bit representation of JNINativeMethod struct.
284
*/
285
typedef struct {
286
void *namePadding; /**< Padding for upper 32-bits of name member. */
287
char *name; /**< Method name. */
288
void *signaturePadding; /**< Padding for upper 32-bits of signature member. */
289
char *signature; /**< Method signature. */
290
jint fnPtrPadding; /**< Upper 32-bits of function pointer -- to be tagged HANDLE31_HIGHTAG. */
291
void *fnPtr; /**< Function pointer. */
292
} JNINativeMethod64;
293
294
jint JNICALL
295
RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
296
{
297
JNINativeMethod64* methods64 = (JNINativeMethod64 *)malloc(nMethods * sizeof(JNINativeMethod64));
298
if (NULL == methods64)
299
return JNI_ERR;
300
301
/* Zero initialize and copy the JNINativeMethod parameters, and tag the function pointers
302
* with HANDLE31_HIGHTAG to signify they are from AMODE 31.
303
*/
304
memset(methods64, 0, nMethods * sizeof(JNINativeMethod64));
305
306
for (int i = 0; i < nMethods; i++) {
307
methods64[i].fnPtr = methods[i].fnPtr;
308
methods64[i].name = methods[i].name;
309
methods64[i].signature = methods[i].signature;
310
methods64[i].fnPtrPadding = HANDLE31_HIGHTAG;
311
}
312
313
const jint NUM_ARGS = 4;
314
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jint };
315
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz, (uint64_t)methods64, nMethods };
316
jint returnValue = NULL;
317
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, RegisterNatives);
318
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
319
320
free(methods64);
321
return returnValue;
322
}
323
324
jint JNICALL
325
UnregisterNatives(JNIEnv *env, jclass clazz)
326
{
327
const jint NUM_ARGS = 2;
328
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jclass };
329
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), clazz };
330
jint returnValue = NULL;
331
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, UnregisterNatives);
332
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
333
return returnValue;
334
}
335
336
void JNICALL
337
GetStringRegion(JNIEnv *env, jstring str, jsize start, jsize len, jchar *buf)
338
{
339
const jint NUM_ARGS = 5;
340
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_jsize, CEL4RO64_type_jsize, CEL4RO64_type_uint32_ptr };
341
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), str, start, len, (uint64_t)buf };
342
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStringRegion);
343
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
344
return;
345
}
346
347
void JNICALL
348
GetStringUTFRegion(JNIEnv *env, jstring str, jsize start, jsize len, char *buf)
349
{
350
const jint NUM_ARGS = 5;
351
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_jsize, CEL4RO64_type_jsize, CEL4RO64_type_uint32_ptr };
352
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), str, start, len, (uint64_t)buf };
353
FUNCTION_DESCRIPTOR_FROM_JNIENV31(env, GetStringUTFRegion);
354
j9_cel4ro64_call_function(functionDescriptor, argTypes, argValues, NUM_ARGS, CEL4RO64_type_void, NULL);
355
return;
356
}
357
358
jint JNICALL
359
GetStringPlatform(JNIEnv* env, jstring instr, char* outstr, jint outlen, const char* encoding)
360
{
361
const jint NUM_ARGS = 5;
362
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_uint32_ptr, CEL4RO64_type_jint, CEL4RO64_type_uint32_ptr };
363
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), instr, (uint64_t)outstr, outlen, (uint64_t)encoding };
364
jint returnValue = NULL;
365
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
366
LIBJVM_NAME, "GetStringPlatform",
367
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
368
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
369
fprintf(stderr, "GetStringPlatform failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
370
return JNI_ERR;
371
}
372
return returnValue;
373
}
374
375
jint JNICALL
376
GetStringPlatformLength(JNIEnv* env, jstring instr, jint* outlen, const char* encoding)
377
{
378
const jint NUM_ARGS = 4;
379
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_jstring, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr };
380
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), instr, (uint64_t)outlen, (uint64_t)encoding };
381
jint returnValue = NULL;
382
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
383
LIBJVM_NAME, "GetStringPlatformLength",
384
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
385
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
386
fprintf(stderr, "GetStringPlatformLength failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
387
return JNI_ERR;
388
}
389
return returnValue;
390
}
391
392
jint JNICALL
393
NewStringPlatform(JNIEnv* env, const char* instr, jstring* outstr, const char* encoding)
394
{
395
const jint NUM_ARGS = 4;
396
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr, CEL4RO64_type_uint32_ptr };
397
uint64_t argValues[NUM_ARGS] = { JNIENV64_FROM_JNIENV31(env), (uint64_t)instr, (uint64_t)outstr, (uint64_t)encoding };
398
jint returnValue = NULL;
399
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
400
LIBJVM_NAME, "NewStringPlatform",
401
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
402
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
403
fprintf(stderr, "NewStringPlatform failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
404
return JNI_ERR;
405
}
406
return returnValue;
407
}
408
409