создать экземпляр android.accounts.Account в коде qt c ++

Я пытаюсь использовать Android AccountManager из кода Qt C ++. Чтобы добавить учетную запись, я хочу создать экземпляр 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";

Код segfaults в строке, где accountObject создан («Создание» печатается, «Вставка» нет):

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

Я прочитал, что это происходит, если я вызываю метод с неправильной подписью, но подпись верна (см. Вот).

0

Решение

Судя по всему, то, как вы создаете свои строки, вызывает вашу проблему.

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 когда тебе это больше не нужно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]