787 lines
22 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|