#if UNITY_ANDROID using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using UnityEngine; namespace VoxelBusters.CoreLibrary.NativePlugins.Android { public static class JNIUtility { public delegate T NativeJavaObjectConverter(AndroidJavaObject nativeObject); public static List GetList(this AndroidJavaObject nativeObject, NativeJavaObjectConverter converter) { if (nativeObject == null) return null; int size = nativeObject.Call("size"); List list = new List(); for (int eachIndex = 0; eachIndex < size; eachIndex++) { AndroidJNI.PushLocalFrame(128); using (AndroidJavaObject eachNativeObject = nativeObject.Call("get", eachIndex)) { T newObject = converter(eachNativeObject); list.Add(newObject); } AndroidJNI.PopLocalFrame(IntPtr.Zero); } return list; } public static List GetList(this AndroidJavaObject nativeObject) { if (nativeObject == null) return null; T[] array = AndroidJNIHelper.ConvertFromJNIArray(nativeObject.GetRawObject()); return new List(array); } public static string GetString(this AndroidJavaObject javaObject) { if (javaObject == null) return null; return javaObject.Call("toString"); } public static T Get(this AndroidJavaObject nativeObject, string getterName) { if (nativeObject == null) return default(T); T value = nativeObject.Call(getterName); return value; } public static T GetArray(this AndroidJavaObject nativeObject) { if (nativeObject == null) return default(T); T value = AndroidJNIHelper.ConvertFromJNIArray(nativeObject.GetRawObject()); return value; } public static T GetEnum(this AndroidJavaObject nativeObject) where T:struct { int value = nativeObject.Call("ordinal"); return (T)(object)value; } public static Color GetColor(this AndroidJavaObject nativeObject) { float red = nativeObject.Call("getRed") / 255; float green = nativeObject.Call("getRed") / 255; float blue = nativeObject.Call("getRed") / 255; float alpha = nativeObject.Call("alpha") / 255.0f; return new Color(red, green, blue, alpha); } } } #endif