在 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
将其删除。
我正在尝试使用来自 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
将其删除。