public static IntPtr ConvertToJNIArray(Array array)
{
Type elementType = array.GetType().GetElementType();
if (AndroidReflection.IsPrimitive(elementType))
{
if (elementType == typeof(int))
{
return(AndroidJNISafe.ToIntArray((int[])array));
}
if (elementType == typeof(bool))
{
return(AndroidJNISafe.ToBooleanArray((bool[])array));
}
if (elementType == typeof(byte))
{
return(AndroidJNISafe.ToByteArray((byte[])array));
}
if (elementType == typeof(short))
{
return(AndroidJNISafe.ToShortArray((short[])array));
}
if (elementType == typeof(long))
{
return(AndroidJNISafe.ToLongArray((long[])array));
}
if (elementType == typeof(float))
{
return(AndroidJNISafe.ToFloatArray((float[])array));
}
if (elementType == typeof(double))
{
return(AndroidJNISafe.ToDoubleArray((double[])array));
}
if (elementType != typeof(char))
{
return(IntPtr.Zero);
}
return(AndroidJNISafe.ToCharArray((char[])array));
}
if (elementType == typeof(string))
{
string[] strArray = (string[])array;
int size = array.GetLength(0);
IntPtr clazz = AndroidJNISafe.FindClass("java/lang/String");
IntPtr ptr2 = AndroidJNI.NewObjectArray(size, clazz, IntPtr.Zero);
for (int j = 0; j < size; j++)
{
IntPtr ptr3 = AndroidJNISafe.NewStringUTF(strArray[j]);
AndroidJNI.SetObjectArrayElement(ptr2, j, ptr3);
AndroidJNISafe.DeleteLocalRef(ptr3);
}
AndroidJNISafe.DeleteLocalRef(clazz);
return(ptr2);
}
if (elementType != typeof(AndroidJavaObject))
{
throw new Exception("JNI; Unknown array type '" + elementType + "'");
}
AndroidJavaObject[] objArray = (AndroidJavaObject[])array;
int length = array.GetLength(0);
IntPtr[] ptrArray = new IntPtr[length];
IntPtr localref = AndroidJNISafe.FindClass("java/lang/Object");
IntPtr zero = IntPtr.Zero;
for (int i = 0; i < length; i++)
{
if (objArray[i] != null)
{
ptrArray[i] = objArray[i].GetRawObject();
IntPtr rawClass = objArray[i].GetRawClass();
if (zero != rawClass)
{
if (zero == IntPtr.Zero)
{
zero = rawClass;
}
else
{
zero = localref;
}
}
}
else
{
ptrArray[i] = IntPtr.Zero;
}
}
IntPtr ptr7 = AndroidJNISafe.ToObjectArray(ptrArray, zero);
AndroidJNISafe.DeleteLocalRef(localref);
return(ptr7);
}