Esempio n. 1
0
        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 }].");
                }
            }
        }
Esempio n. 2
0
        public static JavaVMInitArgs create(int version)
        {
            global::System.IntPtr cPtr = JNIPINVOKE.JavaVMInitArgs_create__SWIG_0(version);
            JavaVMInitArgs        ret  = (cPtr == global::System.IntPtr.Zero) ? null : new JavaVMInitArgs(cPtr, false);

            return(ret);
        }
Esempio n. 3
0
        public static JNetVirtualMachine Initialize(JNetConfiguration configuration)
        {
            configuration = configuration ?? new JNetConfiguration();

            lock (instanceSync)
            {
                var options = configuration.BuildOptions();

                JVMLib.Load(configuration);

                JavaVMInitArgs vm_args = new JavaVMInitArgs();
                vm_args.SetOptions(options.ToArray());
                vm_args.version            = (int)configuration.JNIVersion;
                vm_args.ignoreUnrecognized = true; // invalid options make the JVM init fail

                var p_vmArgs = Marshal.AllocCoTaskMem(Marshal.SizeOf <JavaVMInitArgs>());
                Marshal.StructureToPtr(vm_args, p_vmArgs, false);

                JavaVM *vm;
                JNIEnv *env;

                var ret = JVMLib.JNI_CreateJavaVM(&vm, (void **)&env, (void *)p_vmArgs);

                vm_args.ReleaseOptions();
                Marshal.FreeCoTaskMem(p_vmArgs);

                JNIResultException.Check(ret);

                return(Boot(configuration.Bootstrap, vm, env));
            }
        }
Esempio n. 4
0
        public void TestMethod1()
        {
            Setup();

            // NO FUNCIONA... ?????

            JavaVMOption options = new JavaVMOption();

            //options.optionString = $@"-Djava.class.path={jdkPath}";
            options.optionString = "";

            JavaVMInitArgs vm_args = JavaVMInitArgs.create(JNI.JNI_VERSION_1_8, 1);

            vm_args.set(0, options);

            int flags;

            Ref_JavaVM refJavaVM = new Ref_JavaVM();
            Ref_JNIEnv refJNIEnv = new Ref_JNIEnv();

            flags = JavaVM.CreateJavaVM(refJavaVM, refJNIEnv, vm_args);
            if (flags == JNI.JNI_ERR)
            {
                String msg = "Error creando la maquina virtual";
                Debug.WriteLine(msg);
                throw new Exception(msg);
            }
            JNIEnv jniEnv = refJNIEnv.getValue();

            JClass clazz = jniEnv.FindClass("java/lang/Object");

            Debug.WriteLine("Class " + clazz);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
    static void CreateJavaVM(out IntPtr jvm, out IntPtr jnienv)
    {
        var args = new JavaVMInitArgs()
        {
            version            = JniVersion.v1_6,
            nOptions           = 0,
            ignoreUnrecognized = (byte)1,
        };
        int r = JNI_CreateJavaVM(out jvm, out jnienv, ref args);

        if (r != 0)
        {
            throw new InvalidOperationException("JNI_CreateJavaVM returned: " + r);
        }
    }
Esempio n. 7
0
        internal int AttachCurrentThread(out JavaEnvironment env, JavaVMInitArgs?args = null)
        {
            IntPtr envPointer;
            IntPtr result;

            if (args.HasValue)
            {
                JavaVMInitArgs initArgs = args.Value;
                result = this.JVM.AttachCurrentThread(out envPointer, &initArgs);
            }
            else
            {
                result = this.JVM.AttachCurrentThread(out envPointer, null);
            }

            env = new JavaEnvironment(envPointer);
            return(result.ToInt32());
        }
Esempio n. 8
0
        public void TestMethod1()
        {
            Setup();

            es.jni.JavaVMOption options = new JavaVMOption();
            //options.optionString = $@"-Djava.class.path={jdkPath}";
            options.optionString = "";

            JavaVMInitArgs vm_args = JavaVMInitArgs.create(JNI.JNI_VERSION_1_8, 1);

            vm_args.set(0, options);

            int flags;

            Ref_JavaVM refJavaVM = new Ref_JavaVM();
            Ref_JNIEnv refJNIEnv = new Ref_JNIEnv();

            flags = JavaVM.CreateJavaVM(refJavaVM, refJNIEnv, vm_args);
            if (flags == JNI.JNI_ERR)
            {
                String msg = "Error creando la maquina virtual";
                Debug.WriteLine(msg);
                throw new Exception(msg);
            }
            JavaVM javaVM = refJavaVM.getValue();
            JNIEnv jniEnv = refJNIEnv.getValue();

            JClass jclazz = jniEnv.FindClass("java/lang/Object");

            Debug.WriteLine("jclazz " + jclazz);

            GC(jniEnv);

            JMethodID jinit     = jniEnv.GetMethodID(jclazz, "<init>", "()V");
            JObject   jinstance = jniEnv.NewObject(jclazz, jinit, new JValue[0]);

            JObject jref = jniEnv.NewGlobalRef(jinstance);

            Test(jniEnv, jclazz);

            jniEnv.DeleteLocalRef(jclazz);
        }
Esempio n. 9
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(JavaVMInitArgs obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
Esempio n. 10
0
 static extern int JNI_CreateJavaVM(out IntPtr javavm, out IntPtr jnienv, ref JavaVMInitArgs args);
Esempio n. 11
0
 public static extern int JNI_CreateJavaVM(ref IntPtr vm, ref IntPtr env, ref JavaVMInitArgs args);
Esempio n. 12
0
        /// <summary>
        /// Sets up all required JVM initialization arguments.
        /// </summary>
        /// <returns>A filled JavaVMInitArgs that can be used to create a JVM.</returns>
        private JavaVMInitArgs CreateInitializationArguments()
        {
            Logger.Log(Resources.LogCreateInitializationArguments);

            JavaVMInitArgs args = new JavaVMInitArgs();

            args.Version = (int)JNIVersion.JNI_VERSION_1_4;
            args.IgnoreUnrecognized = 0x01;
            args.OptionCount = 0;

            //// TODO: set OptionCount and Options!

            //// args.Options = 0;

            return args;
        }
Esempio n. 13
0
        /// <summary>
        /// Creates a JVM.
        /// </summary>
        /// <param name="initArgs">Initialization arguments for the JVM.</param>
        private unsafe void CreateJavaVirtualMachine(JavaVMInitArgs initArgs)
        {
            Logger.Log(Resources.LogCreateJavaVirtualMachine);

            IntPtr env;
            IntPtr jvm;

            JniResult result = this.createJavaVm(out jvm, out env, &initArgs);
            if (result != JniResult.Ok)
                throw new MajalaException(string.Format(CultureInfo.CurrentCulture, Resources.ErrorCreatingJVM, result));

            this.env = new JniEnv(env);
            this.jvm = new JavaVM(jvm);
        }
Esempio n. 14
0
        /// <summary>
        /// Create the Java VM and wrap it.
        /// </summary>
        /// <param name="jvmDllPath">(Optional) Path to jvm.dll where we'll load the JNI library. If not provided we'll try to infer its location from the Java install path.</param>
        /// <param name="attemptVmReuse">
        /// This is an annoying workaround to a fundamental JNI problem: you can't host a JVM within the process again once you've hosted it once
        /// (ever, even if you destroy the first one). So if this flag is <c>true</c>, we'll attempt to find an existing JVM in the process and use that
        /// if available, and we won't destroy the JVM on dispose so subsequent constructions of this object will succeed.
        /// The downside of reuse of course is that if we're reusing it then we won't be able to construct it with fresh arguments.
        /// </param>
        internal JniWrapper(string jvmDllPath, bool attemptVmReuse, IEnumerable <JavaOption> options)
        {
            _currentThreadEnv = new ThreadLocal <IntPtr>(() =>
            {
                IntPtr ret;
                unsafe
                {
                    if (_vm.GetDelegate <GetEnv>()(_vmP, (IntPtr)(&ret), _jniVersion) == -2)
                    {
                        _vm.GetDelegate <AttachCurrentThread>()(_vmP, (IntPtr)(&ret), IntPtr.Zero);
                    }
                    return(ret);
                }
            });
            if (String.IsNullOrEmpty(jvmDllPath))
            {
                string javaHome = GetJavaInstallationPath();
                _vmDll = Path.Combine(javaHome, "bin", "server", "jvm.dll");
            }
            else
            {
                _vmDll = jvmDllPath;
            }
            if (!File.Exists(_vmDll))
            {
                throw new InvalidOperationException("Couldn't find the runtime library for Java at: " + _vmDll);
            }
            IntPtr envP;
            IntPtr vmP;

            _vmDllModule = LoadLibrary(_vmDll);
            if (_vmDllModule == IntPtr.Zero)
            {
                throw new Win32Exception();
            }
            if (attemptVmReuse)
            {
                _vmReuse = true;
                int numVms;
                unsafe
                {
                    ThrowOnBadResult(GetDelegateFromJni <GetCreatedJavaVMs>("JNI_GetCreatedJavaVMs")(&vmP, 1, out numVms), "GetCreatedJavaVMs");
                    if (numVms >= 1)
                    {
                        _vmP = vmP;
                        _vm  = (JavaVM)Marshal.PtrToStructure(vmP, typeof(JavaVM));
                        ThrowOnBadResult(_vm.GetDelegate <AttachCurrentThread>()(_vmP, (IntPtr)(&envP), IntPtr.Zero), "AttachCurrentThread");
                        _envP = envP;
                        _env  = (JniEnv)Marshal.PtrToStructure(envP, typeof(JniEnv));
                        return;
                    }
                }
            }
            JavaVMInitArgs vmArgs = new JavaVMInitArgs();

            GetDelegateFromJni <GetDefaultJavaVMInitArgs>("JNI_GetDefaultJavaVMInitArgs")(ref vmArgs);
            vmArgs.Version   = _jniVersion;
            vmArgs._nOptions = options.Count();
            vmArgs._options  = Marshal.AllocHGlobal(vmArgs._nOptions * Marshal.SizeOf(typeof(JavaVMOption)));
            IntPtr vmArgsP = Marshal.AllocHGlobal(Marshal.SizeOf(vmArgs));

            try
            {
                int optionsLocation = 0;
                foreach (JavaOption currentOption in options)
                {
                    Marshal.StructureToPtr(currentOption.ActualOption, vmArgs._options + optionsLocation * Marshal.SizeOf(typeof(JavaVMOption)), false);
                    optionsLocation++;
                }
                Marshal.StructureToPtr(vmArgs, vmArgsP, false);
                unsafe
                {
                    ThrowOnBadResult(GetDelegateFromJni <CreateJavaVM>("JNI_CreateJavaVM")(&vmP, &envP, vmArgsP), "CreateJavaVM");
                    _vm   = (JavaVM)Marshal.PtrToStructure(vmP, typeof(JavaVM));
                    _env  = (JniEnv)Marshal.PtrToStructure(envP, typeof(JniEnv));
                    _envP = envP;
                    _vmP  = vmP;
                }
            }
            finally
            {
                Marshal.DestroyStructure(vmArgsP, typeof(JavaVMInitArgs));
                Marshal.FreeHGlobal(vmArgsP);
                Marshal.FreeHGlobal(vmArgs._options);
            }
        }
Esempio n. 15
0
        public static int CreateJavaVM(Ref_JavaVM refvm, Ref_JNIEnv refenv, JavaVMInitArgs args)
        {
            int ret = JNIPINVOKE.JavaVM_CreateJavaVM(Ref_JavaVM.getCPtr(refvm), Ref_JNIEnv.getCPtr(refenv), JavaVMInitArgs.getCPtr(args));

            return(ret);
        }
Esempio n. 16
0
        public static int GetDefaultJavaVMInitArgs(JavaVMInitArgs args)
        {
            int ret = JNIPINVOKE.JavaVM_GetDefaultJavaVMInitArgs(JavaVMInitArgs.getCPtr(args));

            return(ret);
        }
Esempio n. 17
0
        public static void Attach(int pid, string path, string arguments = "")
        {
            IntPtr vm = IntPtr.Zero, env = IntPtr.Zero;

            JavaVMInitArgs args = new JavaVMInitArgs();

            args.version  = 0x00010008;
            args.nOptions = 0;

            int result = JNI_CreateJavaVM(ref vm, ref env, ref args);

            Console.WriteLine("result " + result);


            IntPtr real      = Marshal.ReadIntPtr(env);
            IntPtr function  = Marshal.ReadIntPtr(real, 668);
            IntPtr functionL = Marshal.ReadIntPtr(real, 656);

            IntPtr realVmStruct = Marshal.ReadIntPtr(vm);


            StringDelegate  newStringUTF   = Marshal.GetDelegateForFunctionPointer <StringDelegate>(function);
            GetStringLength stringLen      = Marshal.GetDelegateForFunctionPointer <GetStringLength>(functionL);
            ExceptionCheck  checkException = Marshal.GetDelegateForFunctionPointer <ExceptionCheck>(Marshal.ReadIntPtr(real, 912));

            ExceptionDescribe printException = Marshal.GetDelegateForFunctionPointer <ExceptionDescribe>(Marshal.ReadIntPtr(real, 64));

            NewObjectArray newObjectArray = Marshal.GetDelegateForFunctionPointer <NewObjectArray>(Marshal.ReadIntPtr(real, 688));
            FindClass      findClass      = Marshal.GetDelegateForFunctionPointer <FindClass>(Marshal.ReadIntPtr(real, 24));

            SetArray setArray = Marshal.GetDelegateForFunctionPointer <SetArray>(Marshal.ReadIntPtr(real, 696));

            DestroyJavaVM destroyVM = Marshal.GetDelegateForFunctionPointer <DestroyJavaVM>(Marshal.ReadIntPtr(realVmStruct, 12));

            //attach api start

            Java_sun_tools_attach_WindowsVirtualMachine_init(env, IntPtr.Zero);
            IntPtr stub = Java_sun_tools_attach_WindowsVirtualMachine_generateStub(env, IntPtr.Zero);

            long process = Java_sun_tools_attach_WindowsVirtualMachine_openProcess(env, IntPtr.Zero, pid);

            Console.WriteLine("exception " + checkException(env));


            IntPtr cmd      = newStringUTF(env, "load");
            IntPtr pipeName = newStringUTF(env, "\\\\.\\pipe\\javatool22");

            IntPtr pathJStr       = newStringUTF(env, path);
            IntPtr unknownBoolean = newStringUTF(env, "true");
            IntPtr argumentsJ     = newStringUTF(env, arguments);

            Console.WriteLine("exception " + checkException(env));


            IntPtr clazz = findClass(env, "java/lang/String");

            IntPtr array = newObjectArray(env, 3, clazz, IntPtr.Zero);

            setArray(env, array, 0, pathJStr);
            setArray(env, array, 1, unknownBoolean);
            setArray(env, array, 2, argumentsJ);



            Java_sun_tools_attach_WindowsVirtualMachine_enqueue(env, IntPtr.Zero,
                                                                process, stub, cmd, pipeName, array);

            Console.WriteLine("exception " + checkException(env));
            printException(env);


            /*
             *
             * var pipe = new NamedPipeServerStream("javatool22");
             * pipe.WaitForConnection();
             * BinaryReader reader = new BinaryReader(pipe);
             * char callback = reader.ReadChar();
             *
             *
             * Console.WriteLine("pipe result " + callback);
             */

            Java_sun_tools_attach_WindowsVirtualMachine_closeProcess(env, IntPtr.Zero, process);


            int rr = destroyVM(vm);

            Console.WriteLine("destroyed vm: " + result);
        }