Ejemplo n.º 1
0
        static JavaClassInfo()
        {
            CreatePeerMembers = (Func <string, Type, JniPeerMembers>) typeof(JniPeerMembers)
                                .GetTypeInfo()
                                .GetDeclaredMethod("CreatePeerMembers")
                                .CreateDelegate(typeof(Func <string, Type, JniPeerMembers>));
            if (CreatePeerMembers == null)
            {
                throw new NotSupportedException("Could not find JniPeerMembers.CreatePeerMembers!");
            }

            using (var t = new JniType("java/lang/Class")) {
                Class_getConstructors = t.GetInstanceMethod("getConstructors", "()[Ljava/lang/reflect/Constructor;");
                Class_getFields       = t.GetInstanceMethod("getFields", "()[Ljava/lang/reflect/Field;");
                Class_getMethods      = t.GetInstanceMethod("getMethods", "()[Ljava/lang/reflect/Method;");
            }
            using (var t = new JniType("java/lang/reflect/Constructor")) {
                Constructor_getParameterTypes = t.GetInstanceMethod("getParameterTypes", "()[Ljava/lang/Class;");
            }
            using (var t = new JniType("java/lang/reflect/Field")) {
                Field_getName = t.GetInstanceMethod("getName", "()Ljava/lang/String;");
                Field_getType = t.GetInstanceMethod("getType", "()Ljava/lang/Class;");
            }
            using (var t = new JniType("java/lang/reflect/Method")) {
                Method_getName           = t.GetInstanceMethod("getName", "()Ljava/lang/String;");
                Method_getParameterTypes = t.GetInstanceMethod("getParameterTypes", "()[Ljava/lang/Class;");
                Method_getReturnType     = t.GetInstanceMethod("getReturnType", "()Ljava/lang/Class;");
            }
            using (var t = new JniType("java/lang/reflect/Member")) {
                Member_getModifiers = t.GetInstanceMethod("getModifiers", "()I");
            }
        }
Ejemplo n.º 2
0
        public unsafe void Dispose_Exceptions()
        {
            var t = new JniType("java/lang/Object");

            t.Dispose();
            Assert.Throws <ObjectDisposedException> (() => t.AllocObject());
            Assert.Throws <ObjectDisposedException> (() => t.NewObject(null, null));
            Assert.Throws <ObjectDisposedException> (() => t.GetConstructor(null));
            Assert.Throws <ObjectDisposedException> (() => t.GetInstanceField(null, null));
            Assert.Throws <ObjectDisposedException> (() => t.GetInstanceMethod(null, null));
            Assert.Throws <ObjectDisposedException> (() => t.GetStaticField(null, null));
            Assert.Throws <ObjectDisposedException> (() => t.GetStaticMethod(null, null));
            Assert.Throws <ObjectDisposedException> (() => t.GetSuperclass());
            Assert.Throws <ObjectDisposedException> (() => t.IsAssignableFrom(null));
            Assert.Throws <ObjectDisposedException> (() => t.IsInstanceOfType(new JniObjectReference()));
            Assert.Throws <ObjectDisposedException> (() => t.RegisterWithRuntime());
            Assert.Throws <ObjectDisposedException> (() => t.RegisterNativeMethods(null));
            Assert.Throws <ObjectDisposedException> (() => t.UnregisterNativeMethods());

            JniFieldInfo jif = null;

            Assert.Throws <ObjectDisposedException> (() => t.GetCachedInstanceField(ref jif, null, null));
            JniMethodInfo jim = null;

            Assert.Throws <ObjectDisposedException> (() => t.GetCachedConstructor(ref jim, null));
            Assert.Throws <ObjectDisposedException> (() => t.GetCachedInstanceMethod(ref jim, null, null));
            JniFieldInfo jsf = null;

            Assert.Throws <ObjectDisposedException> (() => t.GetCachedStaticField(ref jsf, null, null));
            JniMethodInfo jsm = null;

            Assert.Throws <ObjectDisposedException> (() => t.GetCachedStaticMethod(ref jsm, null, null));
        }
Ejemplo n.º 3
0
        private static unsafe void TryExplicitlyCallJni()
        {
            Console.WriteLine("Part2: Check JNI Calls...");

            var vm = JniRuntime.CurrentRuntime;

            Console.WriteLine("# JniEnvironment.EnvironmentPointer={0}", JniEnvironment.EnvironmentPointer);
            Console.WriteLine("vm.SafeHandle={0}", vm.InvocationPointer);
            var t = new JniType("java/lang/Object");
            var c = t.GetConstructor("()V");
            var o = t.NewObject(c, null);
            var m = t.GetInstanceMethod("hashCode", "()I");
            int i = JniEnvironment.InstanceMethods.CallIntMethod(o, m);

            Console.WriteLine("java.lang.Object={0}", o);
            Console.WriteLine("hashcode={0}", i);
            JniObjectReference.Dispose(ref o);
            t.Dispose();

            // var o = JniTypes.FindClass ("java/lang/Object");

            /*
             * var waitForCreation = new CountdownEvent (1);
             * var exitThread = new CountdownEvent (1);
             * var t = new Thread (() => {
             *  var vm2 = new JavaVMBuilder ().CreateJavaVM ();
             *  waitForCreation.Signal ();
             *  exitThread.Wait ();
             * });
             * t.Start ();
             * waitForCreation.Wait ();
             */
        }
        public unsafe void CallNonvirtualVoidMethod_WithBaseMethodIDAndDerivedType()
        {
            using (var b = new JniType("com/xamarin/interop/CallNonvirtualBase"))
                using (var d = new JniType("com/xamarin/interop/CallNonvirtualDerived")) {
                    var m = b.GetInstanceMethod("method", "()V");
                    var f = b.GetInstanceField("methodInvoked", "Z");

                    var c = d.GetConstructor("()V");
                    var g = d.GetInstanceField("methodInvoked", "Z");
                    var o = d.NewObject(c, null);
                    try {
                        if (JavaVMFixture.CallNonvirtualVoidMethodSupportsDeclaringClassMismatch)
                        {
                            JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod(o, d.PeerReference, m);
                            Assert.IsFalse(JniEnvironment.InstanceFields.GetBooleanField(o, f));
                            Assert.IsTrue(JniEnvironment.InstanceFields.GetBooleanField(o, g));
                        }
                        else
                        {
                            JniEnvironment.InstanceMethods.CallNonvirtualVoidMethod(o, d.PeerReference, m);
                            Assert.IsTrue(JniEnvironment.InstanceFields.GetBooleanField(o, f));
                            Assert.IsFalse(JniEnvironment.InstanceFields.GetBooleanField(o, g));
                        }
                    } finally {
                        JniObjectReference.Dispose(ref o);
                    }
                }
        }
Ejemplo n.º 5
0
        public unsafe void Name()
        {
            using (var Object_class = new JniType("java/lang/Object"))
                using (var Class_class = new JniType("java/lang/Class"))
                    using (var Method_class = new JniType("java/lang/reflect/Method")) {
                        var Class_getMethod       = Class_class.GetInstanceMethod("getMethod", "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
                        var Method_getReturnType  = Method_class.GetInstanceMethod("getReturnType", "()Ljava/lang/Class;");
                        var hashCode_str          = JniEnvironment.Strings.NewString("hashCode");
                        var emptyArray            = JniEnvironment.Arrays.NewObjectArray(0, Class_class.PeerReference, new JniObjectReference());
                        var getHashcodeMethodArgs = stackalloc JniArgumentValue [2];
                        getHashcodeMethodArgs [0] = new JniArgumentValue(hashCode_str);
                        getHashcodeMethodArgs [1] = new JniArgumentValue(emptyArray);
                        var Object_hashCode    = JniEnvironment.InstanceMethods.CallObjectMethod(Object_class.PeerReference, Class_getMethod, getHashcodeMethodArgs);
                        var Object_hashCode_rt = JniEnvironment.InstanceMethods.CallObjectMethod(Object_hashCode, Method_getReturnType);
                        try {
                            Assert.AreEqual("java/lang/Object", Object_class.Name);

                            using (var t = new JniType(ref Object_hashCode_rt, JniObjectReferenceOptions.Copy))
                                Assert.AreEqual("I", t.Name);
                        } finally {
                            JniObjectReference.Dispose(ref hashCode_str);
                            JniObjectReference.Dispose(ref Object_hashCode);
                            JniObjectReference.Dispose(ref Object_hashCode_rt);
                            JniObjectReference.Dispose(ref emptyArray);
                        }
                    }
        }
Ejemplo n.º 6
0
        static unsafe void SetThrowableCause(JniType type, JniObjectReference outer, JniObjectReference inner)
        {
            var a = stackalloc JniArgumentValue [1];

            a [0] = new JniArgumentValue(inner);

            var i = type.GetInstanceMethod("initCause", "(Ljava/lang/Throwable;)Ljava/lang/Throwable;");
            var l = JniEnvironment.InstanceMethods.CallObjectMethod(outer, i, a);

            JniObjectReference.Dispose(ref l);
        }
Ejemplo n.º 7
0
        public static unsafe void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            try {
                var ignore = JniRuntime.CurrentRuntime;
            } catch (InvalidOperationException e) {
                Console.WriteLine(e);
            }
            foreach (var h in JniRuntime.GetAvailableInvocationPointers())
            {
                Console.WriteLine("PRE: GetCreatedJavaVMHandles: {0}", h);
            }
            Console.WriteLine("Part 2!");
            using (var vm = new JreRuntimeOptions().CreateJreVM()) {
                Console.WriteLine("# JniEnvironment.EnvironmentPointer={0}", JniEnvironment.EnvironmentPointer);
                Console.WriteLine("vm.SafeHandle={0}", vm.InvocationPointer);
                var t = new JniType("java/lang/Object");
                var c = t.GetConstructor("()V");
                var o = t.NewObject(c, null);
                var m = t.GetInstanceMethod("hashCode", "()I");
                int i = JniEnvironment.InstanceMethods.CallIntMethod(o, m);
                Console.WriteLine("java.lang.Object={0}", o);
                Console.WriteLine("hashcode={0}", i);
                JniObjectReference.Dispose(ref o);
                t.Dispose();
                // var o = JniTypes.FindClass ("java/lang/Object");

                /*
                 * var waitForCreation = new CountdownEvent (1);
                 * var exitThread = new CountdownEvent (1);
                 * var t = new Thread (() => {
                 *      var vm2 = new JavaVMBuilder ().CreateJavaVM ();
                 *      waitForCreation.Signal ();
                 *      exitThread.Wait ();
                 * });
                 * t.Start ();
                 * waitForCreation.Wait ();
                 */
                foreach (var h in JniRuntime.GetAvailableInvocationPointers())
                {
                    Console.WriteLine("WITHIN: GetCreatedJavaVMs: {0}", h);
                }
                // exitThread.Signal ();
            }
            foreach (var h in JniRuntime.GetAvailableInvocationPointers())
            {
                Console.WriteLine("POST: GetCreatedJavaVMs: {0}", h);
            }
        }
Ejemplo n.º 8
0
        public unsafe void Sanity()
        {
            using (var Integer_class = new JniType("java/lang/Integer")) {
                Assert.AreEqual("java/lang/Integer", Integer_class.Name);

                var ctor_args = stackalloc JniArgumentValue [1];
                ctor_args [0] = new JniArgumentValue(42);

                var Integer_ctor     = Integer_class.GetConstructor("(I)V");
                var Integer_intValue = Integer_class.GetInstanceMethod("intValue", "()I");
                var o = Integer_class.NewObject(Integer_ctor, ctor_args);
                try {
                    int v = JniEnvironment.InstanceMethods.CallIntMethod(o, Integer_intValue);
                    Assert.AreEqual(42, v);
                } finally {
                    JniObjectReference.Dispose(ref o);
                }
            }
        }
Ejemplo n.º 9
0
        unsafe TimeSpan GetJIMethodCallTiming()
        {
            using (var k = new JniType("java/lang/Object")) {
                var c = k.GetConstructor("()V");
                var o = k.NewObject(c, null);
                var t = k.GetInstanceMethod("toString", "()Ljava/lang/String;");

                var sw = Stopwatch.StartNew();
                for (int i = 0; i < Unified_ToString_Iterations; ++i)
                {
                    var r = JniEnvironment.InstanceMethods.CallObjectMethod(o, t);
                    JniObjectReference.Dispose(ref r);
                }
                sw.Stop();

                JniObjectReference.Dispose(ref o);
                return(sw.Elapsed);
            }
        }
Ejemplo n.º 10
0
        public void ObjectArrayEnumerationTiming()
        {
            const int C = 100;

            var total = Stopwatch.StartNew();

            JniMethodInfo Class_getMethods;

            using (var t = new JniType("java/lang/Class")) {
                Class_getMethods = t.GetInstanceMethod("getMethods", "()[Ljava/lang/reflect/Method;");
            }

            JniMethodInfo Method_getName;
            JniMethodInfo Method_getParameterTypes;
            JniMethodInfo Method_getReturnType;

            using (var t = new JniType("java/lang/reflect/Method")) {
                Method_getName           = t.GetInstanceMethod("getName", "()Ljava/lang/String;");
                Method_getParameterTypes = t.GetInstanceMethod("getParameterTypes", "()[Ljava/lang/Class;");
                Method_getReturnType     = t.GetInstanceMethod("getReturnType", "()Ljava/lang/Class;");
            }
            Console.WriteLine("# {0}: Method Lookups Timing: {1}", nameof(ObjectArrayEnumerationTiming), total.Elapsed);

            var methodHandles = new List <JavaObject> ();

            using (var Arrays_class = new JniType("java/util/Arrays")) {
                var lrefMethods = JniEnvironment.InstanceMethods.CallObjectMethod(Arrays_class.PeerReference, Class_getMethods);
                Console.WriteLine("# {0}: java.util.Arrays.class.getMethods() Timing: {1}", nameof(ObjectArrayEnumerationTiming), total.Elapsed);

                var methodsTiming = Stopwatch.StartNew();
                using (var methods = new JavaObjectArray <JavaObject> (ref lrefMethods, JniObjectReferenceOptions.Copy)) {
                    foreach (var method in methods)
                    {
                        methodHandles.Add(method);
                    }
                }
                methodsTiming.Stop();
                Console.WriteLine("# methodHandles(JavaObjectArray<JavaObject>) creation timing: {0} Count={1}", methodsTiming.Elapsed, methodHandles.Count);

                methodsTiming = Stopwatch.StartNew();
                var methodHandlesGO = new List <JavaObject> ();
                var vm  = JniEnvironment.Runtime;
                int len = JniEnvironment.Arrays.GetArrayLength(lrefMethods);
                for (int i = 0; i < len; ++i)
                {
                    var v = JniEnvironment.Arrays.GetObjectArrayElement(lrefMethods, i);
                    methodHandlesGO.Add(vm.ValueManager.GetValue <JavaObject> (ref v, JniObjectReferenceOptions.CopyAndDoNotRegister));
                    JniObjectReference.Dispose(ref v);
                }
                methodsTiming.Stop();
                Console.WriteLine("# methodHandles(JavaVM.GetObject) creation timing: {0} Count={1}", methodsTiming.Elapsed, methodHandles.Count);

                foreach (var h in methodHandlesGO)
                {
                    h.DisposeUnlessReferenced();
                }

                methodsTiming = Stopwatch.StartNew();
                var methodHandlesAr = new List <JavaObject> ();
                len = JniEnvironment.Arrays.GetArrayLength(lrefMethods);
                for (int i = 0; i < len; ++i)
                {
                    var v = JniEnvironment.Arrays.GetObjectArrayElement(lrefMethods, i);
                    methodHandlesAr.Add(new JavaObject(ref v, JniObjectReferenceOptions.CopyAndDoNotRegister));
                    JniObjectReference.Dispose(ref v);
                }
                methodsTiming.Stop();
                Console.WriteLine("# methodHandles(JavaObject[]) creation timing: {0} Count={1}", methodsTiming.Elapsed, methodHandles.Count);

                foreach (var h in methodHandlesAr)
                {
                    h.Dispose();
                }


                methodsTiming = Stopwatch.StartNew();
                var methodHandlesGR = new List <JniObjectReference> ();
                len = JniEnvironment.Arrays.GetArrayLength(lrefMethods);
                for (int i = 0; i < len; ++i)
                {
                    var v = JniEnvironment.Arrays.GetObjectArrayElement(lrefMethods, i);
                    methodHandlesGR.Add(v.NewGlobalRef());
                    JniObjectReference.Dispose(ref v);
                }
                methodsTiming.Stop();
                Console.WriteLine("# methodHandles(JniGlobalReference) creation timing: {0} Count={1}", methodsTiming.Elapsed, methodHandles.Count);

                for (int i = 0; i < methodHandlesGR.Count; ++i)
                {
                    var h = methodHandlesGR [i];
                    JniObjectReference.Dispose(ref h);
                    methodHandlesGR [i] = h;
                }

                JniObjectReference.Dispose(ref lrefMethods);
            }

            // HACK HACK HACK
            // This is to workaround an error wherein constructing `pt` (below)
            // throws an exception because `h` is NULL, when it really can't be.
            // I believe that this is due to the finalizer, which likewise makes
            // NO SENSE AT ALL, since `p` should be keeping the handle valid!
            // GC.Collect ();
            // GC.WaitForPendingFinalizers ();

            foreach (var method in methodHandles)
            {
                var lookupTiming = Stopwatch.StartNew();
                var n_name       = JniEnvironment.InstanceMethods.CallObjectMethod(method.PeerReference, Method_getName);
                var name         = JniEnvironment.Strings.ToString(ref n_name, JniObjectReferenceOptions.CopyAndDispose);
                var n_rt         = JniEnvironment.InstanceMethods.CallObjectMethod(method.PeerReference, Method_getReturnType);
                using (var rt = new JniType(ref n_rt, JniObjectReferenceOptions.CopyAndDispose)) {
                }
                var parameterTiming = Stopwatch.StartNew();
                var enumTime        = new TimeSpan();
                var lrefPs          = JniEnvironment.InstanceMethods.CallObjectMethod(method.PeerReference, Method_getParameterTypes);
                int len             = JniEnvironment.Arrays.GetArrayLength(lrefPs);
                var enumSw          = Stopwatch.StartNew();
                for (int i = 0; i < len; ++i)
                {
                    var p = JniEnvironment.Arrays.GetObjectArrayElement(lrefPs, i);
                    using (var pt = new JniType(ref p, JniObjectReferenceOptions.Copy)) {
                    }
                    JniObjectReference.Dispose(ref p);
                }
                JniObjectReference.Dispose(ref lrefPs);
                enumSw.Stop();
                enumTime = enumSw.Elapsed;
                parameterTiming.Stop();

                Console.WriteLine("## method '{0}' timing: Total={1}; Parameters={2} Parameters.Dispose={3}",
                                  name,
                                  lookupTiming.Elapsed,
                                  enumTime,
                                  parameterTiming.Elapsed);
            }

            var mhDisposeTiming = Stopwatch.StartNew();

            foreach (var method in methodHandles)
            {
                method.Dispose();
            }
            mhDisposeTiming.Stop();
            Console.WriteLine("# methodHandles -> Dispose() Timing: {0}", mhDisposeTiming.Elapsed);

            total.Stop();
            Console.WriteLine("## {0} Timing: {1}", nameof(ObjectArrayEnumerationTiming), total.Elapsed);
        }
Ejemplo n.º 11
0
        unsafe void GetJICallObjectMethodAndDeleteLocalRefTimings(
            out TimeSpan callVirtualObjectMethodTime, out TimeSpan disposeTime,
            out TimeSpan safeCallObjectMethodTime, out TimeSpan safeDeleteLocalRefTime,
            out TimeSpan unsafeCallObjectMethodTime, out TimeSpan unsafeDeleteLocalRefTime)
        {
            using (var k = new JniType("java/lang/Object")) {
                var c = k.GetConstructor("()V");
                var o = k.NewObject(c, null);
                var t = k.GetInstanceMethod("toString", "()Ljava/lang/String;");

                var r = JniEnvironment.InstanceMethods.CallObjectMethod(o, t);
                JniObjectReference.Dispose(ref r);

                var rs = new JniObjectReference [MaxLocalRefs];

                var sw = Stopwatch.StartNew();
                for (int i = 0; i < rs.Length; ++i)
                {
                    rs [i] = JniEnvironment.InstanceMethods.CallObjectMethod(o, t);
                }
                sw.Stop();
                callVirtualObjectMethodTime = sw.Elapsed;

                sw.Restart();
                for (int i = 0; i < rs.Length; ++i)
                {
                    JniObjectReference.Dispose(ref rs [i]);
                }
                sw.Stop();
                disposeTime = sw.Elapsed;

                IntPtr JNIEnv_CallObjectMethodA = Marshal.ReadIntPtr(Marshal.ReadIntPtr(JNIEnv.Handle), JNIEnvOffset_CallObjectMethodA);
                IntPtr JNIEnv_DeleteLocalRef    = Marshal.ReadIntPtr(Marshal.ReadIntPtr(JNIEnv.Handle), JNIEnvOffset_DeleteLocalRef);

                var safeCall = (SafeHandleDelegate_CallObjectMethodA)
                               Marshal.GetDelegateForFunctionPointer(JNIEnv_CallObjectMethodA, typeof(SafeHandleDelegate_CallObjectMethodA));
                var safeDel = (SafeHandleDelegate_DeleteLocalRef)
                              Marshal.GetDelegateForFunctionPointer(JNIEnv_DeleteLocalRef, typeof(SafeHandleDelegate_DeleteLocalRef));
                var usafeCall = (IntPtrDelegate_CallObjectMethodA)
                                Marshal.GetDelegateForFunctionPointer(JNIEnv_CallObjectMethodA, typeof(IntPtrDelegate_CallObjectMethodA));
                var usafeDel = (IntPtrDelegate_DeleteLocalRef)
                               Marshal.GetDelegateForFunctionPointer(JNIEnv_DeleteLocalRef, typeof(IntPtrDelegate_DeleteLocalRef));

                var uh   = JniEnvironment.EnvironmentPointer;
                var args = new JniArgumentValue [0];

                sw.Restart();
                for (int i = 0; i < rs.Length; ++i)
                {
                    rs [i] = new JniObjectReference(safeCall(uh, o.Handle, t.ID, args), JniObjectReferenceType.Local);
                }
                sw.Stop();
                safeCallObjectMethodTime = sw.Elapsed;

                sw.Restart();
                for (int i = 0; i < rs.Length; ++i)
                {
                    safeDel(uh, rs [i].Handle);
                    rs [i] = new JniObjectReference();
                }
                sw.Stop();
                safeDeleteLocalRefTime = sw.Elapsed;

                var urs = new IntPtr [MaxLocalRefs];
                var ut  = t.ID;
                var uo  = o.Handle;

                sw.Restart();
                for (int i = 0; i < urs.Length; ++i)
                {
                    urs [i] = usafeCall(uh, uo, ut, args);
                }
                sw.Stop();
                unsafeCallObjectMethodTime = sw.Elapsed;

                sw.Restart();
                for (int i = 0; i < urs.Length; ++i)
                {
                    usafeDel(uh, urs [i]);
                }
                sw.Stop();
                unsafeDeleteLocalRefTime = sw.Elapsed;
            }
        }