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

Android 错误:JNI错误(应用程序错误):访问了过时的全局引用,android,mono,xamarin.android,monodevelop,xamarin,Android,Mono,Xamarin.android,Monodevelop,Xamarin,我得到了这个错误 JNI错误(应用程序错误):当我在Android OS v4中运行我的应用程序时,访问了过时的全局引用,但当我在Android v2.3中运行相同的应用程序时,我没有收到此错误 此错误发生在我调用AsyncTask类的地方,在这里我将字符串数组作为参数传递 有谁能帮我一下吗?当您使用不正确的参数类型调用方法时,会发生此错误 确保您的方法签名与您要传递的内容完全匹配。对于字符串数组: jmethodID mid = env->GetMethodID(cls, methodN

我得到了这个错误 JNI错误(应用程序错误):当我在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为null。(在获取jclass和jmethodID后,最好始终检查它们是否为null)

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


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

这适用于kotlin:


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

我记得读到,ICS将对可能的多线程错误进行更严格的验证,也许你刚刚碰到了那个?@Crossle。。。朋友,我是android新手,面临同样的问题,请告诉我如何实现你的代码。。我正在纠正过去3周的错误:(仅供将来参考,我将
jlong
拼写为
long
,这导致了同样的错误,非常有用。在我的例子中,我在执行CallVoidMethod()调用时省略了方法的一个声明参数。这与“调用参数类型不正确的方法时发生”。