在 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();
}

修改之后,问题解决。

梓喵出没博客(azimiao.com)版权所有,转载请注明链接:https://www.azimiao.com/7859.html
欢迎加入梓喵出没博客交流群:313732000

我来吐槽

*

*