错误:JNI错误(app bug):访问陈旧的全局引用

时间:2012-08-22 10:58:44

标签: android mono xamarin.android monodevelop xamarin

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

此错误发生在我调用AsyncTask类的位置,我将字符串数组作为参数传递

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:14)

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

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

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为null才可用。 (在获取它们之后总是将jclass和jmethodID检查为null)是个好主意。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

答案 3 :(得分:0)

这适用于科特林:

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