| // 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 <gcj/cni.h> |
| #include <gcj/javaprims.h> |
| #include <java-assert.h> |
| #include <jvm.h> |
| #include <jni.h> |
| |
| 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<JavaVMInitArgs *> (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<JvVMInitArgs *> (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; |
| } |