Я пытаюсь использовать 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
Я прочитал, что это происходит, если я вызываю метод с неправильной подписью, но подпись верна (см. Вот).
Судя по всему, то, как вы создаете свои строки, вызывает вашу проблему.
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
когда тебе это больше не нужно.
Других решений пока нет …