在qt c ++代码中创建android.accounts.Account的实例

时间:2016-01-10 15:51:08

标签: android c++ qt java-native-interface qandroidjniobject

我正在尝试使用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),我就会读到这种情况。

1 个答案:

答案 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将其删除。