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

create instance of android.accounts.Account in qt c++ code

我正在尝试使用来自 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 的代码段错误(打印 "Creating","Inserting" 未打印):

JNI ERROR (app bug): accessed deleted global reference 0x100e46
JNI ERROR (app bug): accessed deleted global reference 0xe46

我读到如果我调用带有错误签名的方法,但签名是正确的(参见 here),就会发生这种情况。

从外观上看,您创建字符串的方式导致了您的问题。

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