我收到此错误 JNI ERROR(app bug):访问过时的全局参考当我在Android OS v4中运行我的应用程序时,但是当我在Android v2.3中运行相同的应用程序时,我没有收到此错误。
此错误发生在我调用AsyncTask类的位置,我将字符串数组作为参数传递
任何人都可以帮助我吗?
答案 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)签名也可能会失败,并且会使调试极为沮丧。