Пример #1
0
        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            int index = (int)indexes[0];

            PrimitiveType memberAsPrimitive;
            ArrayType     memberAsArray;

            if ((memberAsPrimitive = _arrayType.MemberType as PrimitiveType) != null)
            {
                switch (memberAsPrimitive.Kind)
                {
                case PrimitiveTypeKind.Boolean: result = _vm.GetBooleanArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Byte: result = _vm.GetByteArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Char: result = _vm.GetCharArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Double: result = _vm.GetDoubleArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Float: result = _vm.GetFloatArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Int: result = _vm.GetIntArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Long: result = _vm.GetLongArray(_arrayPtr)[index]; break;

                case PrimitiveTypeKind.Short: result = _vm.GetShortArray(_arrayPtr)[index]; break;

                default: throw new InvalidOperationException("Unknown primitive kind: " + memberAsPrimitive.Kind);
                }
                return(true);
            }
            else if ((memberAsArray = _arrayType.MemberType as ArrayType) != null)
            {
                result = new JavaArray(_vm, _vm.GetArray(_arrayPtr)[index], memberAsArray);
                return(true);
            }
            else
            {
                IntPtr objectPointer = _vm.GetArray(_arrayPtr)[index];
                // I'll intentionally pass the actual type as null if we have a non-null object, so we can discover
                // the precise type instead of just assuming it's of the base class type.
                result = new JavaObject(_vm, objectPointer, objectPointer == IntPtr.Zero ? (JavaClass)_arrayType.MemberType : null);
                return(true);
            }
        }
Пример #2
0
 public JValue Value(JniWrapper vm, bool box)
 {
     if (!box)
     {
         return(_value);
     }
     else
     {
         ArrayType asArray;
         if ((asArray = _type as ArrayType) != null)
         {
             JavaArray arrayObject = new JavaArray(vm, _value.ToIntPtr(), asArray);
             return(arrayObject.Box());
         }
         else
         {
             PrimitiveType primitiveType = (PrimitiveType)_type;
             return(primitiveType.GetBoxClass().Box(_value, primitiveType));
         }
     }
 }
Пример #3
0
		public JValue Value(JniWrapper vm, bool box)
		{
			if (!box)
			{
				return _value;
			}
			else
			{
				ArrayType asArray;
				if ((asArray = _type as ArrayType) != null)
				{
					JavaArray arrayObject = new JavaArray(vm, _value.ToIntPtr(), asArray);
					return arrayObject.Box();
				}
				else
				{
					PrimitiveType primitiveType = (PrimitiveType)_type;
					return primitiveType.GetBoxClass().Box(_value, primitiveType);
				}
			}
		}
Пример #4
0
        private object InvokeMethod(IntPtr method, ParameterInfo[] parameterInfo, bool[] needBoxing)
        {
            object result;
            IntPtr methodReturn   = _methodClass.GetReturnType(method);
            IntPtr jniMethodPtr   = _vm.FromReflectedMethod(method);
            string returnTypeName = _classClass.GetName(methodReturn);

            JValue[]      parameters            = parameterInfo.Select((p, i) => p.Value(_vm, needBoxing[i])).ToArray();
            PrimitiveType returnTypeAsPrimitive = PrimitiveType.FromString(_vm, returnTypeName);

            if (methodReturn == IntPtr.Zero || returnTypeName == "void")
            {
                result = null;
                _vm.CallVoidMethod(_objectPointer, jniMethodPtr, parameters);
            }
            else if (returnTypeAsPrimitive != null)
            {
                switch (returnTypeAsPrimitive.Kind)
                {
                case PrimitiveTypeKind.Boolean:
                    result = _vm.CallBooleanMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Byte:
                    result = _vm.CallByteMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Char:
                    result = _vm.CallCharMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Double:
                    result = _vm.CallDoubleMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Float:
                    result = _vm.CallFloatMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Int:
                    result = _vm.CallIntMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Long:
                    result = _vm.CallLongMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                case PrimitiveTypeKind.Short:
                    result = _vm.CallShortMethod(_objectPointer, jniMethodPtr, parameters);
                    break;

                default:
                    throw new InvalidOperationException("Unknown primitive type: " + returnTypeAsPrimitive.Kind);
                }
            }
            else
            {
                IntPtr methodResult = _vm.CallObjectMethod(_objectPointer, jniMethodPtr, parameters);
                if (methodResult != IntPtr.Zero)
                {
                    if (returnTypeName.StartsWith("["))
                    {
                        result = new JavaArray(_vm, methodResult, (ArrayType)JavaType.FromReflectedType(_vm, methodReturn));
                    }
                    else
                    {
                        result = new JavaObject(_vm, methodResult, null);
                    }
                }
                else
                {
                    result = null;
                }
            }
            return(result);
        }
Пример #5
0
		public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
		{
			int index = (int)indexes[0];

			PrimitiveType memberAsPrimitive;
			ArrayType memberAsArray;
			if ((memberAsPrimitive = _arrayType.MemberType as PrimitiveType) != null)
			{
				switch (memberAsPrimitive.Kind)
				{
					case PrimitiveTypeKind.Boolean: result = _vm.GetBooleanArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Byte: result = _vm.GetByteArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Char: result = _vm.GetCharArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Double: result = _vm.GetDoubleArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Float: result = _vm.GetFloatArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Int: result = _vm.GetIntArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Long: result = _vm.GetLongArray(_arrayPtr)[index]; break;
					case PrimitiveTypeKind.Short: result = _vm.GetShortArray(_arrayPtr)[index]; break;
					default: throw new InvalidOperationException("Unknown primitive kind: " + memberAsPrimitive.Kind);
				}
				return true;
			}
			else if ((memberAsArray = _arrayType.MemberType as ArrayType) != null)
			{
				result = new JavaArray(_vm, _vm.GetArray(_arrayPtr)[index], memberAsArray);
				return true;
			}
			else
			{
				IntPtr objectPointer = _vm.GetArray(_arrayPtr)[index];
				// I'll intentionally pass the actual type as null if we have a non-null object, so we can discover
				// the precise type instead of just assuming it's of the base class type.
				result = new JavaObject(_vm, objectPointer, objectPointer == IntPtr.Zero ? (JavaClass)_arrayType.MemberType : null);
				return true;
			}
		}