using System; using System.Text; using UnityEngine.Scripting; namespace UnityEngine { // Token: 0x020003B1 RID: 945 [UsedByNativeCode] internal sealed class _AndroidJNIHelper { // Token: 0x0600371F RID: 14111 RVA: 0x0005BED8 File Offset: 0x0005A0D8 public static IntPtr CreateJavaProxy(int delegateHandle, AndroidJavaProxy proxy) { return AndroidReflection.NewProxyInstance(delegateHandle, proxy.javaInterface.GetRawClass()); } // Token: 0x06003720 RID: 14112 RVA: 0x0005BF00 File Offset: 0x0005A100 public static IntPtr CreateJavaRunnable(AndroidJavaRunnable jrunnable) { return AndroidJNIHelper.CreateJavaProxy(new AndroidJavaRunnableProxy(jrunnable)); } // Token: 0x06003721 RID: 14113 RVA: 0x0005BF20 File Offset: 0x0005A120 public static IntPtr InvokeJavaProxyMethod(AndroidJavaProxy proxy, IntPtr jmethodName, IntPtr jargs) { int num = 0; if (jargs != IntPtr.Zero) { num = AndroidJNISafe.GetArrayLength(jargs); } AndroidJavaObject[] array = new AndroidJavaObject[num]; for (int i = 0; i < num; i++) { IntPtr objectArrayElement = AndroidJNISafe.GetObjectArrayElement(jargs, i); array[i] = ((!(objectArrayElement != IntPtr.Zero)) ? null : new AndroidJavaObject(objectArrayElement)); } IntPtr intPtr; using (AndroidJavaObject androidJavaObject = proxy.Invoke(AndroidJNI.GetStringUTFChars(jmethodName), array)) { if (androidJavaObject == null) { intPtr = IntPtr.Zero; } else { intPtr = AndroidJNI.NewLocalRef(androidJavaObject.GetRawObject()); } } return intPtr; } // Token: 0x06003722 RID: 14114 RVA: 0x0005BFE4 File Offset: 0x0005A1E4 public static jvalue[] CreateJNIArgArray(object[] args) { jvalue[] array = new jvalue[args.GetLength(0)]; int num = 0; foreach (object obj in args) { if (obj == null) { array[num].l = IntPtr.Zero; } else if (AndroidReflection.IsPrimitive(obj.GetType())) { if (obj is int) { array[num].i = (int)obj; } else if (obj is bool) { array[num].z = (bool)obj; } else if (obj is byte) { array[num].b = (byte)obj; } else if (obj is short) { array[num].s = (short)obj; } else if (obj is long) { array[num].j = (long)obj; } else if (obj is float) { array[num].f = (float)obj; } else if (obj is double) { array[num].d = (double)obj; } else if (obj is char) { array[num].c = (char)obj; } } else if (obj is string) { array[num].l = AndroidJNISafe.NewStringUTF((string)obj); } else if (obj is AndroidJavaClass) { array[num].l = ((AndroidJavaClass)obj).GetRawClass(); } else if (obj is AndroidJavaObject) { array[num].l = ((AndroidJavaObject)obj).GetRawObject(); } else if (obj is Array) { array[num].l = _AndroidJNIHelper.ConvertToJNIArray((Array)obj); } else if (obj is AndroidJavaProxy) { array[num].l = ((AndroidJavaProxy)obj).GetProxy().GetRawObject(); } else { if (!(obj is AndroidJavaRunnable)) { throw new Exception("JNI; Unknown argument type '" + obj.GetType() + "'"); } array[num].l = AndroidJNIHelper.CreateJavaRunnable((AndroidJavaRunnable)obj); } num++; } return array; } // Token: 0x06003723 RID: 14115 RVA: 0x0005C288 File Offset: 0x0005A488 public static object UnboxArray(AndroidJavaObject obj) { object obj2; if (obj == null) { obj2 = null; } else { AndroidJavaClass androidJavaClass = new AndroidJavaClass("java/lang/reflect/Array"); AndroidJavaObject androidJavaObject = obj.Call("getClass", new object[0]); AndroidJavaObject androidJavaObject2 = androidJavaObject.Call("getComponentType", new object[0]); string text = androidJavaObject2.Call("getName", new object[0]); int num = androidJavaClass.Call("getLength", new object[] { obj }); Array array; if (androidJavaObject2.Call("IsPrimitive", new object[0])) { if ("I" == text) { array = new int[num]; } else if ("Z" == text) { array = new bool[num]; } else if ("B" == text) { array = new byte[num]; } else if ("S" == text) { array = new short[num]; } else if ("J" == text) { array = new long[num]; } else if ("F" == text) { array = new float[num]; } else if ("D" == text) { array = new double[num]; } else { if (!("C" == text)) { throw new Exception("JNI; Unknown argument type '" + text + "'"); } array = new char[num]; } } else if ("java.lang.String" == text) { array = new string[num]; } else if ("java.lang.Class" == text) { array = new AndroidJavaClass[num]; } else { array = new AndroidJavaObject[num]; } for (int i = 0; i < num; i++) { array.SetValue(_AndroidJNIHelper.Unbox(androidJavaClass.CallStatic("get", new object[] { obj, i })), i); } obj2 = array; } return obj2; } // Token: 0x06003724 RID: 14116 RVA: 0x0005C4BC File Offset: 0x0005A6BC public static object Unbox(AndroidJavaObject obj) { object obj2; if (obj == null) { obj2 = null; } else { AndroidJavaObject androidJavaObject = obj.Call("getClass", new object[0]); string text = androidJavaObject.Call("getName", new object[0]); if ("java.lang.Integer" == text) { obj2 = obj.Call("intValue", new object[0]); } else if ("java.lang.Boolean" == text) { obj2 = obj.Call("booleanValue", new object[0]); } else if ("java.lang.Byte" == text) { obj2 = obj.Call("byteValue", new object[0]); } else if ("java.lang.Short" == text) { obj2 = obj.Call("shortValue", new object[0]); } else if ("java.lang.Long" == text) { obj2 = obj.Call("longValue", new object[0]); } else if ("java.lang.Float" == text) { obj2 = obj.Call("floatValue", new object[0]); } else if ("java.lang.Double" == text) { obj2 = obj.Call("doubleValue", new object[0]); } else if ("java.lang.Character" == text) { obj2 = obj.Call("charValue", new object[0]); } else if ("java.lang.String" == text) { obj2 = obj.Call("toString", new object[0]); } else if ("java.lang.Class" == text) { obj2 = new AndroidJavaClass(obj.GetRawObject()); } else if (androidJavaObject.Call("isArray", new object[0])) { obj2 = _AndroidJNIHelper.UnboxArray(obj); } else { obj2 = obj; } } return obj2; } // Token: 0x06003725 RID: 14117 RVA: 0x0005C6D0 File Offset: 0x0005A8D0 public static AndroidJavaObject Box(object obj) { AndroidJavaObject androidJavaObject; if (obj == null) { androidJavaObject = null; } else if (AndroidReflection.IsPrimitive(obj.GetType())) { if (obj is int) { androidJavaObject = new AndroidJavaObject("java.lang.Integer", new object[] { (int)obj }); } else if (obj is bool) { androidJavaObject = new AndroidJavaObject("java.lang.Boolean", new object[] { (bool)obj }); } else if (obj is byte) { androidJavaObject = new AndroidJavaObject("java.lang.Byte", new object[] { (byte)obj }); } else if (obj is short) { androidJavaObject = new AndroidJavaObject("java.lang.Short", new object[] { (short)obj }); } else if (obj is long) { androidJavaObject = new AndroidJavaObject("java.lang.Long", new object[] { (long)obj }); } else if (obj is float) { androidJavaObject = new AndroidJavaObject("java.lang.Float", new object[] { (float)obj }); } else if (obj is double) { androidJavaObject = new AndroidJavaObject("java.lang.Double", new object[] { (double)obj }); } else { if (!(obj is char)) { throw new Exception("JNI; Unknown argument type '" + obj.GetType() + "'"); } androidJavaObject = new AndroidJavaObject("java.lang.Character", new object[] { (char)obj }); } } else if (obj is string) { androidJavaObject = new AndroidJavaObject("java.lang.String", new object[] { (string)obj }); } else if (obj is AndroidJavaClass) { androidJavaObject = new AndroidJavaObject(((AndroidJavaClass)obj).GetRawClass()); } else if (obj is AndroidJavaObject) { androidJavaObject = (AndroidJavaObject)obj; } else if (obj is Array) { androidJavaObject = AndroidJavaObject.AndroidJavaObjectDeleteLocalRef(_AndroidJNIHelper.ConvertToJNIArray((Array)obj)); } else if (obj is AndroidJavaProxy) { androidJavaObject = ((AndroidJavaProxy)obj).GetProxy(); } else { if (!(obj is AndroidJavaRunnable)) { throw new Exception("JNI; Unknown argument type '" + obj.GetType() + "'"); } androidJavaObject = AndroidJavaObject.AndroidJavaObjectDeleteLocalRef(AndroidJNIHelper.CreateJavaRunnable((AndroidJavaRunnable)obj)); } return androidJavaObject; } // Token: 0x06003726 RID: 14118 RVA: 0x0005C974 File Offset: 0x0005AB74 public static void DeleteJNIArgArray(object[] args, jvalue[] jniArgs) { int num = 0; foreach (object obj in args) { if (obj is string || obj is AndroidJavaRunnable || obj is Array) { AndroidJNISafe.DeleteLocalRef(jniArgs[num].l); } num++; } } // Token: 0x06003727 RID: 14119 RVA: 0x0005C9D8 File Offset: 0x0005ABD8 public static IntPtr ConvertToJNIArray(Array array) { Type elementType = array.GetType().GetElementType(); IntPtr intPtr; if (AndroidReflection.IsPrimitive(elementType)) { if (elementType == typeof(int)) { intPtr = AndroidJNISafe.ToIntArray((int[])array); } else if (elementType == typeof(bool)) { intPtr = AndroidJNISafe.ToBooleanArray((bool[])array); } else if (elementType == typeof(byte)) { intPtr = AndroidJNISafe.ToByteArray((byte[])array); } else if (elementType == typeof(short)) { intPtr = AndroidJNISafe.ToShortArray((short[])array); } else if (elementType == typeof(long)) { intPtr = AndroidJNISafe.ToLongArray((long[])array); } else if (elementType == typeof(float)) { intPtr = AndroidJNISafe.ToFloatArray((float[])array); } else if (elementType == typeof(double)) { intPtr = AndroidJNISafe.ToDoubleArray((double[])array); } else if (elementType == typeof(char)) { intPtr = AndroidJNISafe.ToCharArray((char[])array); } else { intPtr = IntPtr.Zero; } } else if (elementType == typeof(string)) { string[] array2 = (string[])array; int length = array.GetLength(0); IntPtr intPtr2 = AndroidJNISafe.FindClass("java/lang/String"); IntPtr intPtr3 = AndroidJNI.NewObjectArray(length, intPtr2, IntPtr.Zero); for (int i = 0; i < length; i++) { IntPtr intPtr4 = AndroidJNISafe.NewStringUTF(array2[i]); AndroidJNI.SetObjectArrayElement(intPtr3, i, intPtr4); AndroidJNISafe.DeleteLocalRef(intPtr4); } AndroidJNISafe.DeleteLocalRef(intPtr2); intPtr = intPtr3; } else { if (elementType != typeof(AndroidJavaObject)) { throw new Exception("JNI; Unknown array type '" + elementType + "'"); } AndroidJavaObject[] array3 = (AndroidJavaObject[])array; int length2 = array.GetLength(0); IntPtr[] array4 = new IntPtr[length2]; IntPtr intPtr5 = AndroidJNISafe.FindClass("java/lang/Object"); IntPtr intPtr6 = IntPtr.Zero; for (int j = 0; j < length2; j++) { if (array3[j] != null) { array4[j] = array3[j].GetRawObject(); IntPtr rawClass = array3[j].GetRawClass(); if (intPtr6 != rawClass) { if (intPtr6 == IntPtr.Zero) { intPtr6 = rawClass; } else { intPtr6 = intPtr5; } } } else { array4[j] = IntPtr.Zero; } } IntPtr intPtr7 = AndroidJNISafe.ToObjectArray(array4, intPtr6); AndroidJNISafe.DeleteLocalRef(intPtr5); intPtr = intPtr7; } return intPtr; } // Token: 0x06003728 RID: 14120 RVA: 0x0005CC94 File Offset: 0x0005AE94 public static ArrayType ConvertFromJNIArray(IntPtr array) { Type elementType = typeof(ArrayType).GetElementType(); ArrayType arrayType; if (AndroidReflection.IsPrimitive(elementType)) { if (elementType == typeof(int)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromIntArray(array)); } else if (elementType == typeof(bool)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromBooleanArray(array)); } else if (elementType == typeof(byte)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromByteArray(array)); } else if (elementType == typeof(short)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromShortArray(array)); } else if (elementType == typeof(long)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromLongArray(array)); } else if (elementType == typeof(float)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromFloatArray(array)); } else if (elementType == typeof(double)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromDoubleArray(array)); } else if (elementType == typeof(char)) { arrayType = (ArrayType)((object)AndroidJNISafe.FromCharArray(array)); } else { arrayType = default(ArrayType); } } else if (elementType == typeof(string)) { int arrayLength = AndroidJNISafe.GetArrayLength(array); string[] array2 = new string[arrayLength]; for (int i = 0; i < arrayLength; i++) { IntPtr objectArrayElement = AndroidJNI.GetObjectArrayElement(array, i); array2[i] = AndroidJNISafe.GetStringUTFChars(objectArrayElement); AndroidJNISafe.DeleteLocalRef(objectArrayElement); } arrayType = (ArrayType)((object)array2); } else { if (elementType != typeof(AndroidJavaObject)) { throw new Exception("JNI: Unknown generic array type '" + elementType + "'"); } int arrayLength2 = AndroidJNISafe.GetArrayLength(array); AndroidJavaObject[] array3 = new AndroidJavaObject[arrayLength2]; for (int j = 0; j < arrayLength2; j++) { IntPtr objectArrayElement2 = AndroidJNI.GetObjectArrayElement(array, j); array3[j] = new AndroidJavaObject(objectArrayElement2); AndroidJNISafe.DeleteLocalRef(objectArrayElement2); } arrayType = (ArrayType)((object)array3); } return arrayType; } // Token: 0x06003729 RID: 14121 RVA: 0x0005CEB8 File Offset: 0x0005B0B8 public static IntPtr GetConstructorID(IntPtr jclass, object[] args) { return AndroidJNIHelper.GetConstructorID(jclass, _AndroidJNIHelper.GetSignature(args)); } // Token: 0x0600372A RID: 14122 RVA: 0x0005CEDC File Offset: 0x0005B0DC public static IntPtr GetMethodID(IntPtr jclass, string methodName, object[] args, bool isStatic) { return AndroidJNIHelper.GetMethodID(jclass, methodName, _AndroidJNIHelper.GetSignature(args), isStatic); } // Token: 0x0600372B RID: 14123 RVA: 0x0005CF00 File Offset: 0x0005B100 public static IntPtr GetMethodID(IntPtr jclass, string methodName, object[] args, bool isStatic) { return AndroidJNIHelper.GetMethodID(jclass, methodName, _AndroidJNIHelper.GetSignature(args), isStatic); } // Token: 0x0600372C RID: 14124 RVA: 0x0005CF24 File Offset: 0x0005B124 public static IntPtr GetFieldID(IntPtr jclass, string fieldName, bool isStatic) { return AndroidJNIHelper.GetFieldID(jclass, fieldName, _AndroidJNIHelper.GetSignature(typeof(ReturnType)), isStatic); } // Token: 0x0600372D RID: 14125 RVA: 0x0005CF50 File Offset: 0x0005B150 public static IntPtr GetConstructorID(IntPtr jclass, string signature) { IntPtr intPtr = IntPtr.Zero; IntPtr intPtr2; try { intPtr = AndroidReflection.GetConstructorMember(jclass, signature); intPtr2 = AndroidJNISafe.FromReflectedMethod(intPtr); } catch (Exception ex) { IntPtr methodID = AndroidJNISafe.GetMethodID(jclass, "", signature); if (!(methodID != IntPtr.Zero)) { throw ex; } intPtr2 = methodID; } finally { AndroidJNISafe.DeleteLocalRef(intPtr); } return intPtr2; } // Token: 0x0600372E RID: 14126 RVA: 0x0005CFC8 File Offset: 0x0005B1C8 public static IntPtr GetMethodID(IntPtr jclass, string methodName, string signature, bool isStatic) { IntPtr intPtr = IntPtr.Zero; IntPtr intPtr2; try { intPtr = AndroidReflection.GetMethodMember(jclass, methodName, signature, isStatic); intPtr2 = AndroidJNISafe.FromReflectedMethod(intPtr); } catch (Exception ex) { IntPtr methodIDFallback = _AndroidJNIHelper.GetMethodIDFallback(jclass, methodName, signature, isStatic); if (!(methodIDFallback != IntPtr.Zero)) { throw ex; } intPtr2 = methodIDFallback; } finally { AndroidJNISafe.DeleteLocalRef(intPtr); } return intPtr2; } // Token: 0x0600372F RID: 14127 RVA: 0x0005D040 File Offset: 0x0005B240 private static IntPtr GetMethodIDFallback(IntPtr jclass, string methodName, string signature, bool isStatic) { try { return (!isStatic) ? AndroidJNISafe.GetMethodID(jclass, methodName, signature) : AndroidJNISafe.GetStaticMethodID(jclass, methodName, signature); } catch (Exception) { } return IntPtr.Zero; } // Token: 0x06003730 RID: 14128 RVA: 0x0005D094 File Offset: 0x0005B294 public static IntPtr GetFieldID(IntPtr jclass, string fieldName, string signature, bool isStatic) { IntPtr intPtr = IntPtr.Zero; IntPtr intPtr2; try { intPtr = AndroidReflection.GetFieldMember(jclass, fieldName, signature, isStatic); intPtr2 = AndroidJNISafe.FromReflectedField(intPtr); } catch (Exception ex) { IntPtr intPtr3 = ((!isStatic) ? AndroidJNISafe.GetFieldID(jclass, fieldName, signature) : AndroidJNISafe.GetStaticFieldID(jclass, fieldName, signature)); if (!(intPtr3 != IntPtr.Zero)) { throw ex; } intPtr2 = intPtr3; } finally { AndroidJNISafe.DeleteLocalRef(intPtr); } return intPtr2; } // Token: 0x06003731 RID: 14129 RVA: 0x0005D11C File Offset: 0x0005B31C public static string GetSignature(object obj) { string text; if (obj == null) { text = "Ljava/lang/Object;"; } else { Type type = ((!(obj is Type)) ? obj.GetType() : ((Type)obj)); if (AndroidReflection.IsPrimitive(type)) { if (type.Equals(typeof(int))) { text = "I"; } else if (type.Equals(typeof(bool))) { text = "Z"; } else if (type.Equals(typeof(byte))) { text = "B"; } else if (type.Equals(typeof(short))) { text = "S"; } else if (type.Equals(typeof(long))) { text = "J"; } else if (type.Equals(typeof(float))) { text = "F"; } else if (type.Equals(typeof(double))) { text = "D"; } else if (type.Equals(typeof(char))) { text = "C"; } else { text = ""; } } else if (type.Equals(typeof(string))) { text = "Ljava/lang/String;"; } else if (obj is AndroidJavaProxy) { AndroidJavaObject androidJavaObject = new AndroidJavaObject(((AndroidJavaProxy)obj).javaInterface.GetRawClass()); text = "L" + androidJavaObject.Call("getName", new object[0]) + ";"; } else if (type.Equals(typeof(AndroidJavaRunnable))) { text = "Ljava/lang/Runnable;"; } else if (type.Equals(typeof(AndroidJavaClass))) { text = "Ljava/lang/Class;"; } else { if (type.Equals(typeof(AndroidJavaObject))) { if (obj == type) { return "Ljava/lang/Object;"; } AndroidJavaObject androidJavaObject2 = (AndroidJavaObject)obj; using (AndroidJavaObject androidJavaObject3 = androidJavaObject2.Call("getClass", new object[0])) { return "L" + androidJavaObject3.Call("getName", new object[0]) + ";"; } } if (!AndroidReflection.IsAssignableFrom(typeof(Array), type)) { throw new Exception(string.Concat(new object[] { "JNI: Unknown signature for type '", type, "' (obj = ", obj, ") ", (type != obj) ? "instance" : "equal" })); } if (type.GetArrayRank() != 1) { throw new Exception("JNI: System.Array in n dimensions is not allowed"); } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('['); stringBuilder.Append(_AndroidJNIHelper.GetSignature(type.GetElementType())); text = stringBuilder.ToString(); } } return text; } // Token: 0x06003732 RID: 14130 RVA: 0x0005D458 File Offset: 0x0005B658 public static string GetSignature(object[] args) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('('); foreach (object obj in args) { stringBuilder.Append(_AndroidJNIHelper.GetSignature(obj)); } stringBuilder.Append(")V"); return stringBuilder.ToString(); } // Token: 0x06003733 RID: 14131 RVA: 0x0005D4BC File Offset: 0x0005B6BC public static string GetSignature(object[] args) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('('); foreach (object obj in args) { stringBuilder.Append(_AndroidJNIHelper.GetSignature(obj)); } stringBuilder.Append(')'); stringBuilder.Append(_AndroidJNIHelper.GetSignature(typeof(ReturnType))); return stringBuilder.ToString(); } } }