示例#1
0
        public static IntPtr GetMethodID(IntPtr jclass, string methodName, string signature, bool isStatic)
        {
            IntPtr ptr3;
            IntPtr zero = IntPtr.Zero;

            try
            {
                zero = AndroidReflection.GetMethodMember(jclass, methodName, signature, isStatic);
                ptr3 = AndroidJNISafe.FromReflectedMethod(zero);
            }
            catch (Exception exception)
            {
                IntPtr ptr2 = !isStatic?AndroidJNISafe.GetMethodID(jclass, methodName, signature) : AndroidJNISafe.GetStaticMethodID(jclass, methodName, signature);

                if (ptr2 == IntPtr.Zero)
                {
                    throw exception;
                }
                return(ptr2);
            }
            finally
            {
                AndroidJNISafe.DeleteLocalRef(zero);
            }
            return(ptr3);
        }
示例#2
0
 public static IntPtr NewProxyInstance(int delegateHandle, IntPtr interfaze)
 {
     jvalue[] array = new jvalue[2];
     array[0].i = delegateHandle;
     array[1].l = interfaze;
     return(AndroidJNISafe.CallStaticObjectMethod(s_ReflectionHelperClass, s_ReflectionHelperNewProxyInstance, array));
 }
示例#3
0
        private void _AndroidJavaObject(string className, params object[] args)
        {
            this.DebugPrint("Creating AndroidJavaObject from " + className);
            bool flag = args == null;

            if (flag)
            {
                args = new object[1];
            }
            IntPtr jobject = AndroidJNISafe.FindClass(className.Replace('.', '/'));

            this.m_jclass = new GlobalJavaObjectRef(jobject);
            jvalue[] array = AndroidJNIHelper.CreateJNIArgArray(args);
            try
            {
                IntPtr constructorID = AndroidJNIHelper.GetConstructorID(this.m_jclass, args);
                IntPtr intPtr        = AndroidJNISafe.NewObject(this.m_jclass, constructorID, array);
                this.m_jobject = new GlobalJavaObjectRef(intPtr);
                AndroidJNISafe.DeleteLocalRef(intPtr);
            }
            finally
            {
                AndroidJNIHelper.DeleteJNIArgArray(args, array);
            }
        }
示例#4
0
        public static IntPtr GetConstructorID(IntPtr jclass, string signature)
        {
            IntPtr ptr3;
            IntPtr zero = IntPtr.Zero;

            try
            {
                zero = AndroidReflection.GetConstructorMember(jclass, signature);
                ptr3 = AndroidJNISafe.FromReflectedMethod(zero);
            }
            catch (Exception exception)
            {
                IntPtr ptr2 = AndroidJNISafe.GetMethodID(jclass, "<init>", signature);
                if (ptr2 == IntPtr.Zero)
                {
                    throw exception;
                }
                return(ptr2);
            }
            finally
            {
                AndroidJNISafe.DeleteLocalRef(zero);
            }
            return(ptr3);
        }
        public static void CheckException()
        {
            IntPtr jthrowable = AndroidJNI.ExceptionOccurred();

            if (jthrowable != IntPtr.Zero)
            {
                AndroidJNI.ExceptionClear();
                IntPtr jthrowableClass     = AndroidJNI.FindClass("java/lang/Throwable");
                IntPtr androidUtilLogClass = AndroidJNI.FindClass("android/util/Log");
                try
                {
                    IntPtr toStringMethodId            = AndroidJNI.GetMethodID(jthrowableClass, "toString", "()Ljava/lang/String;");
                    IntPtr getStackTraceStringMethodId = AndroidJNI.GetStaticMethodID(androidUtilLogClass, "getStackTraceString", "(Ljava/lang/Throwable;)Ljava/lang/String;");
                    string exceptionMessage            = AndroidJNI.CallStringMethod(jthrowable, toStringMethodId, new jvalue[] {});
                    // Pass jthrowable as a param to getStackTraceString()
                    jvalue[] jniArgs = new jvalue[1];
                    jniArgs[0].l = jthrowable;
                    string exceptionCallStack = AndroidJNI.CallStaticStringMethod(androidUtilLogClass, getStackTraceStringMethodId, jniArgs);
                    throw new AndroidJavaException(exceptionMessage, exceptionCallStack);
                }
                finally
                {
                    AndroidJNISafe.DeleteLocalRef(jthrowable);
                    AndroidJNISafe.DeleteLocalRef(jthrowableClass);
                    AndroidJNISafe.DeleteLocalRef(androidUtilLogClass);
                }
            }
        }
        public static IntPtr GetFieldID(IntPtr jclass, string fieldName, string signature, bool isStatic)
        {
            IntPtr intPtr = IntPtr.Zero;
            IntPtr result;

            try
            {
                intPtr = AndroidReflection.GetFieldMember(jclass, fieldName, signature, isStatic);
                result = AndroidJNISafe.FromReflectedField(intPtr);
            }
            catch (Exception ex)
            {
                IntPtr intPtr2 = (!isStatic) ? AndroidJNISafe.GetFieldID(jclass, fieldName, signature) : AndroidJNISafe.GetStaticFieldID(jclass, fieldName, signature);
                if (!(intPtr2 != IntPtr.Zero))
                {
                    throw ex;
                }
                result = intPtr2;
            }
            finally
            {
                AndroidJNISafe.DeleteLocalRef(intPtr);
            }
            return(result);
        }
        public static IntPtr GetConstructorID(IntPtr jclass, string signature)
        {
            IntPtr intPtr = IntPtr.Zero;
            IntPtr result;

            try
            {
                intPtr = AndroidReflection.GetConstructorMember(jclass, signature);
                result = AndroidJNISafe.FromReflectedMethod(intPtr);
            }
            catch (Exception ex)
            {
                IntPtr methodID = AndroidJNISafe.GetMethodID(jclass, "<init>", signature);
                if (!(methodID != IntPtr.Zero))
                {
                    throw ex;
                }
                result = methodID;
            }
            finally
            {
                AndroidJNISafe.DeleteLocalRef(intPtr);
            }
            return(result);
        }
        public static IntPtr InvokeJavaProxyMethod(AndroidJavaProxy proxy, IntPtr jmethodName, IntPtr jargs)
        {
            int num = 0;

            if (jargs != IntPtr.Zero)
            {
                num = AndroidJNISafe.GetArrayLength(jargs);
            }
            AndroidJavaObject[] array = new AndroidJavaObject[num];
            for (int i = 0; i < num; i++)
            {
                IntPtr objectArrayElement = AndroidJNISafe.GetObjectArrayElement(jargs, i);
                array[i] = ((!(objectArrayElement != IntPtr.Zero)) ? null : new AndroidJavaObject(objectArrayElement));
            }
            IntPtr result;

            using (AndroidJavaObject androidJavaObject = proxy.Invoke(AndroidJNI.GetStringUTFChars(jmethodName), array))
            {
                if (androidJavaObject == null)
                {
                    result = IntPtr.Zero;
                }
                else
                {
                    result = AndroidJNI.NewLocalRef(androidJavaObject.GetRawObject());
                }
            }
            return(result);
        }
        public static IntPtr GetMethodID(IntPtr jclass, string methodName, string signature, bool isStatic)
        {
            IntPtr intPtr = IntPtr.Zero;
            IntPtr result;

            try
            {
                intPtr = AndroidReflection.GetMethodMember(jclass, methodName, signature, isStatic);
                result = AndroidJNISafe.FromReflectedMethod(intPtr);
            }
            catch (Exception ex)
            {
                IntPtr methodIDFallback = _AndroidJNIHelper.GetMethodIDFallback(jclass, methodName, signature, isStatic);
                if (!(methodIDFallback != IntPtr.Zero))
                {
                    throw ex;
                }
                result = methodIDFallback;
            }
            finally
            {
                AndroidJNISafe.DeleteLocalRef(intPtr);
            }
            return(result);
        }
        private void _AndroidJavaClass(string className)
        {
            base.DebugPrint("Creating AndroidJavaClass from " + className);
            IntPtr jobject = AndroidJNISafe.FindClass(className.Replace('.', '/'));

            this.m_jclass  = new GlobalJavaObjectRef(jobject);
            this.m_jobject = new GlobalJavaObjectRef(IntPtr.Zero);
        }
示例#11
0
 public static void SetNativeExceptionOnProxy(IntPtr proxy, Exception e, bool methodNotFound)
 {
     jvalue[] array = new jvalue[3];
     array[0].l = proxy;
     array[1].j = GCHandle.ToIntPtr(GCHandle.Alloc(e)).ToInt64();
     array[2].z = methodNotFound;
     AndroidJNISafe.CallStaticVoidMethod(AndroidReflection.s_ReflectionHelperClass, AndroidReflection.s_ReflectionHelperSetNativeExceptionOnProxy, array);
 }
示例#12
0
        protected FieldType _Get <FieldType>(string fieldName)
        {
            IntPtr fieldId = AndroidJNIHelper.GetFieldID <FieldType>(this.m_jclass, fieldName, false);

            if (AndroidReflection.IsPrimitive(typeof(FieldType)))
            {
                if (typeof(FieldType) == typeof(int))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetIntField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(bool))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetBooleanField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(byte))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetByteField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(short))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetShortField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(long))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetLongField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(float))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetFloatField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(double))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetDoubleField(this.m_jobject, fieldId));
                }
                if (typeof(FieldType) == typeof(char))
                {
                    return((FieldType)(ValueType)AndroidJNISafe.GetCharField(this.m_jobject, fieldId));
                }
                return(default(FieldType));
            }
            if (typeof(FieldType) == typeof(string))
            {
                return((FieldType)AndroidJNISafe.GetStringField(this.m_jobject, fieldId));
            }
            if (typeof(FieldType) == typeof(AndroidJavaClass))
            {
                return((FieldType)AndroidJavaObject.AndroidJavaClassDeleteLocalRef(AndroidJNISafe.GetObjectField(this.m_jobject, fieldId)));
            }
            if (typeof(FieldType) == typeof(AndroidJavaObject))
            {
                return((FieldType)AndroidJavaObject.AndroidJavaObjectDeleteLocalRef(AndroidJNISafe.GetObjectField(this.m_jobject, fieldId)));
            }
            if (AndroidReflection.IsAssignableFrom(typeof(Array), typeof(FieldType)))
            {
                return(AndroidJNIHelper.ConvertFromJNIArray <FieldType>(AndroidJNISafe.GetObjectField(this.m_jobject, fieldId)));
            }
            throw new Exception("JNI: Unknown field type '" + (object)typeof(FieldType) + "'");
        }
示例#13
0
        protected FieldType _GetStatic <FieldType>(string fieldName)
        {
            IntPtr fieldID = AndroidJNIHelper.GetFieldID <FieldType>(this.m_jclass, fieldName, true);

            if (AndroidReflection.IsPrimitive(typeof(FieldType)))
            {
                if (typeof(FieldType) == typeof(int))
                {
                    return((FieldType)AndroidJNISafe.GetStaticIntField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(bool))
                {
                    return((FieldType)AndroidJNISafe.GetStaticBooleanField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(byte))
                {
                    return((FieldType)AndroidJNISafe.GetStaticByteField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(short))
                {
                    return((FieldType)AndroidJNISafe.GetStaticShortField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(long))
                {
                    return((FieldType)AndroidJNISafe.GetStaticLongField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(float))
                {
                    return((FieldType)AndroidJNISafe.GetStaticFloatField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(double))
                {
                    return((FieldType)AndroidJNISafe.GetStaticDoubleField(this.m_jclass, fieldID));
                }
                if (typeof(FieldType) == typeof(char))
                {
                    return((FieldType)AndroidJNISafe.GetStaticCharField(this.m_jclass, fieldID));
                }
                return(default(FieldType));
            }
            if (typeof(FieldType) == typeof(string))
            {
                return((FieldType)AndroidJNISafe.GetStaticStringField(this.m_jclass, fieldID));
            }
            if (typeof(FieldType) == typeof(AndroidJavaClass))
            {
                return((FieldType)AndroidJavaClassDeleteLocalRef(AndroidJNISafe.GetStaticObjectField(this.m_jclass, fieldID)));
            }
            if (typeof(FieldType) == typeof(AndroidJavaObject))
            {
                return((FieldType)AndroidJavaObjectDeleteLocalRef(AndroidJNISafe.GetStaticObjectField(this.m_jclass, fieldID)));
            }
            if (!AndroidReflection.IsAssignableFrom(typeof(Array), typeof(FieldType)))
            {
                throw new Exception("JNI: Unknown field type '" + typeof(FieldType) + "'");
            }
            return(AndroidJNIHelper.ConvertFromJNIArray <FieldType>(AndroidJNISafe.GetStaticObjectField(this.m_jclass, fieldID)));
        }
示例#14
0
 protected virtual void Dispose(bool disposing)
 {
     if (!this.m_disposed)
     {
         this.m_disposed = true;
         AndroidJNISafe.DeleteGlobalRef(this.m_jobject);
         AndroidJNISafe.DeleteGlobalRef(this.m_jclass);
     }
 }
示例#15
0
 public static int GetIntField(IntPtr obj, IntPtr fieldID)
 {
     try
     {
         return(AndroidJNI.GetIntField(obj, fieldID));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#16
0
 private static IntPtr GetMethodIDFallback(IntPtr jclass, string methodName, string signature, bool isStatic)
 {
     try
     {
         return((!isStatic) ? AndroidJNISafe.GetMethodID(jclass, methodName, signature) : AndroidJNISafe.GetStaticMethodID(jclass, methodName, signature));
     }
     catch (Exception)
     {
     }
     return(IntPtr.Zero);
 }
示例#17
0
 public static int GetStaticIntField(IntPtr clazz, IntPtr fieldID)
 {
     try
     {
         return(AndroidJNI.GetStaticIntField(clazz, fieldID));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#18
0
 public static void SetIntField(IntPtr obj, IntPtr fieldID, int val)
 {
     try
     {
         AndroidJNI.SetIntField(obj, fieldID, val);
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#19
0
 public static void CallVoidMethod(IntPtr obj, IntPtr methodID, jvalue[] args)
 {
     try
     {
         AndroidJNI.CallVoidMethod(obj, methodID, args);
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#20
0
 internal static AndroidJavaClass AndroidJavaClassDeleteLocalRef(IntPtr jclass)
 {
     try
     {
         return(new AndroidJavaClass(jclass));
     }
     finally
     {
         AndroidJNISafe.DeleteLocalRef(jclass);
     }
 }
示例#21
0
 public static void SetStaticIntField(IntPtr clazz, IntPtr fieldID, int val)
 {
     try
     {
         AndroidJNI.SetStaticIntField(clazz, fieldID, val);
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#22
0
 public static bool CallStaticBooleanMethod(IntPtr clazz, IntPtr methodID, jvalue[] args)
 {
     try
     {
         return(AndroidJNI.CallStaticBooleanMethod(clazz, methodID, args));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#23
0
 internal static AndroidJavaObject AndroidJavaObjectDeleteLocalRef(IntPtr jobject)
 {
     try
     {
         return(new AndroidJavaObject(jobject));
     }
     finally
     {
         AndroidJNISafe.DeleteLocalRef(jobject);
     }
 }
示例#24
0
 public static double[] FromDoubleArray(IntPtr array)
 {
     try
     {
         return(AndroidJNI.FromDoubleArray(array));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#25
0
 public static short[] FromShortArray(IntPtr array)
 {
     try
     {
         return(AndroidJNI.FromShortArray(array));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#26
0
 public static IntPtr GetStaticMethodID(IntPtr clazz, string name, string sig)
 {
     try
     {
         return(AndroidJNI.GetStaticMethodID(clazz, name, sig));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#27
0
 public static int CallIntMethod(IntPtr obj, IntPtr methodID, jvalue[] args)
 {
     try
     {
         return(AndroidJNI.CallIntMethod(obj, methodID, args));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#28
0
 public static IntPtr GetObjectClass(IntPtr ptr)
 {
     try
     {
         return(AndroidJNI.GetObjectClass(ptr));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#29
0
 public static IntPtr NewStringUTF(string bytes)
 {
     try
     {
         return(AndroidJNI.NewStringUTF(bytes));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }
示例#30
0
 public static string GetStringUTFChars(IntPtr str)
 {
     try
     {
         return(AndroidJNI.GetStringUTFChars(str));
     }
     finally
     {
         AndroidJNISafe.CheckException();
     }
 }