我正在尝试使用qt c ++代码中的android AccountManager。要添加帐户,我想创建android.accounts.Account
的实例,我尝试使用此代码执行此操作:
jstring jUsername = QAndroidJniObject::fromString(username).object<jstring>();
jstring jPassword = QAndroidJniObject::fromString(password).object<jstring>();
jstring jType = QAndroidJniObject::fromString(type).object<jstring>();
qDebug()<<"Creating";
QAndroidJniObject accountObject("android.accounts.Account","(Ljava/lang/String;Ljava/lang/String;)V",jUsername,jType);
qDebug()<<"Inserting";
代码段错误在创建accountObject
的行(&#34;正在创建&#34;打印,&#34;插入&#34;不是):
JNI ERROR (app bug): accessed deleted global reference 0x100e46
JNI ERROR (app bug): accessed deleted global reference 0xe46
如果我调用带有错误签名的方法,但签名是正确的(参见here),我就会读到这种情况。
答案 0 :(得分:2)
从外观上看,你创建字符串的方式正在引发你的问题。
jstring jUsername = QAndroidJniObject::fromString(username).object<jstring>();
这样做是创建一个匿名临时QAndroidJniObject
(由fromString
返回),然后从中提取包裹的jobject
(并将其转换为jstring
) 。当该语句的执行完成时QAndroidJniObject
的生命周期结束,并且它将保存到包装的jobject
的引用将被释放。
您可以将代码更改为以下内容:
auto qjUsername = QAndroidJniObject::fromString(username);
auto jUsername = qjUsername.object<jstring>();
或者:
jstring jUsername = env->NewLocalRef(QAndroidJniObject::fromString(username).object<jstring>());
假设你有办法获得JNIEnv*
。
如果您创建了新的引用,那么当您不再需要时,也应该使用DeleteLocalRef
将其删除。