gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:13:51 25 4
gpt4 key购买 nike

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

关于android - 在 qt c++ 代码中创建 android.accounts.Account 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com