// jni-libjvm.cc - an implementation of the JNI invocation API. /* Copyright (C) 2006 Free Software Foundation This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ #include #include #include #include #include using namespace gcj; // Forward declarations. extern struct JNIInvokeInterface_ _Jv_JNI_InvokeFunctions; extern jint JNICALL _Jv_JNI_AttachCurrentThread (JavaVM *vm, void **penv, void *args); extern JavaVM *_Jv_the_vm; jint JNICALL JNI_GetDefaultJavaVMInitArgs (void *args) { jint version = * (jint *) args; // Here we only support 1.2 and 1.4. if (version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4) return JNI_EVERSION; JavaVMInitArgs *ia = reinterpret_cast (args); ia->version = JNI_VERSION_1_4; ia->nOptions = 0; ia->options = NULL; ia->ignoreUnrecognized = true; return 0; } jint JNICALL JNI_CreateJavaVM (JavaVM **vm, void **penv, void *args) { JvAssert (! _Jv_the_vm); jint version = * (jint *) args; // We only support 1.2 and 1.4. if (version != JNI_VERSION_1_2 && version != JNI_VERSION_1_4) return JNI_EVERSION; JvVMInitArgs* vm_args = reinterpret_cast (args); jint result = _Jv_CreateJavaVM (vm_args); if (result) return result; // FIXME: synchronize JavaVM *nvm = (JavaVM *) _Jv_MallocUnchecked (sizeof (JavaVM)); if (nvm == NULL) return JNI_ERR; nvm->functions = &_Jv_JNI_InvokeFunctions; jint r =_Jv_JNI_AttachCurrentThread (nvm, penv, NULL); if (r < 0) return r; _Jv_the_vm = nvm; *vm = _Jv_the_vm; return 0; } jint JNICALL JNI_GetCreatedJavaVMs (JavaVM **vm_buffer, jsize buf_len, jsize *n_vms) { if (buf_len <= 0) return JNI_ERR; // We only support a single VM. if (_Jv_the_vm != NULL) { vm_buffer[0] = _Jv_the_vm; *n_vms = 1; } else *n_vms = 0; return 0; }