Unity多线程调用安卓方法闪退解决方法

在 Unity 中使用安卓 AAR/JAR 插件时,如果在主线程中调用安卓 java 方法,可以正常调用,但新开一个线程调用时,将会闪退。这里记录下解决方法。
问题复现
有如下测试代码,生成一个安卓对象,并调用其 JAVA 实例方法 TestFunc。
1.同步调用(正常)
在 Unity 主线程中调用安卓方法,即同步调用:
void Start()
{
androidObj = new AndroidJavaObject("com.azimiao.test.class1");
}
void CallAndroidFunc(params object[] test)
{
androidObj?.Call("TestFunc",test);
}
安卓插件内的方法被正常调用。
2.异步线程调用(闪退,错误调用方法)
尝试在另一个线程内调用安卓方法:
void CallAndroidFunc(params object[] test)
{
testThread = new Thread(() =>
{
androidObj?.Call("TestFunc", test);
});
testThread.Start();
}
执行时,Unity 打包出的 APK 将会直接闪退。
解决问题
对于AndroidJNI.AttachCurrentThread
,文档有如下描述:
- 将当前线程附加到 Java (Dalvik) VM。
- 必须先将线程附加到 VM,然后才能进行其他任何 JNI 调用。
因此,将线程调用方法进行如下修改:
void Start()
{
androidObj = new AndroidJavaObject("com.azimiao.test.class1");
}
void CallAndroidFunc(params object[] test)
{
testThread = new Thread(() =>
{
AndroidJNI.AttachCurrentThread();
ndroidObj?.Call("TestFunc", test);
});
testThread.Start();
}
修改之后,问题解决。