首页 > 代码库 > 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)); } } }}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。