Niu*_*ity 4 c# java-native-interface android unity-game-engine
我在开发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);
}
}Run Code Online (Sandbox Code Playgroud)
但是,如果我没有按如下方式将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);
}
}Run Code Online (Sandbox Code Playgroud)
但是在我的应用程序中,将调用AndroidJavaObject的阻塞函数,因此我必须使用一个线程.第一个代码中的问题是什么?是因为unity3d不支持线程中的AndroidJavaObject吗?请帮忙,谢谢!
哈哈,我已经解决了.只需将线程附加到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();
}Run Code Online (Sandbox Code Playgroud)
当线程完成时,Donot忘记分离.
| 归档时间: |
|
| 查看次数: |
2889 次 |
| 最近记录: |