private static Value ConvertToValue(JNIEnv env, object o) { // check if this is a primitive Type type = o.GetType(); if (type.IsPrimitive) { return(ConvertPrimitiveToValue(env, o, type)); } // if it's not an array, cast to IJavaObject Array array = o as Array; if (array == null) { return(ConvertToValue(o)); } // it's an array, so create the proper array type and convert the individual elements recursively string classSignature = GetSignature(type.GetElementType().FullName); JniLocalHandle clazzHandle = env.FindClass(classSignature); JniLocalHandle arrayHandle = env.NewObjectArray(array.Length, clazzHandle, JniLocalHandle.Zero); for (int i = 0; i < array.Length; i++) { JniHandle element = new JniHandle(); element.handle = ConvertToValue(env, array.GetValue(i))._object; env.SetObjectArrayElement(arrayHandle, i, element); } Value ret = new Value(); ret._object = arrayHandle; return(ret); }