【问题标题】:Error: JNI ERROR (app bug): accessed stale global reference错误:JNI 错误(应用程序错误):访问过时的全局引用
【发布时间】:2012-08-22 10:58:43
【问题描述】:

我收到此错误 JNI 错误(应用程序错误):访问过时的全局参考当我在 Android OS v4 中运行我的应用程序时,但当我在 Android v2.3 中运行相同的应用程序时,我没有收到此错误。 p>

这个错误发生在我调用 AsyncTask 类的地方,我将一个字符串数组作为参数传递

有人可以帮帮我吗?

【问题讨论】:

标签: android mono xamarin.android monodevelop xamarin


【解决方案1】:

当您调用具有不正确参数类型的方法时会发生此错误。

确保您的方法签名与您传递的完全匹配。对于字符串数组:

jmethodID mid = env->GetMethodID(cls, methodName, "([Ljava/lang/String;)V");

如果你自己创建它,它看起来像这样:

jclass stringCls = env->FindClass("java/lang/String");
jobjectArray mStringArray = env->NewObjectArray( mSize, stringCls, NULL);

在您的具体情况下,您很可能不会在 Android 2.3 上看到崩溃,因为您正在调用 AsyncTask.execute(),它在 API 11 (Android 3.0) 之前不可用,并且您的 jmethodID 为空。 (获取 jclass 和 jmethodID 后总是检查它们是否为空是个好主意)

【讨论】:

  • 仅供参考,我将jlong 拼错为long,导致同样的错误
  • 非常有帮助。在我的例子中,我在执行 CallVoidMethod() 调用时省略了方法声明的参数之一。这与“调用参数类型不正确的方法时发生”是一致的。
【解决方案2】:

当您调用具有不正确参数类型的方法时会发生此错误。

另外,在这种情况下,您可能会在与本机代码不同的 Java 代码上注册本机方法。区别在于您在 Java 代码和本机代码之间声明了更多或更少的参数。

【讨论】:

    【解决方案3】:

    【讨论】:

    【解决方案4】:

    这适用于 kotlin:

    要补充@krys 已经提到的内容,请确保 Kotlin 端的签名与您在 JNI 代码中的签名完全匹配。即使是 kotlin 引用末尾的简单 Void(避免在 JNI 端返回 void 的函数签名末尾显式 Void)签名也可能会失败,并使您的调试非常沮丧。

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多