首页 > 其他 > 详细

JniHelper

时间:2014-08-08 15:49:16      阅读:370      评论:0      收藏:0      [点我收藏+]
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));
            }
        }
    }
}

 

JniHelper,布布扣,bubuko.com

JniHelper

原文:http://www.cnblogs.com/123ing/p/3899317.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!