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

问题描述 投票:15回答:4

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

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

有人可以帮我吗?

android mono xamarin.android monodevelop xamarin
4个回答
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是一个好主意)


3
投票

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

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



0
投票

这适用于科特琳:

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

© www.soinside.com 2019 - 2024. All rights reserved.