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); } }
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)); } } }
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); } } }
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); }
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; } }