private void AttachToExistingJVM(JavaVMInitArgs jvmInitArgs) { int virtualMachines; IntPtr javaVM; int result = JNINativeImports.JNI_GetCreatedJavaVMs(out javaVM, 1, out virtualMachines); if (result != JNIConstants.JNI_OK) { throw new InvalidOperationException($"Error when creating Java Virtual Machine. [JNI_GetCreatedJavaVMs -> Return code: { result }]."); } if (virtualMachines > 0) { this.JavaEnvironment.VirtualMachine = new JavaVM(javaVM); JavaEnvironment env; result = this.JavaEnvironment.VirtualMachine.AttachCurrentThread(out env, jvmInitArgs); this.JavaEnvironment = env; if (result != JNIConstants.JNI_OK) { throw new InvalidOperationException($"Error when creating Java Virtual Machine. [AttachCurrentThread -> Return code: { result }]."); } } }
/// <summary> /// Loads Java Environment and Virtual Machine. /// </summary> /// <param name="path"> On Windows: Path to jvm.dll file. </param> /// <param name="parameters"> Optional arguments for virtual machine. </param> /// <param name="jniVersion"> Correct JNI version. See: <see cref="JNIConstants"/>. </param> /// <param name="attachToExistingJVM"></param> public void Load(string path, IDictionary <string, string> parameters = null, int jniVersion = JNIConstants.JNI_VERSION_1_8, bool attachToExistingJVM = false) { if (string.IsNullOrEmpty(path) || !File.Exists(path)) { throw new ArgumentException("You must specify the correct location of JVM library.", "path"); } // Set the working directory to directory with JVM library. Directory.SetCurrentDirectory(Path.GetDirectoryName(path)); var jvmInitArgs = new JavaVMInitArgs { version = jniVersion, ignoreUnrecognized = JavaConverter.ToByte(true) }; if (parameters != null && parameters.Count > 0) { jvmInitArgs.nOptions = parameters.Count; var options = new List <JavaVMOption>(); foreach (var kvp in parameters) { options.Add(new JavaVMOption { optionString = Marshal.StringToHGlobalAnsi($"{ kvp.Key }={ kvp.Value }") }); } JavaVMOption[] parsedOptions = options.ToArray(); fixed(JavaVMOption *a = &parsedOptions[0]) { jvmInitArgs.options = a; } } if (!attachToExistingJVM) { IntPtr environment; IntPtr javaVM; int result = JNINativeImports.JNI_CreateJavaVM(out javaVM, out environment, &jvmInitArgs); if (result != JNIConstants.JNI_OK) { throw new InvalidOperationException($"Error when creating Java Virtual Machine. [JNI_CreateJavaVM -> Return code: { result }]."); } this.JavaEnvironment = new JavaEnvironment(environment); this.JavaEnvironment.VirtualMachine = new JavaVM(javaVM); } else { this.AttachToExistingJVM(jvmInitArgs); } this.Gateway = new GatewayManager(this); }