Files
Dec2017-Script-Dump/UnityEngine/_AndroidJNIHelper.cs
T
2026-06-04 11:42:34 +02:00

787 lines
22 KiB
C#

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<AndroidJavaObject>("getClass", new object[0]);
AndroidJavaObject androidJavaObject2 = androidJavaObject.Call<AndroidJavaObject>("getComponentType", new object[0]);
string text = androidJavaObject2.Call<string>("getName", new object[0]);
int num = androidJavaClass.Call<int>("getLength", new object[] { obj });
Array array;
if (androidJavaObject2.Call<bool>("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<AndroidJavaObject>("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<AndroidJavaObject>("getClass", new object[0]);
string text = androidJavaObject.Call<string>("getName", new object[0]);
if ("java.lang.Integer" == text)
{
obj2 = obj.Call<int>("intValue", new object[0]);
}
else if ("java.lang.Boolean" == text)
{
obj2 = obj.Call<bool>("booleanValue", new object[0]);
}
else if ("java.lang.Byte" == text)
{
obj2 = obj.Call<byte>("byteValue", new object[0]);
}
else if ("java.lang.Short" == text)
{
obj2 = obj.Call<short>("shortValue", new object[0]);
}
else if ("java.lang.Long" == text)
{
obj2 = obj.Call<long>("longValue", new object[0]);
}
else if ("java.lang.Float" == text)
{
obj2 = obj.Call<float>("floatValue", new object[0]);
}
else if ("java.lang.Double" == text)
{
obj2 = obj.Call<double>("doubleValue", new object[0]);
}
else if ("java.lang.Character" == text)
{
obj2 = obj.Call<char>("charValue", new object[0]);
}
else if ("java.lang.String" == text)
{
obj2 = obj.Call<string>("toString", new object[0]);
}
else if ("java.lang.Class" == text)
{
obj2 = new AndroidJavaClass(obj.GetRawObject());
}
else if (androidJavaObject.Call<bool>("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<ArrayType>(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<ReturnType>(IntPtr jclass, string methodName, object[] args, bool isStatic)
{
return AndroidJNIHelper.GetMethodID(jclass, methodName, _AndroidJNIHelper.GetSignature<ReturnType>(args), isStatic);
}
// Token: 0x0600372C RID: 14124 RVA: 0x0005CF24 File Offset: 0x0005B124
public static IntPtr GetFieldID<ReturnType>(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, "<init>", 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<string>("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<AndroidJavaObject>("getClass", new object[0]))
{
return "L" + androidJavaObject3.Call<string>("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<ReturnType>(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();
}
}
}