• 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));
                }
            }
        }
    }
  • 相关阅读:
    定位的原理
    UE4 开发三维GIS 一 场景光影
    UE4 开发三维GIS
    hive
    atlas
    开源AI药物发现TorchDrug安装测试的那些坑
    使用Docker快速搭建zabbix 5
    Docker简易部署
    简单的批量telnet 测试
    ASP.NET Core 中间件
  • 原文地址:https://www.cnblogs.com/123ing/p/3899317.html
Copyright © 2020-2023  润新知