15

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

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

任何人都可以帮助我吗?

4

4 回答 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 后总是检查它们是否为空是个好主意)

于 2013-01-10T04:35:38.863 回答
3

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

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

于 2013-04-19T05:11:26.793 回答
1

ICS 中的 JNI 本地引用更改

于 2013-07-19T10:14:58.413 回答
0

这适用于 kotlin:

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

于 2020-04-07T18:10:59.950 回答