Unity3d开发:JNI ERROR(应用程序错误):访问过时的本地引用0x200001(索引0在大小为0的表中)

本文关键字:开发 索引 0x200001 小为 引用 错误 应用程序 JNI 访问 过时 Unity3d | 更新日期: 2023-09-27 18:09:49

我在开发unity3d项目时使用AndroidJavaObject。我尝试了一个非常简单的代码,如下所示,但它抛出了一个异常,如标题所示。

using UnityEngine;
using System.Collections;
using System.Threading;
public class MainScript : MonoBehaviour {
    // Use this for initialization
    void Start () {
	}
    void OnGUI()
    {
        if (GUI.Button(new Rect(50, 50, 1000, 200), "Open Activity"))
        {
            Debug.Log("pressed");
            Thread t1 = new Thread(new ThreadStart(ListenThread));
            t1.IsBackground = false;
            t1.Start();
        }
        //quit  
        if (Input.GetKey(KeyCode.Escape) || Input.GetKey(KeyCode.Home))
        {
            Application.Quit();
        }
    }
    public static void ListenThread()
    {
        AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string");
        int hash = jo.Call<int>("hashCode");
        Debug.Log(hash);
    }
}

然而,如果我不像下面这样把AndroidJavaObject放在线程中,它将正常运行。

using UnityEngine;
using System.Collections;
using System.Threading;
public class MainScript : MonoBehaviour {
    // Use this for initialization
    void Start () {
	}
    void OnGUI()
    {
        if (GUI.Button(new Rect(50, 50, 1000, 200), "Open Activity"))
        {
            Debug.Log("pressed");
            AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string");
            int hash = jo.Call<int>("hashCode");
            Debug.Log(hash);
        }
        //quit  
        if (Input.GetKey(KeyCode.Escape) || Input.GetKey(KeyCode.Home))
        {
            Application.Quit();
        }
    }
    public static void ListenThread()
    {
        AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string");
        int hash = jo.Call<int>("hashCode");
        Debug.Log(hash);
    }
}

但是在我的应用程序中,AndroidJavaObject的阻塞函数将被调用,所以我必须使用线程。第一个代码有什么问题?是不是因为unity3d在线程中不支持AndroidJavaObject ?请帮忙,谢谢!!

Unity3d开发:JNI ERROR(应用程序错误):访问过时的本地引用0x200001(索引0在大小为0的表中)

哈哈,我解决了。只需将线程附加到AndroidJNI,因为线程需要附加到JVM。代码如下:

public static void ListenThread()
{
  AndroidJNI.AttachCurrentThread();
  AndroidJavaObject jo = new AndroidJavaObject("java.lang.String", "some_string");
  int hash = jo.Call<int>("hashCode");
  Debug.Log(hash);
  AndroidJNI.DetachCurrentThread();
}

当线程即将结束时,不要忘记分离