Ejemplo n.º 1
0
 public override void CreatedLocalReference(JniObjectReference value, ref int localReferenceCount)
 {
     base.CreatedLocalReference (value, ref localReferenceCount);
     if (Logger.LogLocalRef) {
         var tname = Thread.CurrentThread.Name;
         var tid   = Thread.CurrentThread.ManagedThreadId;;
         var from  = new StringBuilder (new StackTrace (true).ToString ());
         JNIEnv._monodroid_lref_log_new (localReferenceCount, value.Handle, (byte) 'L', tname, tid, from, 1);
     }
 }
Ejemplo n.º 2
0
        public override IntPtr ReleaseLocalReference(ref JniObjectReference value, ref int localReferenceCount)
        {
            var r = base.ReleaseLocalReference(ref value, ref localReferenceCount);

            if (Logger.LogLocalRef)
            {
                var tname = Thread.CurrentThread.Name;
                var tid   = Thread.CurrentThread.ManagedThreadId;;
                var from  = new StringBuilder(new StackTrace(true).ToString());
                JNIEnv._monodroid_lref_log_delete(localReferenceCount - 1, value.Handle, (byte)'L', tname, tid, from, 1);
            }
            return(r);
        }
Ejemplo n.º 3
0
        public override Exception GetExceptionForThrowable(ref JniObjectReference value, JniObjectReferenceOptions transfer)
        {
            var throwable = Java.Lang.Object.GetObject <Java.Lang.Throwable>(value.Handle, JniHandleOwnership.DoNotTransfer);

            JniObjectReference.Dispose(ref value, transfer);
            var p = throwable as JavaProxyThrowable;

            if (p != null)
            {
                return(p.InnerException);
            }
            return(throwable);
        }
        public PdfWriteResultCallback(PDFToHtml _pDFToHtml) : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (!(Handle != IntPtr.Zero))
            {
                unsafe
                {
                    JniObjectReference val = JniPeerMembers.InstanceMethods.StartCreateInstance("()V", GetType(), null);
                    SetHandle(val.Handle, JniHandleOwnership.TransferLocalRef);
                    JniPeerMembers.InstanceMethods.FinishCreateInstance("()V", this, null);
                }
            }

            pDFToHtml = _pDFToHtml;
        }
Ejemplo n.º 5
0
        static Delegate GetInt32ValueHandler()
        {
            Func <IntPtr, IntPtr, int> h = (jnienv, n_self) => {
                var r_self = new JniObjectReference(n_self);
                var self   = JniEnvironment.Runtime.ValueManager.GetValue <TestType>(ref r_self, JniObjectReferenceOptions.CopyAndDoNotRegister);
                try {
                    return(self.GetInt32Value());
                } finally {
                    self.DisposeUnlessReferenced();
                }
            };

            return(JniEnvironment.Runtime.MarshalMemberBuilder.CreateMarshalToManagedDelegate(h));
        }
Ejemplo n.º 6
0
        public void PeekValue()
        {
            JniObjectReference lref;

            using (var o = new JavaObject()) {
                lref = o.PeerReference.NewLocalRef();
                Assert.AreSame(o, JniRuntime.CurrentRuntime.ValueManager.PeekValue(lref));
            }
            // At this point, the Java-side object is kept alive by `lref`,
            // but the wrapper instance has been disposed, and thus should
            // be unregistered, and thus unfindable.
            Assert.IsNull(JniRuntime.CurrentRuntime.ValueManager.PeekValue(lref));
            JniObjectReference.Dispose(ref lref);
        }
Ejemplo n.º 7
0
 public unsafe void Types_IsSameObject()
 {
     using (var t = new JniType("java/lang/Object")) {
         var c = t.GetConstructor("()V");
         var o = t.NewObject(c, null);
         try {
             using (var ot = JniEnvironment.Types.GetTypeFromInstance(o)) {
                 Assert.IsTrue(JniEnvironment.Types.IsSameObject(t.PeerReference, ot.PeerReference));
             }
         } finally {
             JniObjectReference.Dispose(ref o);
         }
     }
 }
Ejemplo n.º 8
0
 public PdfWriteResultCallback(TaskCompletionSource <ToFileResult> taskCompletionSource, string path) : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
 {
     if (!(Handle != IntPtr.Zero))
     {
         unsafe
         {
             JniObjectReference val = JniPeerMembers.InstanceMethods.StartCreateInstance("()V", GetType(), null);
             SetHandle(val.Handle, JniHandleOwnership.TransferLocalRef);
             JniPeerMembers.InstanceMethods.FinishCreateInstance("()V", this, null);
         }
     }
     _taskCompletionSource = taskCompletionSource;
     _path = path;
 }
Ejemplo n.º 9
0
        public override JniObjectReference CreateWeakGlobalReference(JniObjectReference value)
        {
            var r = base.CreateWeakGlobalReference (value);

            var log		= Logger.LogGlobalRef;
            var ctype	= log ? GetObjectRefType (value.Type) : (byte) '*';
            var ntype	= log ? GetObjectRefType (r.Type) : (byte) '*';
            var tname = log ? Thread.CurrentThread.Name : null;
            var tid   = log ? Thread.CurrentThread.ManagedThreadId : 0;
            var from  = log ? new StringBuilder (new StackTrace (true).ToString ()) : null;
            JNIEnv._monodroid_weak_gref_new (value.Handle, ctype, r.Handle, ntype, tname, tid, from, 1);

            return r;
        }
Ejemplo n.º 10
0
        public void Ctor_Exceptions()
        {
            var r = new JniObjectReference();

            Assert.Throws <ArgumentException> (() => new JavaObject(ref r, JniObjectReferenceOptions.CopyAndDispose));

            // Note: This may break if/when JavaVM provides "default"
            Assert.Throws <NotSupportedException> (() => new JavaObjectWithNoJavaPeer());
#if __ANDROID__
            Assert.Throws <Java.Lang.ClassNotFoundException> (() => new JavaObjectWithMissingJavaPeer()).Dispose();
#else   // !__ANDROID__
            Assert.Throws <JavaException> (() => new JavaObjectWithMissingJavaPeer()).Dispose();
#endif  // !__ANDROID__
        }
Ejemplo n.º 11
0
        protected static object ToReturnValue(ref JniObjectReference handle, string signature, int n)
        {
            var instance = JniEnvironment.Runtime.ValueManager.GetValue <IJavaPeerable> (ref handle, JniObjectReferenceOptions.CopyAndDispose);

            switch (signature [n])
            {
            case 'L':
                return(new DynamicJavaInstance(instance));

            case '[':
            default:
                return(instance);
            }
        }
Ejemplo n.º 12
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.º 13
0
        static bool _EqualsThis(IntPtr jnienv, IntPtr n_self, IntPtr n_value)
        {
            var jvm     = JniEnvironment.Runtime;
            var r_self  = new JniObjectReference(n_self);
            var self    = jvm.ValueManager.GetValue <TestType>(ref r_self, JniObjectReferenceOptions.CopyAndDoNotRegister);
            var r_value = new JniObjectReference(n_self);
            var value   = jvm.ValueManager.GetValue <IJavaPeerable> (ref r_value, JniObjectReferenceOptions.CopyAndDoNotRegister);

            try {
                return(self.EqualsThis(value));
            } finally {
                self.DisposeUnlessReferenced();
                value.DisposeUnlessReferenced();
            }
        }
Ejemplo n.º 14
0
        public override JniObjectReference CreateWeakGlobalReference(JniObjectReference value)
        {
            var r = base.CreateWeakGlobalReference(value);

            var log   = Logger.LogGlobalRef;
            var ctype = log ? GetObjectRefType(value.Type) : (byte)'*';
            var ntype = log ? GetObjectRefType(r.Type) : (byte)'*';
            var tname = log ? Thread.CurrentThread.Name : null;
            var tid   = log ? Thread.CurrentThread.ManagedThreadId : 0;
            var from  = log ? new StringBuilder(new StackTrace(true).ToString()) : null;

            JNIEnv._monodroid_weak_gref_new(value.Handle, ctype, r.Handle, ntype, tname, tid, from, 1);

            return(r);
        }
Ejemplo n.º 15
0
        Dictionary <string, List <JavaMethodInfo> > LookupMethods()
        {
            if (Members == null)
            {
                return(null);
            }

            lock (Members) {
                if (this.methods != null || Disposed)
                {
                    return(this.methods);
                }

                this.methods = new Dictionary <string, List <JavaMethodInfo> > ();

                var methods = JniEnvironment.InstanceMethods.CallObjectMethod(Members.JniPeerType.PeerReference, Class_getMethods);
                try {
                    int len = JniEnvironment.Arrays.GetArrayLength(methods);
                    for (int i = 0; i < len; ++i)
                    {
                        var method   = JniEnvironment.Arrays.GetObjectArrayElement(methods, i);
                        var n_name   = JniEnvironment.InstanceMethods.CallObjectMethod(method, Method_getName);
                        var name     = JniEnvironment.Strings.ToString(ref n_name, JniObjectReferenceOptions.CopyAndDispose);
                        var isStatic = IsStatic(method);

                        List <JavaMethodInfo> overloads;
                        if (!Methods.TryGetValue(name, out overloads))
                        {
                            Methods.Add(name, overloads = new List <JavaMethodInfo> ());
                        }

                        var nrt = JniEnvironment.InstanceMethods.CallObjectMethod(method, Method_getReturnType);
                        var rt  = new JniType(ref nrt, JniObjectReferenceOptions.CopyAndDispose);
                        var m   = new JavaMethodInfo(Members, method, name, isStatic)
                        {
                            ReturnType = rt,
                        };
                        overloads.Add(m);
                        JniObjectReference.Dispose(ref method);
                    }
                } finally {
                    JniObjectReference.Dispose(ref methods);
                }

                return(this.methods);
            }
        }
Ejemplo n.º 16
0
        public void OnPictureTaken(JniObjectReference data, Camera camera)
        {
            Console.WriteLine($"# jonp: data: {data.ToString ()}");
            int length = JniEnvironment.Arrays.GetArrayLength(data);

            if (length == 0)
            {
                return;
            }

            // Note use of `unsafe` code to obtain the underlying Java bytes
            // without copying the entire array between VMs.
            unsafe {
                sbyte *bytes = JniEnvironment.Arrays.GetByteArrayElements(data, isCopy: null);
                JniEnvironment.Arrays.ReleaseByteArrayElements(data, bytes, 0);
            }
        }
Ejemplo n.º 17
0
        Dictionary <string, List <JavaFieldInfo> > LookupFields()
        {
            if (Members == null)
            {
                return(null);
            }

            lock (Members) {
                if (this.fields != null || Disposed)
                {
                    return(this.fields);
                }

                this.fields = new Dictionary <string, List <JavaFieldInfo> > ();

                var fields = JniEnvironment.InstanceMethods.CallObjectMethod(Members.JniPeerType.PeerReference, Class_getFields);
                try {
                    int len = JniEnvironment.Arrays.GetArrayLength(fields);
                    for (int i = 0; i < len; ++i)
                    {
                        var field    = JniEnvironment.Arrays.GetObjectArrayElement(fields, i);
                        var n_name   = JniEnvironment.InstanceMethods.CallObjectMethod(field, Field_getName);
                        var name     = JniEnvironment.Strings.ToString(ref n_name, JniObjectReferenceOptions.CopyAndDispose);
                        var isStatic = IsStatic(field);

                        List <JavaFieldInfo> overloads;
                        if (!Fields.TryGetValue(name, out overloads))
                        {
                            Fields.Add(name, overloads = new List <JavaFieldInfo> ());
                        }

                        var n_type = JniEnvironment.InstanceMethods.CallObjectMethod(field, Field_getType);
                        using (var type = new JniType(ref n_type, JniObjectReferenceOptions.CopyAndDispose)) {
                            var sig = JniTypeSignature.Parse(type.Name);
                            overloads.Add(new JavaFieldInfo(Members, name + "." + sig.QualifiedReference, isStatic));
                        }

                        JniObjectReference.Dispose(ref field);
                    }
                } finally {
                    JniObjectReference.Dispose(ref fields);
                }

                return(this.fields);
            }
        }
Ejemplo n.º 18
0
        static IntPtr GetStringValueHandler(IntPtr jnienv, IntPtr n_self, int value)
        {
            var r_self = new JniObjectReference(n_self);
            var self   = JniEnvironment.Runtime.ValueManager.GetValue <TestType>(ref r_self, JniObjectReferenceOptions.CopyAndDoNotRegister);

            try {
                var s = self.GetStringValue(value);
                var r = JniEnvironment.Strings.NewString(s);
                try {
                    return(JniEnvironment.References.NewReturnToJniRef(r));
                } finally {
                    JniObjectReference.Dispose(ref r);
                }
            } finally {
                self.DisposeUnlessReferenced();
            }
        }
Ejemplo n.º 19
0
 public unsafe void Handles_NewReturnToJniRef()
 {
     using (var t = new JniType("java/lang/Object")) {
         var c = t.GetConstructor("()V");
         var o = t.NewObject(c, null);
         try {
             var n = o.NewLocalRef();
             JniObjectReference.Dispose(ref n);
             // warning: lref 'leak'
             var r = JniEnvironment.References.NewReturnToJniRef(o);
             var h = new JniObjectReference(r);
             Assert.AreEqual(JniEnvironment.References.GetIdentityHashCode(o), JniEnvironment.References.GetIdentityHashCode(h));
         } finally {
             JniObjectReference.Dispose(ref o);
         }
     }
 }
Ejemplo n.º 20
0
        static void CalledFromConstructorHandler(IntPtr jnienv, IntPtr n_self, int value)
        {
            var envp = new JniTransition(jnienv);

            try {
                var r_self = new JniObjectReference(n_self);
                var self   = JniEnvironment.Runtime.ValueManager.GetValue <CallVirtualFromConstructorDerived>(ref r_self, JniObjectReferenceOptions.Copy);
                self.CalledFromConstructor(value);
                self.DisposeUnlessReferenced();
            }
            catch (Exception e) when(JniEnvironment.Runtime.ExceptionShouldTransitionToJni(e))
            {
                envp.SetPendingException(e);
            }
            finally {
                envp.Dispose();
            }
        }
Ejemplo n.º 21
0
        public override JniObjectReference CreateGlobalReference(JniObjectReference value)
        {
            var r     = base.CreateGlobalReference (value);

            var log		= Logger.LogGlobalRef;
            var ctype	= log ? GetObjectRefType (value.Type) : (byte) '*';
            var ntype	= log ? GetObjectRefType (r.Type) : (byte) '*';
            var tname = log ? Thread.CurrentThread.Name : null;
            var tid   = log ? Thread.CurrentThread.ManagedThreadId : 0;
            var from  = log ? new StringBuilder (new StackTrace (true).ToString ()) : null;
            int gc 		= JNIEnv._monodroid_gref_log_new (value.Handle, ctype, r.Handle, ntype, tname, tid, from, 1);
            if (gc >= JNIEnv.gref_gc_threshold) {
                Logger.Log (LogLevel.Info, "monodroid-gc", gc + " outstanding GREFs. Performing a full GC!");
                System.GC.Collect ();
            }

            return r;
        }
        private void Dispose(bool disposing)
        {
            if (!_javaRef.IsValid)
            {
                return;
            }

            unsafe
            {
                // tell Java that we're done with this array
                JniEnvironment.Arrays.ReleaseByteArrayElements(_javaRef, (sbyte *)Raw, JniReleaseArrayElementsMode.Default);
            }

            if (disposing)
            {
                JniObjectReference.Dispose(ref _javaRef);
            }
        }
Ejemplo n.º 23
0
        public void UnreferencedInstanceIsCollected()
        {
            JniObjectReference oldHandle = new JniObjectReference();
            WeakReference      r         = null;

            FinalizerHelpers.PerformNoPinAction(() => {
                var v     = new JavaObject();
                oldHandle = v.PeerReference.NewWeakGlobalRef();
                r         = new WeakReference(v);
            });
            JniEnvironment.Runtime.ValueManager.CollectPeers();
            GC.WaitForPendingFinalizers();
            GC.WaitForPendingFinalizers();
            Assert.IsFalse(r.IsAlive);
            Assert.IsNull(r.Target);
            Assert.IsNull(JniRuntime.CurrentRuntime.ValueManager.PeekValue(oldHandle));
            JniObjectReference.Dispose(ref oldHandle);
        }
Ejemplo n.º 24
0
 public AndroidRuntimeOptions(IntPtr jnienv,
                              IntPtr vm,
                              bool allocNewObjectSupported,
                              IntPtr classLoader,
                              IntPtr classLoader_loadClass,
                              bool jniAddNativeMethodRegistrationAttributePresent)
 {
     EnvironmentPointer       = jnienv;
     ClassLoader              = new JniObjectReference(classLoader, JniObjectReferenceType.Global);
     ClassLoader_LoadClass_id = classLoader_loadClass;
     InvocationPointer        = vm;
     NewObjectRequired        = !allocNewObjectSupported;
     ObjectReferenceManager   = new AndroidObjectReferenceManager();
     TypeManager              = new AndroidTypeManager(jniAddNativeMethodRegistrationAttributePresent);
     ValueManager             = new AndroidValueManager();
     UseMarshalMemberBuilder  = false;
     JniAddNativeMethodRegistrationAttributePresent = jniAddNativeMethodRegistrationAttributePresent;
 }
Ejemplo n.º 25
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.º 26
0
        bool ShouldReplaceMapping(WeakReference <IJavaPeerable> current, JniObjectReference reference, out IJavaPeerable?target)
        {
            target = null;

            if (current == null)
            {
                return(true);
            }

            // Target has been GC'd; see also FIXME, above, in finalizer
            if (!current.TryGetTarget(out target) || target == null)
            {
                return(true);
            }

            // It's possible that the instance was GC'd, but the finalizer
            // hasn't executed yet, so the `instances` entry is stale.
            if (!target.PeerReference.IsValid)
            {
                return(true);
            }

            if (!JniEnvironment.Types.IsSameObject(target.PeerReference, reference))
            {
                return(false);
            }

            // JNIEnv.NewObject/JNIEnv.CreateInstance() compatibility.
            // When two MCW's are created for one Java instance [0],
            // we want the 2nd MCW to replace the 1st, as the 2nd is
            // the one the dev created; the 1st is an implicit intermediary.
            //
            // [0]: If Java ctor invokes overridden virtual method, we'll
            // transition into managed code w/o a registered instance, and
            // thus will create an "intermediary" via
            // (IntPtr, JniHandleOwnership) .ctor.
            if ((target.JniManagedPeerState & JniManagedPeerStates.Replaceable) == JniManagedPeerStates.Replaceable)
            {
                return(true);
            }

            return(false);
        }
Ejemplo n.º 27
0
        public void UnregisterFromRuntime()
        {
            int registeredCount = JniRuntime.CurrentRuntime.ValueManager.GetSurfacedPeers().Count;
            JniObjectReference l;
            JavaObject         o;

            using (o = new JavaObject()) {
                l = o.PeerReference.NewLocalRef();
                Assert.AreEqual(JniObjectReferenceType.Global, o.PeerReference.Type);
                Assert.AreEqual(registeredCount + 1, JniRuntime.CurrentRuntime.ValueManager.GetSurfacedPeers().Count);
                Assert.IsNotNull(JniRuntime.CurrentRuntime.ValueManager.PeekValue(l));
                Assert.AreNotSame(l, o.PeerReference);
                Assert.AreSame(o, JniRuntime.CurrentRuntime.ValueManager.PeekValue(l));
            }
            Assert.AreEqual(registeredCount, JniRuntime.CurrentRuntime.ValueManager.GetSurfacedPeers().Count);
            Assert.IsNull(JniRuntime.CurrentRuntime.ValueManager.PeekValue(l));
            JniObjectReference.Dispose(ref l);
            Assert.Throws <ObjectDisposedException> (() => o.UnregisterFromRuntime());
        }
Ejemplo n.º 28
0
        public static unsafe TokenizationResult CreateTokenizationResult(global::Android.Content.Intent p0)
        {
            const string      id   = "createTokenizationResult.(Landroid/content/Intent;)Lru/yandex/money/android/sdk/TokenizationResult;";
            JniArgumentValue *args = stackalloc JniArgumentValue[1];

            args[0] = new JniArgumentValue(p0?.Handle ?? IntPtr.Zero);
            JniObjectReference rm = default;

            try
            {
                rm = _members.StaticMethods.InvokeObjectMethod(id, args);
            }
            catch (Java.Lang.IllegalArgumentException e)
            {
                Console.WriteLine(e);
                //throw;
            }
            return(GetObject <TokenizationResult>(rm.Handle, JniHandleOwnership.TransferLocalRef));
        }
Ejemplo n.º 29
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.º 30
0
        static Delegate GetEqualsThisHandler()
        {
            Func <IntPtr, IntPtr, IntPtr, bool> h = (jnienv, n_self, n_value) => {
                var jvm     = JniEnvironment.Runtime;
                var r_self  = new JniObjectReference(n_self);
                var self    = jvm.ValueManager.GetValue <TestType>(ref r_self, JniObjectReferenceOptions.CopyAndDoNotRegister);
                var r_value = new JniObjectReference(n_self);
                var value   = jvm.ValueManager.GetValue <IJavaPeerable> (ref r_value, JniObjectReferenceOptions.CopyAndDoNotRegister);

                try {
                    return(self.EqualsThis(value));
                } finally {
                    self.DisposeUnlessReferenced();
                    value.DisposeUnlessReferenced();
                }
            };

            return(JniEnvironment.Runtime.MarshalMemberBuilder.CreateMarshalToManagedDelegate(h));
        }
Ejemplo n.º 31
0
        public void LookupArguments()
        {
            if (arguments != null)
            {
                return;
            }

            var vm  = JniEnvironment.Runtime;
            var sb  = new StringBuilder();
            var mgr = vm.TypeManager;

            if (!IsConstructor)
            {
                sb.Append(Name).Append(".");
            }

            sb.Append("(");

            var parameters = IsConstructor
                                ? JavaClassInfo.GetConstructorParameters(PeerReference)
                                : JavaClassInfo.GetMethodParameters(PeerReference);

            try {
                int len = JniEnvironment.Arrays.GetArrayLength(parameters);
                arguments = new List <JniObjectReference> (len);
                for (int i = 0; i < len; ++i)
                {
                    var p = JniEnvironment.Arrays.GetObjectArrayElement(parameters, i);
                    try {
                        var sig = JniTypeSignature.Parse(JniEnvironment.Types.GetJniTypeNameFromClass(p));
                        sb.Append(sig.QualifiedReference);
                        arguments.Add(p.NewGlobalRef());
                    } finally {
                        JniObjectReference.Dispose(ref p);
                    }
                }
            } finally {
                JniObjectReference.Dispose(ref parameters);
            }
            sb.Append(")").Append(JniReturnType);
            JniSignature = sb.ToString();
        }
Ejemplo n.º 32
0
        public override JniObjectReference CreateGlobalReference(JniObjectReference value)
        {
            var r = base.CreateGlobalReference(value);

            var log   = Logger.LogGlobalRef;
            var ctype = log ? GetObjectRefType(value.Type) : (byte)'*';
            var ntype = log ? GetObjectRefType(r.Type) : (byte)'*';
            var tname = log ? Thread.CurrentThread.Name : null;
            var tid   = log ? Thread.CurrentThread.ManagedThreadId : 0;
            var from  = log ? new StringBuilder(new StackTrace(true).ToString()) : null;
            int gc    = JNIEnv._monodroid_gref_log_new(value.Handle, ctype, r.Handle, ntype, tname, tid, from, 1);

            if (gc >= JNIEnv.gref_gc_threshold)
            {
                Logger.Log(LogLevel.Info, "monodroid-gc", gc + " outstanding GREFs. Performing a full GC!");
                System.GC.Collect();
            }

            return(r);
        }
        /// <summary>
        /// Creates a FastJavaByteArray wrapper around an existing Java/JNI byte array
        /// </summary>
        /// <param name="handle">Native Java array handle</param>
        /// <param name="readOnly">Whether to consider this byte array read-only</param>
        public FastJavaByteArray(IntPtr handle, bool readOnly = true)
        {
            if (handle == IntPtr.Zero)
            {
                throw new ArgumentNullException("handle");
            }

            IsReadOnly = readOnly;

            // Retain a global reference to the byte array.
            _javaRef = new JniObjectReference(handle).NewGlobalRef();
            Count    = JniEnvironment.Arrays.GetArrayLength(_javaRef);

            bool isCopy = false;

            unsafe
            {
                // Get a pinned pointer to the byte array using the global Handle
                Raw = (byte *)JniEnvironment.Arrays.GetByteArrayElements(_javaRef, &isCopy);
            }
        }
Ejemplo n.º 34
0
 public override IntPtr ReleaseLocalReference(ref JniObjectReference value, ref int localReferenceCount)
 {
     var r = base.ReleaseLocalReference (ref value, ref localReferenceCount);
     if (Logger.LogLocalRef) {
         var tname = Thread.CurrentThread.Name;
         var tid   = Thread.CurrentThread.ManagedThreadId;;
         var from  = new StringBuilder (new StackTrace (true).ToString ());
         JNIEnv._monodroid_lref_log_delete (localReferenceCount-1, value.Handle, (byte) 'L', tname, tid, from, 1);
     }
     return r;
 }
Ejemplo n.º 35
0
 public override Exception GetExceptionForThrowable(ref JniObjectReference value, JniObjectReferenceOptions transfer)
 {
     var throwable = Java.Lang.Object.GetObject<Java.Lang.Throwable>(value.Handle, JniHandleOwnership.DoNotTransfer);
     JniObjectReference.Dispose (ref value, transfer);
     var p = throwable as JavaProxyThrowable;
     if (p != null)
         return p.InnerException;
     return throwable;
 }
Ejemplo n.º 36
0
 public override void RaisePendingException(Exception pendingException)
 {
     var je  = pendingException as JavaProxyThrowable;
     if (je == null) {
         je  = new JavaProxyThrowable (pendingException);
     }
     var r = new JniObjectReference (je.Handle);
     JniEnvironment.Exceptions.Throw (r);
 }
Ejemplo n.º 37
0
 public AndroidRuntimeOptions(IntPtr jnienv, IntPtr vm, bool allocNewObjectSupported, IntPtr classLoader, IntPtr classLoader_loadClass)
 {
     EnvironmentPointer      = jnienv;
     ClassLoader             = new JniObjectReference (classLoader, JniObjectReferenceType.Global);
     ClassLoader_LoadClass_id= classLoader_loadClass;
     InvocationPointer       = vm;
     NewObjectRequired       = !allocNewObjectSupported;
     ObjectReferenceManager  = new AndroidObjectReferenceManager ();
     TypeManager             = new AndroidTypeManager ();
 }
Ejemplo n.º 38
0
        public override void DeleteGlobalReference(ref JniObjectReference value)
        {
            var log		= Logger.LogGlobalRef;
            var ctype	= log ? GetObjectRefType (value.Type) : (byte) '*';
            var tname = log ? Thread.CurrentThread.Name : null;
            var tid   = log ? Thread.CurrentThread.ManagedThreadId : 0;
            var from  = log ? new StringBuilder (new StackTrace (true).ToString ()) : null;
            JNIEnv._monodroid_gref_log_delete (value.Handle, ctype, tname, tid, from, 1);

            base.DeleteGlobalReference (ref value);
        }
Ejemplo n.º 39
0
		void IJavaPeerable.SetPeerReference (JniObjectReference reference)
		{
			this.handle         = reference.Handle;
			this.handle_type    = (JObjectRefType) reference.Type;
		}