Unity3d开发:JNI错误(app bug):访问陈旧的本地引用0x200001(大小为0的表中的索引0)

时间:2016-09-30 06:00:14

标签: c# android unity3d java-native-interface

我在开发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);
    }


}
&#13;
&#13;
&#13;

但是,如果我没有将AndroidJavaObject放在一个如下的线程中,它将正常运行。

&#13;
&#13;
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);
    }


}
&#13;
&#13;
&#13;

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

1 个答案:

答案 0 :(得分:9)

哈哈,我已经解决了。只需将线程附加到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();
}

当线程完成时,不要忘记分离。