zoukankan      html  css  js  c++  java
  • 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));
                }
            }
        }
    }
  • 相关阅读:
    4-1 软件原型设计
    3-1 案例分析
    2-1 编程作业
    1-2阅读任务
    1-1 准备工作
    第十周学习总结
    实验报告2&&第四周课程总结
    Java实验报告(一)&&第三周学习总结
    第三周编程总结
    2019年春季学期第二周作业
  • 原文地址:https://www.cnblogs.com/123ing/p/3899317.html
Copyright © 2011-2022 走看看