首页 > 代码库 > JniHelper

JniHelper

using System;using System.Runtime.CompilerServices;using UnityEngine;internal static class JniHelper{    public static void CallStaticSafe(this AndroidJavaClass clazz, string methodName, params object[] args)    {        PushLocalFrame();        try        {            clazz.CallStatic(methodName, args);        }        finally        {            PopLocalFrame();        }    }    public static void CallStaticSafe(this AndroidJavaObject jo, string methodName, params object[] args)    {        PushLocalFrame();        try        {            jo.CallStatic(methodName, args);        }        finally        {            PopLocalFrame();        }    }    private static bool DoesHaveLocalReferenceCount(int count)    {        if (AndroidJNI.PushLocalFrame(count) == 0)        {            AndroidJNI.PopLocalFrame(IntPtr.Zero);            return true;        }        AndroidJNI.ExceptionClear();        return false;    }    public static int GetFreeLocalReferenceCount()    {        int num2 = 0;        int count = 1;        while (DoesHaveLocalReferenceCount(count) && (count < 0x40000000))        {            count *= 2;        }        while (count > 0)        {            int num4 = num2 + count;            if (DoesHaveLocalReferenceCount(num4))            {                num2 = num4;            }            count /= 2;        }        return num2;    }    public static void PopLocalFrame()    {        AndroidJNI.PopLocalFrame(IntPtr.Zero);    }    public static IntPtr PopLocalFrame(IntPtr result)    {        return AndroidJNI.PopLocalFrame(result);    }    public static void PushLocalFrame()    {        PushLocalFrame(0x80);    }    public static void PushLocalFrame(int capacity)    {        if (AndroidJNI.PushLocalFrame(capacity) != 0)        {            AndroidJNI.ExceptionClear();            if (AndroidJNI.PushLocalFrame(0) != 0)            {                throw new InsufficientMemoryException(string.Format("Failed to allocate memory for {0} local JNI references", capacity));            }        }    }}