public static ParameterInfo[] GetParameterInfo(JniWrapper vm, object[] args) { ParameterInfo[] ret = new ParameterInfo[args.Length]; for (int i = 0; i < args.Length; i++) { if (args[i] == null) { ret[i] = new ParameterInfo(new JValue(IntPtr.Zero), new NullType()); } else { JavaObjectFactory objectFactory = GetJavaType(vm, args[i].GetType(), args[i]); ret[i] = new ParameterInfo(objectFactory.Create(args[i]), objectFactory.JavaType); } } return(ret); }
public static JavaObjectFactory Array(JniWrapper vm, Type dotNetType, Array prototype) { object innerPrototype = null; if (prototype != null && prototype.Length > 0) { innerPrototype = prototype.GetValue(0); } JavaObjectFactory innerFactory = GetJavaType(vm, dotNetType.GetElementType(), innerPrototype); ArrayType javaArrayType = new ArrayType(innerFactory.JavaType); return(new JavaObjectFactory(o => { Array asArray = (Array)o; PrimitiveType asPrimitive = javaArrayType.MemberType as PrimitiveType; if (asPrimitive != null) { switch (asPrimitive.Kind) { case PrimitiveTypeKind.Boolean: return vm.NewBooleanArray((bool[])o); case PrimitiveTypeKind.Byte: return vm.NewByteArray((byte[])o); case PrimitiveTypeKind.Char: return vm.NewCharArray((char[])o); case PrimitiveTypeKind.Double: return vm.NewDoubleArray((double[])o); case PrimitiveTypeKind.Float: return vm.NewFloatArray((float[])o); case PrimitiveTypeKind.Int: return vm.NewIntArray((int[])o); case PrimitiveTypeKind.Long: return vm.NewLongArray((long[])o); case PrimitiveTypeKind.Short: return vm.NewShortArray((short[])o); default: throw new InvalidOperationException("Unknown primitive kind: " + asPrimitive.Kind); } } else { IntPtr[] elements = asArray.Cast <object>().Select(innerFactory._factory).Select(v => v.ToIntPtr()).ToArray(); return vm.NewArray(vm.FindClass(innerFactory.JavaType.JniClassName), elements); } }, javaArrayType)); }
private static JavaObjectFactory GetJavaType(JniWrapper vm, Type dotNetType, object prototype) { if (dotNetType.IsArray) { return(JavaObjectFactory.Array(vm, dotNetType, (Array)prototype)); } else if (dotNetType.IsAssignableFrom(typeof(string))) { return(JavaObjectFactory.String(vm)); } else if (dotNetType.IsAssignableFrom(typeof(byte))) { return(JavaObjectFactory.Byte(vm)); } else if (dotNetType.IsAssignableFrom(typeof(short))) { return(JavaObjectFactory.Short(vm)); } else if (dotNetType.IsAssignableFrom(typeof(int))) { return(JavaObjectFactory.Int(vm)); } else if (dotNetType.IsAssignableFrom(typeof(long))) { return(JavaObjectFactory.Long(vm)); } else if (dotNetType.IsAssignableFrom(typeof(float))) { return(JavaObjectFactory.Float(vm)); } else if (dotNetType.IsAssignableFrom(typeof(double))) { return(JavaObjectFactory.Double(vm)); } else if (dotNetType.IsAssignableFrom(typeof(char))) { return(JavaObjectFactory.Char(vm)); } else if (dotNetType.IsAssignableFrom(typeof(bool))) { return(JavaObjectFactory.Boolean(vm)); } else if (dotNetType.IsAssignableFrom(typeof(JavaObject))) { if (prototype == null) { throw new InvalidOperationException("Can't infer the type of the Java object without an instance."); } return(JavaObjectFactory.Object(vm, ((JavaObject)prototype).Class)); } else if (dotNetType.IsAssignableFrom(typeof(JavaArray))) { if (prototype == null) { throw new InvalidOperationException("Can't infer the type of the Java array without an instance."); } return(JavaObjectFactory.Array(vm, ((JavaArray)prototype).ArrayType)); } else { throw new InvalidOperationException("Can't infer the Java type of " + dotNetType); } }