我遇到了这个错误:JNI ERROR (app bug): accessed stale global reference 当我在 Android OS v4 上运行我的应用程序时,但当我在 Android v2.3 上运行相同的应用程序时,并没有出现这个错误。
这个错误发生在我调用 AsyncTask 类时,我将一个字符串数组作为参数传递。
有人可以帮助我吗?
我遇到了这个错误:JNI ERROR (app bug): accessed stale global reference 当我在 Android OS v4 上运行我的应用程序时,但当我在 Android v2.3 上运行相同的应用程序时,并没有出现这个错误。
这个错误发生在我调用 AsyncTask 类时,我将一个字符串数组作为参数传递。
有人可以帮助我吗?
当您使用错误的参数类型调用方法时,会出现此错误。
确保您的方法签名与您传递的内容完全匹配。例如,对于字符串数组:
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当你使用错误的参数类型调用一个方法时,就会出现这个错误。
此外,在这种情况下,您可能在Java代码上注册了与本机代码不同的本机方法。差异可能是您在Java代码和本机代码之间声明更多或更少的参数。
这适用于Kotlin:
除了@krys已经提到的之外,确保Kotlin端的签名与您在JNI代码中完全匹配。即使是简单的Void(避免在返回void的函数签名末尾显式使用Void)签名也可能失败,并使您的调试极其令人沮丧。