public static IntPtr ConvertToJNIArray <TElement>(Array array)
        {
            System.Type elementType = typeof(TElement);

            System.Diagnostics.Debug.Assert(elementType != null, "elementType != null");
            if (elementType.IsSubclassOf(typeof(JavaObject)))
            {
                int      length1 = array.GetLength(0);
                IntPtr[] array2  = new IntPtr[length1];
                IntPtr   class1  = FindClass(GetClass(elementType));
                IntPtr   type    = IntPtr.Zero;
                for (int index = 0; index < length1; ++index)
                {
                    JavaObject obj = array.GetValue(index) as JavaObject;
                    if (obj != null)
                    {
                        array2[index] = obj.RawObject;
                        IntPtr rawClass = obj.RawClass;
                        if (type != rawClass)
                        {
                            type = !(type == IntPtr.Zero) ? class1 : rawClass;
                        }
                    }
                    else
                    {
                        array2[index] = IntPtr.Zero;
                    }
                }
                IntPtr num = JNISafe.ToObjectArray(array2, type);
                JNISafe.DeleteLocalRef(class1);

                return(num);
            }

            return(AndroidJNIHelper.ConvertToJNIArray(array));
        }