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

15

我遇到了这个错误:JNI ERROR (app bug): accessed stale global reference 当我在 Android OS v4 上运行我的应用程序时,但当我在 Android v2.3 上运行相同的应用程序时,并没有出现这个错误。

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

有人可以帮助我吗?


2
我记得在Google开发者发布声明中读到,ICS将对可能的多线程错误进行更严格的验证,也许你只是碰巧遇到了这个问题? - skolima
4个回答

15

当您使用错误的参数类型调用方法时,会出现此错误。

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

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,导致了相同的错误。 - ZdaR
非常有帮助。在我的情况下,当我执行CallVoidMethod()调用时,我忽略了其中一个方法声明的参数。这与“使用不正确的参数类型调用方法时发生”的情况一致。 - Swampie

3

当你使用错误的参数类型调用一个方法时,就会出现这个错误。

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


1

@Crossle... 伙计,我是Android的新手,面临着同样的问题http://stackoverflow.com/questions/21423036/sqlite3-exception-database-disk-image-is-malformed,请告诉我如何实现你的代码...我已经纠正了它三个星期了:( - Maveňツ

0

这适用于Kotlin:

除了@krys已经提到的之外,确保Kotlin端的签名与您在JNI代码中完全匹配。即使是简单的Void(避免在返回void的函数签名末尾显式使用Void)签名也可能失败,并使您的调试极其令人沮丧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接