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));
            }
        }
    }
}

 

posted @ 2014-08-08 14:36  ing...  阅读(237)  评论(0编辑  收藏  举报