mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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;
 | |
| }
 |