当我在 Android OS v4 中运行我的应用程序时,我收到此错误 JNI ERROR(应用程序错误):访问过时的全局参考,但是当我在 Android v2.3 中运行相同的应用程序时,我没有收到此错误。
这个错误发生在我调用 AsyncTask 类的地方,我将一个字符串数组作为参数传递
任何人都可以帮助我吗?
当我在 Android OS v4 中运行我的应用程序时,我收到此错误 JNI ERROR(应用程序错误):访问过时的全局参考,但是当我在 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 后总是检查它们是否为空是个好主意)
当您调用具有不正确参数类型的方法时,会发生此错误。
此外,在这种情况下,您可能会在与本机代码不同的 Java 代码上注册本机方法。不同之处在于您在 Java 代码和本机代码之间声明了更多或更少的参数。
这适用于 kotlin:
要添加@krys 已经提到的内容,请确保 Kotlin 端的签名与您在 JNI 代码中的签名完全匹配。即使是 kotlin 引用末尾的简单 Void(避免在 JNI 端返回 void 的函数签名末尾的显式 Void)签名也可能会失败,并使您的调试非常令人沮丧。