public static unsafe IntPtr CreateJavaVm(IEnumerable<string> jvmOptions, JvmHooks jvmHooks) { Debug.Assert(jvmOptions != null); Debug.Assert(jvmHooks != null); var initArgs = GetJavaVmInitArgs(jvmOptions.EmptyIfNull().ToArray(), jvmHooks); try { IntPtr jvmPtr; IntPtr envPtr; var result = JniApiImport.JNI_CreateJavaVM(out jvmPtr, out envPtr, &initArgs); WrapperHelpers.VerifyJniResult(result); return jvmPtr; } finally { ReleaseJavaVmInitArgs(initArgs); } }
private static unsafe JavaVmInitArgs GetJavaVmInitArgs(string[] jvmOptions, JvmHooks jvmHooks) { var initArgs = default(JavaVmInitArgs); initArgs.version = (int)PreferredJniVersion; initArgs.ignoreUnrecognized = JniBooleanValue.True; var nativeJvmOptions = new JavaVmOption[jvmOptions.Length + 3]; //exit nativeJvmOptions[0].optionString = Marshal.StringToHGlobalAnsi("exit"); JniHooksSig.Exit exitHook = jvmHooks.GetExitHook(); if (exitHook != null) nativeJvmOptions[0].extraInfo = Marshal.GetFunctionPointerForDelegate(exitHook); else nativeJvmOptions[0].extraInfo = DefaultExitHookPtr; //abort nativeJvmOptions[1].optionString = Marshal.StringToHGlobalAnsi("abort"); JniHooksSig.Abort abortHook = jvmHooks.GetAbortHook(); if (abortHook != null) nativeJvmOptions[1].extraInfo = Marshal.GetFunctionPointerForDelegate(abortHook); else nativeJvmOptions[1].extraInfo = DefaultAbortHookPtr; //vfprintf nativeJvmOptions[2].optionString = Marshal.StringToHGlobalAnsi("vfprintf"); nativeJvmOptions[2].extraInfo = DefaultVfprintfHookPtr; for (var i = 0; i < jvmOptions.Length; i++) nativeJvmOptions[i + 3].optionString = Marshal.StringToHGlobalAnsi(jvmOptions[i]); //TODO: review fixed statement fixed (JavaVmOption* ptr = &nativeJvmOptions[0]) { initArgs.options = ptr; initArgs.nOptions = nativeJvmOptions.Length; } return initArgs; }