Exemple #1
0
        public static T WrapIJavaObject <T>(JniLocalHandle handle) where T : class, IJavaObject
        {
            if (JniHandle.IsNull(handle))
            {
                return(null);
            }

            // see if we can find the appropriate class instance
            Type   type      = typeof(T);
            string className = type.FullName;
            JNIEnv env       = JNIEnv.ThreadEnv;

            JniLocalHandle clazz   = env.GetObjectClass(handle);
            Wrapper        wrapper = GetWrapper(env, clazz);

            if (!wrapper.Type.GetInterfaces().Contains(typeof(T)))
            {
                // failed to find the instance, so let's go with the interface wrapper
                wrapper = GetWrapper(className + "_");
            }

            var ret = wrapper.Constructor.Invoke(new object[] { env }) as T;

            ret.Init(env, handle);
            return(ret);
        }
Exemple #2
0
        public static object WrapJavaObjectSealedClass(JniHandle handle, Type type)
        {
            if (JniHandle.IsNull(handle))
            {
                return(null);
            }
            Wrapper wrapper = GetWrapper(type.FullName);

            return(wrapper.Constructor.Invoke(null));
        }
Exemple #3
0
        public JniLocalHandle GetObjectClass(JniHandle obj)
        {
            if (JniHandle.IsNull(obj))
            {
                return(JniLocalHandle.Zero);
            }
            JniLocalHandle res = getObjectClass.Invoke(envPtr, obj);

            ExceptionTest();
            return(res);
        }
Exemple #4
0
        internal JniLocalHandle NewLocalRef(JniHandle lobj)
        {
            if (JniHandle.IsNull(lobj))
            {
                throw new ArgumentNullException("lobj");
            }
            JniLocalHandle res = newLocalRef(envPtr, lobj);

            //optimized away ExceptionTest();
            return(res);
        }
Exemple #5
0
        public static string GetObjectClassName(JniHandle handle)
        {
            if (JniHandle.IsNull(handle))
            {
                return(null);
            }

            JNIEnv env         = JNIEnv.ThreadEnv;
            var    classHandle = env.GetObjectClass(handle);

            return(GetClassName(env, classHandle));
        }
Exemple #6
0
        public static JavaException WrapJavaException(JniLocalHandle handle)
        {
            if (JniHandle.IsNull(handle))
            {
                return(null);
            }
            JNIEnv         env     = JNIEnv.ThreadEnv;
            JniLocalHandle clazz   = env.GetObjectClass(handle);
            Wrapper        wrapper = GetWrapper(env, clazz);
            var            ret     = wrapper.Constructor.Invoke(new object[] { env }) as JavaException;

            ret.Init(env, handle);
            return(ret);
        }
Exemple #7
0
        public static T[] WrapJavaArrayObject <T>(JniLocalHandle handle)
        {
            if (JniHandle.IsNull(handle))
            {
                return(null);
            }

            JNIEnv env    = JNIEnv.ThreadEnv;
            var    length = env.GetArrayLength(handle);

            T[] ret = new T[length];

            Type type = typeof(T).GetElementType();

            if (type.IsPrimitive)
            {
                if (type == typeof(int) || type == typeof(uint))
                {
                    env.GetIntArrayRegion(handle, 0, length, ret as int[]);
                    return(ret);
                }
                if (type == typeof(long) || type == typeof(ulong))
                {
                    env.GetLongArrayRegion(handle, 0, length, ret as long[]);
                    return(ret);
                }
                if (type == typeof(bool))
                {
                    env.GetBooleanArrayRegion(handle, 0, length, ret as bool[]);
                    return(ret);
                }
                if (type == typeof(double))
                {
                    env.GetDoubleArrayRegion(handle, 0, length, ret as double[]);
                    return(ret);
                }
                if (type == typeof(byte) || type == typeof(sbyte))
                {
                    env.GetByteArrayRegion(handle, 0, length, ret as byte[]);
                    return(ret);
                }
                if (type == typeof(char))
                {
                    env.GetCharArrayRegion(handle, 0, length, ret as char[]);
                    return(ret);
                }
                if (type == typeof(short) || type == typeof(ushort))
                {
                    env.GetShortArrayRegion(handle, 0, length, ret as short[]);
                    return(ret);
                }
                if (type == typeof(float))
                {
                    env.GetFloatArrayRegion(handle, 0, length, ret as float[]);
                    return(ret);
                }
            }

            if (type.IsArray)
            {
                MethodInfo method = mWrapJavaArrayObject.MakeGenericMethod(type.GetElementType());
                for (int i = 0; i < length; i++)
                {
                    ret[i] = (T)method.Invoke(null, new object[] { env.GetObjectArrayElement(handle, i) });
                }
            }
            else if (type.IsInterface)
            {
                MethodInfo method = mWrapIJavaObject.MakeGenericMethod(type);
                for (int i = 0; i < length; i++)
                {
                    ret[i] = (T)method.Invoke(null, new object[] { env.GetObjectArrayElement(handle, i) });
                }
            }
            else if (type.IsSubclassOf(typeof(JavaException)))
            {
                JavaException[] exceptions = ret as JavaException[];
                for (int i = 0; i < length; i++)
                {
                    exceptions[i] = WrapJavaException(env.GetObjectArrayElement(handle, i));
                }
            }
            else if (type.IsSubclassOf(typeof(JavaObject)))
            {
                JavaObject[] objects = ret as JavaObject[];
                for (int i = 0; i < length; i++)
                {
                    objects[i] = WrapJavaObject(env.GetObjectArrayElement(handle, i));
                }
            }
            else
            {
                throw new InvalidOperationException("Trying to convert unknown type.");
            }

            return(ret);
        }