【问题标题】:JNI ERROR (app bug): accessed stale global referenceJNI 错误(应用程序错误):访问过时的全局引用
【发布时间】:2015-05-10 13:40:22
【问题描述】:

我正在尝试嵌入 unity android 插件并遇到问题

这是代码:

public class Veedi : MonoBehaviour {

private static AndroidJavaObject VeediObject= null;
private static AndroidJavaObject activityContext = null;
public int DeveloperID;
public int gameID;
void Start() {
    print("**********START__________");
    if(VeediObject == null) {
        print("**********VeediObject________");

        using(AndroidJavaClass activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        {
            print("**********AndroidJavaClass_________");
            activityContext = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
        }
        print("*******Before Init________");
        using(AndroidJavaClass pluginClass = new AndroidJavaClass("com.play.im.MainActivity")) {
            if(pluginClass != null) {

                activityContext.Call("runOnUiThread", new AndroidJavaRunnable(() => 
                {
                    print("0");
                    int attach = AndroidJNI.AttachCurrentThread();
                print("1");


                    VeediObject = pluginClass.CallStatic<AndroidJavaObject>("instance");
                print("2");
                    VeediObject.Call("setContext", activityContext);
                print("3");
                    VeediObject.Call("initVeedi",gameID,DeveloperID);
                    print("**********after Init__________");

                }));



            }
        }
    }
}

当代码到达该行时:

VeediObject = pluginClass.CallStatic("instance");

它突然出现:

JNI 错误(应用程序错误):访问过时的全局引用

有人建议使用:

AndroidJNI.NewGlobalRef

有人可以帮助解决这个问题吗?有人建议它是因为 JNI 对 java 对象的引用发生了变化

【问题讨论】:

    标签: android unity3d java-native-interface


    【解决方案1】:

    一旦封闭块完成,对 pluginClassC# 引用就会丢失。

    您正在 Android UI 线程 上调用 Java 代码,这意味着您作为 AndroidJavaClass.Call 中的第二个参数传递的 lambda 函数将在稍后执行保存 pluginClass 引用的块丢失后的时间,因此您的错误。

    您应该在 using 块之外保留对 com.play.im.MainActivity 的引用。作为 MonoBehaviour 的成员,您可以保留对它的引用。

    private static AndroidJavaClass pluginClass;
    
    void Start()
    {
      ...
      pluginClass = new AndroidJavaClass("com.play.im.MainActivity");
    
      if(pluginClass != null) {
    
                activityContext.Call("runOnUiThread", new AndroidJavaRunnable(() => 
                {
                    print("0");
                    int attach = AndroidJNI.AttachCurrentThread();
                print("1");
    
    
                    VeediObject = pluginClass.CallStatic<AndroidJavaObject>("instance");
                print("2");
                    VeediObject.Call("setContext", activityContext);
                print("3");
                    VeediObject.Call("initVeedi",gameID,DeveloperID);
                    print("**********after Init__________");
    
                }));
    
    
    
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多