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