#include "j9vm31.h"
#include "omrcomp.h"
extern "C" {
static JavaVM31* globalRootJavaVM31 = NULL;
static void initializeJavaVM31(JavaVM31 * JavaVM31, jlong JavaVM64);
static void freeJavaVM31(JavaVM31 * JavaVM31);
struct JNIInvokeInterface_ EsJNIInvokeFunctions = {
NULL,
NULL,
NULL,
DestroyJavaVM,
AttachCurrentThread,
DetachCurrentThread,
GetEnv,
AttachCurrentThreadAsDaemon,
};
jint JNICALL
JNI_GetDefaultJavaVMInitArgs(void * vm_args)
{
JavaVMInitArgs *javaInitArgs = ((JavaVMInitArgs *) vm_args);
if (NULL != javaInitArgs) {
javaInitArgs->reservedOptionsPadding = NULL;
javaInitArgs->reservedAlignmentPadding = NULL;
for (int32_t i = 0; i < javaInitArgs->nOptions; i++) {
javaInitArgs->options[i].reservedOptionStringPadding = NULL;
javaInitArgs->options[i].reservedExtraInfoPadding = NULL;
}
}
const jint NUM_ARGS = 1;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_uint32_ptr };
uint64_t argValues[NUM_ARGS] = { (uint64_t)vm_args };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJVM_NAME, "JNI_GetDefaultJavaVMInitArgs",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "JNI_GetDefaultJavaVMInitArgs failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
return JNI_ERR;
}
return returnValue;
}
jint JNICALL
JNI_CreateJavaVM(JavaVM **pvm, void **penv, void *vm_args)
{
uint64_t JavaVM64Result = 0;
uint64_t JNIEnv64Result = 0;
JavaVMInitArgs *javaInitArgs = ((JavaVMInitArgs *) vm_args);
if (NULL != javaInitArgs) {
javaInitArgs->reservedOptionsPadding = NULL;
javaInitArgs->reservedAlignmentPadding = NULL;
for (int32_t i = 0; i < javaInitArgs->nOptions; i++) {
javaInitArgs->options[i].reservedOptionStringPadding = NULL;
javaInitArgs->options[i].reservedExtraInfoPadding = NULL;
if (NULL != javaInitArgs->options[i].extraInfo) {
char *optionString = javaInitArgs->options[i].optionString;
if (NULL != optionString)
#pragma convert(1208)
if (0 == strncmp(optionString, "abort", strlen("abort"))) {
javaInitArgs->options[i].reservedExtraInfoPadding = (void *)HANDLE31_HIGHTAG;
} else if (0 == strncmp(optionString, "exit", strlen("exit"))) {
javaInitArgs->options[i].reservedExtraInfoPadding = (void *)HANDLE31_HIGHTAG;
} else if (0 == strncmp(optionString, "vfprintf", strlen("vfprintf"))) {
javaInitArgs->options[i].reservedExtraInfoPadding = (void *)HANDLE31_HIGHTAG;
}
#pragma convert(pop)
}
}
}
const jint NUM_ARGS = 3;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JavaVM64, CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
uint64_t argValues[NUM_ARGS] = { (uint64_t)&JavaVM64Result, (uint64_t)&JNIEnv64Result, (uint64_t)vm_args };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJVM_NAME, "JNI_CreateJavaVM",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "JNI_CreateJavaVM failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
return JNI_ERR;
}
if (JNI_OK == returnValue) {
JavaVM31* javaVM31 = getJavaVM31(JavaVM64Result);
*pvm = (JavaVM*) javaVM31;
JNIEnv31* jniEnv31 = getJNIEnv31(JNIEnv64Result);
*penv = (JNIEnv*) jniEnv31;
jniEnv31->javaVM31 = javaVM31;
}
return returnValue;
}
jint JNICALL
JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs)
{
const jint NUM_ARGS = 3;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_uint32_ptr, CEL4RO64_type_jsize, CEL4RO64_type_uint32_ptr };
uint64_t *tempJavaVM64Buffer = (uint64_t *)malloc(sizeof(jlong) * bufLen);
if (NULL == tempJavaVM64Buffer) {
return JNI_ERR;
}
uint64_t argValues[NUM_ARGS] = { (uint64_t)tempJavaVM64Buffer, bufLen, (uint64_t)nVMs };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJVM_NAME, "JNI_GetCreatedJavaVMs",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "JNI_GetCreatedJavaVMs failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
returnValue = JNI_ERR;
}
if (JNI_OK == returnValue) {
for (int32_t i = 0; i < *nVMs; i++) {
vmBuf[i] = (JavaVM*)getJavaVM31(tempJavaVM64Buffer[i]);
}
}
free(tempJavaVM64Buffer);
return returnValue;
}
jint JNICALL
DestroyJavaVM(JavaVM *vm)
{
const jint NUM_ARGS = 1;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JavaVM64 };
uint64_t argValues[NUM_ARGS] = { JAVAVM64_FROM_JAVAVM31(vm)};
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJ9VM29_NAME, "DestroyJavaVM",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "DestroyJavaVM failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
returnValue = JNI_ERR;
}
if (JNI_OK == returnValue) {
freeJavaVM31((JavaVM31 *)vm);
}
return returnValue;
}
jint JNICALL
AttachCurrentThread(JavaVM *vm, void **penv, void *args)
{
const jint NUM_ARGS = 3;
uint64_t JNIEnv64Result = 0;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JavaVM64, CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
uint64_t argValues[NUM_ARGS] = { JAVAVM64_FROM_JAVAVM31(vm), (uint64_t)&JNIEnv64Result, (uint64_t)args };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = J9_CEL4RO64_RETCODE_OK;
JavaVMAttachArgs *vmAttachArgs = ((JavaVMAttachArgs *) args);
if (NULL != vmAttachArgs) {
vmAttachArgs->reservedNamePadding = NULL;
}
cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJ9VM29_NAME, "AttachCurrentThread",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "AttachCurrentThread failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
return JNI_ERR;
}
if (JNI_OK == returnValue) {
JNIEnv31* jniEnv31 = getJNIEnv31(JNIEnv64Result);
jniEnv31->javaVM31 = (JavaVM31 *)vm;
*penv = (JavaVM *)jniEnv31;
}
return returnValue;
}
jint JNICALL
DetachCurrentThread(JavaVM *vm) {
const jint NUM_ARGS = 1;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JavaVM64 };
uint64_t argValues[NUM_ARGS] = { JAVAVM64_FROM_JAVAVM31(vm) };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJ9VM29_NAME, "DetachCurrentThread",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "DetachCurrentThread failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
return JNI_ERR;
}
return returnValue;
}
jint JNICALL
GetEnv(JavaVM *vm, void **penv, jint version)
{
const jint NUM_ARGS = 3;
uint64_t JNIEnv64Result = 0;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JavaVM64, CEL4RO64_type_JNIEnv64, CEL4RO64_type_jint };
uint64_t argValues[NUM_ARGS] = { JAVAVM64_FROM_JAVAVM31(vm), (uint64_t)&JNIEnv64Result, version };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJ9VM29_NAME, "GetEnv",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "GetEnv failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
return JNI_ERR;
}
if (JNI_OK == returnValue) {
JNIEnv31* jniEnv31 = getJNIEnv31(JNIEnv64Result);
jniEnv31->javaVM31 = (JavaVM31 *)vm;
*penv = (JavaVM *)jniEnv31;
}
return returnValue;
}
jint JNICALL
AttachCurrentThreadAsDaemon(JavaVM *vm, void **penv, void *args)
{
const jint NUM_ARGS = 3;
uint64_t JNIEnv64Result = 0;
J9_CEL4RO64_ArgType argTypes[NUM_ARGS] = { CEL4RO64_type_JavaVM64, CEL4RO64_type_JNIEnv64, CEL4RO64_type_uint32_ptr };
uint64_t argValues[NUM_ARGS] = { JAVAVM64_FROM_JAVAVM31(vm), (uint64_t)&JNIEnv64Result, (uint64_t)args };
jint returnValue = JNI_ERR;
uint32_t cel4ro64ReturnCode = J9_CEL4RO64_RETCODE_OK;
JavaVMAttachArgs *vmAttachArgs = ((JavaVMAttachArgs *) args);
if (NULL != vmAttachArgs) {
vmAttachArgs->reservedNamePadding = NULL;
}
cel4ro64ReturnCode = j9_cel4ro64_load_query_call_function(
LIBJ9VM29_NAME, "AttachCurrentThreadAsDaemon",
argTypes, argValues, NUM_ARGS, CEL4RO64_type_jint, &returnValue);
if (J9_CEL4RO64_RETCODE_OK != cel4ro64ReturnCode) {
fprintf(stderr, "AttachCurrentThreadAsDaemon failed. CEL4RO64 rc: %d - %s\n", cel4ro64ReturnCode, j9_cel4ro64_get_error_message(cel4ro64ReturnCode));
return JNI_ERR;
}
if (JNI_OK == returnValue) {
JNIEnv31* jniEnv31 = getJNIEnv31(JNIEnv64Result);
jniEnv31->javaVM31 = (JavaVM31 *)vm;
*penv = (JavaVM *)jniEnv31;
}
return returnValue;
}
JavaVM31 * JNICALL
getJavaVM31(uint64_t javaVM64)
{
for (JavaVM31 *curJavaVM31 = globalRootJavaVM31; curJavaVM31 != NULL; curJavaVM31 = curJavaVM31->next) {
if (javaVM64 == curJavaVM31->javaVM64) {
return curJavaVM31;
}
}
JavaVM31 *newJavaVM31 = (JavaVM31 *)malloc(sizeof(JavaVM31));
if (NULL != newJavaVM31) {
initializeJavaVM31(newJavaVM31, javaVM64);
}
return newJavaVM31;
}
static void
initializeJavaVM31(JavaVM31 * javaVM31, jlong javaVM64)
{
javaVM31->functions = (JNIInvokeInterface_ *)GLOBAL_TABLE(EsJNIInvokeFunctions);
javaVM31->javaVM64 = javaVM64;
javaVM31->next = globalRootJavaVM31;
globalRootJavaVM31 = javaVM31;
}
static void
freeJavaVM31(JavaVM31 * javaVM31ToFree)
{
JavaVM31 *currentJavaVM31 = globalRootJavaVM31;
if (currentJavaVM31 == javaVM31ToFree) {
globalRootJavaVM31 = currentJavaVM31->next;
} else {
while (NULL != currentJavaVM31) {
JavaVM31 *next = currentJavaVM31->next;
if (next == javaVM31ToFree) {
currentJavaVM31->next = next->next;
break;
}
currentJavaVM31 = next;
}
}
free(javaVM31ToFree);
}
}