Russian Qt Forum

Qt => Qt Quick => Тема начата: carrygun от Декабрь 18, 2014, 15:02



Название: QML + C++ + Android
Отправлено: carrygun от Декабрь 18, 2014, 15:02
Привет всем. Решил попробовать такую связку и натолкнулся на проблему, решения которой не смог загуглить.
Есть класс на C++, есть QML. Все как надо прокинул через qmlregistertype, и в общем-то на компьютере все работает хорошо. Но когда я собираю на андроид и запускаю то приложение крашится когда обращается к объекту с прокинутым из C++ типом.
Ошибка следующая: Warning: QML import could not be resolved in any of the import paths: имя_моего_типа.
Подскажите чего я не так сделал? Куда копать? Чего почитать?


Название: Re: QML + C++ + Android
Отправлено: Mikhail от Декабрь 18, 2014, 15:10
Откомпилировал свою библиотеку для андроид?
Положил ли откомпилированную библиотеку в Qt для андроид в import paths ?


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 18, 2014, 16:01
У меня просто класс, ничего заоблачного. Как правильно собирать под андроид? В доке есть примеры? Или ссылки какие?


Название: Re: QML + C++ + Android
Отправлено: Alex Custov от Декабрь 18, 2014, 17:01
У меня просто класс, ничего заоблачного. Как правильно собирать под андроид? В доке есть примеры? Или ссылки какие?

Точно также почти что, в настройках Creator указать SDK, NDK, и ant, и пересобирай проект, всё должно работать. А импортируешь ты тип случайно не через "import ТИП"? Ну и минимальный код не помешал бы.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 18, 2014, 17:23
У меня просто класс, ничего заоблачного. Как правильно собирать под андроид? В доке есть примеры? Или ссылки какие?

Точно также почти что, в настройках Creator указать SDK, NDK, и ant, и пересобирай проект, всё должно работать. А импортируешь ты тип случайно не через "import ТИП"? Ну и минимальный код не помешал бы.

Настройки я все указал, приложение собрается на телефоне и запускается нормально. Но по нажатию на кнопку я взаимодействую с объектом прокинутым из C++ и тут приложение на телефоне сразу крашится. В креаторе в консоли ошибка из первого поста.

Кину упрощенный пример.
main.cpp:
Код
C++ (Qt)
#include <QApplication>
#include <QQmlApplicationEngine>
 
#include "myclass.h"
 
int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
 
   qmlRegisterType<MyClass>("mytest", 1, 0, "Mytest");
 
   QQmlApplicationEngine engine;
   engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
 
   return app.exec();
}
 

qml:
Код
C++ (Qt)
   import mytest 1.0;
   ...
   Mytest {
       id: my_test;
       ...
   }
 

Как только я начинаю дергать методы "my_test" то приложение на телефоне закрывается.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 19, 2014, 05:39
Вчера когда уже выключал компьютер и отсоединял телефон, до меня дошло, что мой компонент требует соединения с интернетом, который я конечно же забыл включить на телефоне. Когда включил - все заработало :)

Но появился новый вопрос: как правильно узнать есть ли интернет на устройстве? Где это лучше делать в C++ или QML части?


Название: Re: QML + C++ + Android
Отправлено: navrocky от Декабрь 24, 2014, 00:10
Но появился новый вопрос: как правильно узнать есть ли интернет на устройстве? Где это лучше делать в C++ или QML части?

Покури вот это, как раз оно в Qt 5.4 появилось.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 24, 2014, 05:20
Покури вот это, как раз оно в Qt 5.4 появилось.
Что покурить то?  :)


Название: Re: QML + C++ + Android
Отправлено: navrocky от Декабрь 24, 2014, 19:30
Покури вот это, как раз оно в Qt 5.4 появилось.
Что покурить то?  :)
http://doc.qt.io/qt-5/bearer-management.html

Я ошибся, оно уже и раньше было, а в 5.4 что-то в андроиде добавили.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 25, 2014, 05:34
http://doc.qt.io/qt-5/bearer-management.html

Хорошо, почитаю. Ну и раз уж такая пляска пошла, чтобы не плодить новые темы, может мне кто рассказать как например установить иконку приложению и как закрепить ориентацию экрана (portrait/landscape)?

С экраном гулил, говорят что нужно в манифест написать одну строку, все хорошо, только этот манифест генерируется по новой при деплое проекта. Что делать?


Название: Re: QML + C++ + Android
Отправлено: Mikhail от Декабрь 25, 2014, 17:00
включи сгенерированный манифест в проект и поправь его в редакторе указав ориентацию экрана.
Манифест не будет генерироваться по новой при компиляции проекта


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 25, 2014, 20:58
Буду продолжать вести свой "блог" здесь.

С ориентацией экрана я справился, спасибо за подсказки, но было немножко не так как советовали. Во вкладке "Проекты" нужно было выбрать сборку и запуск для Android. На вкладке сборка в этапе сборки "Собрать Androd APK" есть группа Android с кнопкой создать шаблон. Если ее нажать то как раз таки создается вся эта муть с манифестом, отредактировал xml'ку и все стало хорошо, заодно там можно иконки задавать.

Теперь о проверке наличии интернета на устройстве. Сделал это дело в C++ части:
Код
C++ (Qt)
bool my_class::hasConnection()
{
   QList<QNetworkInterface> interfaces = QNetworkInterface::allInterfaces();
   foreach (const QNetworkInterface &interface, interfaces) {
       if (interface.flags().testFlag(QNetworkInterface::IsUp) && !interface.flags().testFlag(QNetworkInterface::IsLoopBack))
           if (interface.addressEntries().length())
               return true;
   }
 
   return false;
}
 

Проверил на телефоне - вроде бы работает более менее. Критика и варианты лучше приветствуются.
P.S. в гугле мне попадался QML компонент (либа?) NetworkInfo, но мне стало лень разбираться как ее прикручивать.


Название: Re: QML + C++ + Android
Отправлено: navrocky от Декабрь 29, 2014, 20:51
Ну в общем-то и я ничего не нашел в самом QML для опроса состояния сети. Так что тут без вариантов - надо в плюсовом коде всё писать.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Декабрь 30, 2014, 05:32
Пока апнули тему и не забыл, буду продолжать задавать глупые вопросы.

Следующий вопрос касается хранения небольших данных вне приложения, что-то типа настроек. Пока время было дошел только до LocalStorage. Но стоит ли его использовать если у меня не так то и много параметров нужно хранить? Смогу ли я достучаться к этому сторэджу из плюсовой части? Есть ли другие варианты? Примеры? Советы?


Название: Re: QML + C++ + Android
Отправлено: Alex Custov от Декабрь 30, 2014, 11:13
Следующий вопрос касается хранения небольших данных вне приложения, что-то типа настроек

http://doc.qt.io/qt-5/qml-qt-labs-settings-settings.html


Название: Re: QML + C++ + Android
Отправлено: carrygun от Январь 12, 2015, 07:17
Всем привет, с наступившим!

Продолжу вести свой "блог" с Qt и Android.

Во-первых спасибо за Settings, оказалось то что нужно и невероятно просто. Я вот только не нашел где эта штука хранит данные на Android.

Во-вторых есть проблема. Есть MediaPlayer, который проигрывает музыку по ссылкам. С ним все хорошо до того момента, пока приложение (на Android) не в фоне. Как только я переключаю приложение в фон (например, в другом приложении нахожусь или просто на главном экране), то плеер не выдает сигнал MediaPlayer::EndOfMedia, если переключиться в приложение то сигнал сразу же прилетает.
Собственно вопрос: это баг плеера? Или это все из-за Android? Все пропало? Есть выход?


Название: Re: QML + C++ + Android
Отправлено: carrygun от Январь 19, 2015, 06:46
Снова всем привет.

Добрался я таки на выходных до телефона и Qt.
В общем о предыдущей проблеме: это не баг - это фича. Все дело в самом Android: чтобы не кушать лишние ресурсы и батарейку, телефон любит спать при этом прибивая все лишнее. Причем все что живет в главном "гуевом" потоке умирает практически сразу когда ОС считает что оно не нужно, и это называется Activity. И тут либо делать сервис либо держать "WAKE_LOCK".

Почитал я побольше об этом деле и возникло два варианта.
Первый - набросать сервис с медиаплеером и броадкастрисивером, все это на яве и пробиваться пришлось бы туда через JNI. Не самый простой вариант, но реализуемый тем не менее.
Почитав еще побольше об особенностях ОС и ее возможностях решил начать со второго варианта - написать обертку плеера на C++, сунуть ее в тред, а треду уже сделать WAKE_LOCK.

Далее я набросал класс с QMediaPlayer и всякими вкусностями для его управления. После этого написал обертку с тредом и именно эту обертку прокинул в QML. Решил проверить без WAKE_LOCK, и о чудо, все сразу заработало как надо. Скорее всего медиаплеер в Qt собирается в правильный сервис или таки с WAKE_LOCK (у медиаплеера есть метод setWakeMode для таких вещей), так как позже я проверил просто тред с WAKE_LOCK и таймером, и он так же засыпал. В итоге получилось что плеер живет в отдельном треде ("незасыпаемом") и не зависит от жизни активити.

Ну и последний момент. Во-первых, пришлось в тред копировать список ссылок с музыкой, потому что активити умирает, а плееру нужно его где-то брать. Во-вторых, чтобы в "гуе" правильно отображать прогресс и время пришлось немного поменять схему. Если раньше мне сигналил плеер о прогрессе, то теперь я из активити опрашиваю плеер по таймеру. Сделано так потому что сигналы накопятся несмотря на мертвый активити, и при создании нового окна они все придут пачкой, а пачка перерисовок подтормаживает и выглядит некрасиво.

Вот такие дела.  :)


Название: Re: QML + C++ + Android
Отправлено: navrocky от Январь 19, 2015, 11:20
Что-я не понял, т.е. достаточно в приложении сделать отдельный тред, всё приложение прибьется а тред останется? А как-же общая память? Или не тред а отдельный процесс.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Январь 19, 2015, 11:35
Что-я не понял, т.е. достаточно в приложении сделать отдельный тред, всё приложение прибьется а тред останется? А как-же общая память? Или не тред а отдельный процесс.

Практика показала что просто тред уснет, как и завещает мануал андроида. Но тред с WAKE_LOCK по идее должен не давать заснуть, но я до этого не дошел, потому что тут либо Qt'шники в недрах JNI настроили плеер на лок, либо у него по умолчанию так стоит.
В любом случае обошлось без Java кода, это радует.


Название: Re: QML + C++ + Android
Отправлено: navrocky от Январь 19, 2015, 11:46
А ну так более менее понятно, уснуть может. А если процесс будет вытеснен, будет музыка играть (а он первый на вытеснение с учетом жирноты Qt)? Тут, кажется, без сервиса не обойтись.


Название: Re: QML + C++ + Android
Отправлено: carrygun от Январь 19, 2015, 11:58
Я так понимаю такой сценарий запускается когда кончается память и она нужна операционке? Да и там определенный порядок как ей поступать. Если мне не изменяет память, то сначала умирают активити, потом всякие ненужные треды, а потом сервисы по приоритетам. А все потому что нет свопа.  :)


Название: Re: QML + C++ + Android
Отправлено: __Heaven__ от Январь 19, 2015, 12:41
А все потому что нет свопа.  :)
А у меня на samsung s5670 имеется такой.


Название: Re: QML + C++ + Android
Отправлено: kolob от Сентябрь 17, 2015, 13:11
Добрый день.
Вот вы пишите о проблеме:
Цитировать
Во-вторых есть проблема. Есть MediaPlayer, который проигрывает музыку по ссылкам. С ним все хорошо до того момента, пока приложение (на Android) не в фоне. Как только я переключаю приложение в фон (например, в другом приложении нахожусь или просто на главном экране), то плеер не выдает сигнал MediaPlayer::EndOfMedia, если переключиться в приложение то сигнал сразу же прилетает.
Я так понял Вам нужно было чтобы плеер работал когда приложение в фоне.
У меня другая проблема, после выхода (нажатии кн. Home на телефоне), приложение переключается в фоновый режим, а музыка приложения продолжает звучать. Как решить эту проблему? Подскажите.


Название: Re: QML + C++ + Android
Отправлено: alexorleon от Апрель 14, 2016, 13:27
У меня просто класс, ничего заоблачного. Как правильно собирать под андроид? В доке есть примеры? Или ссылки какие?

Привет!
Столкнулся с такой же проблемой, не могу собрать либу под андроид. Не подскажешь как, может инструкция осталась?

Пример qmlextensionplugins из коробки.
TEMPLATE = lib
CONFIG += plugin

17:24:34: Не найден файл .pro приложения, APK не собирается.

при установке выдает:
Не удалось найти Json файл androiddeploy.
Ошибка при сборке/установке проекта qmlextensionplugins (комплект: Android для armeabi-v7a (GCC 4.9, Qt 5.6.0) )
Во время выполнения этапа «Установка на устройство Android»

Сейчас читаю http://doc.qt.io/qt-5/deployment-android.html#androiddeployqt но пока продвижений не наблюдается.


Название: Re: QML + C++ + Android
Отправлено: kolob от Май 24, 2016, 11:45
Всем привет!
Обновил версию Qt до 5.6.0 и начались проблемы. Все поставил по инструкции. Но тестовый вариант не собирается ни как.
Код:
makefile:475: recipe for target 'install_target' failed
process_begin: CreateProcess(NULL, cp -f libTestQML2.so D:/qt_projects/TestQML2-build-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/android-build/libs/armeabi-v7a/libTestQML2.so, ...) failed.
make (e=2): Не удается найти указанный файл.

mingw32-make: [install_target] Error 2 (ignored)
Код:
Application binary is not in output directory: D:/qt_projects/TestQML2-build-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/android-build//libs/armeabi-v7a/libTestQML2.so. Please run 'mingw32-make install INSTALL_ROOT=D:/qt_projects/TestQML2-build-Android_armeabi_v7a_GCC_4_9_Qt_5_6_0-Debug/android-build/' first.
11:32:31: Процесс «C:\Qt\Qt5.6.0\5.6\android_armv7\bin\androiddeployqt.exe» завершился с кодом 7.


Название: Re: QML + C++ + Android
Отправлено: Vilgeforc от Июнь 25, 2016, 14:27
Код:
mingw32-make: [install_target] Error 2 (ignored)


 в самом конце makefile есть строки
Код:
install_target: first FORCE
@test -d $(INSTALL_ROOT)/libs/armeabi-v7a/ || mkdir -p $(INSTALL_ROOT)/libs/armeabi-v7a/
-$(INSTALL_PROGRAM) $(QMAKE_TARGET) $(INSTALL_ROOT)/libs/armeabi-v7a/$(QMAKE_TARGET)
Если $(QMAKE_TARGET) взять в кавычки "$(QMAKE_TARGET)" то оно собирается без ошибок
Не понимаю почему(
Пока вручную правлю, хорошо бы понять, как сказать qmake  самому эти кавычки добавлять.


Название: Re: QML + C++ + Android
Отправлено: navrocky от Июнь 27, 2016, 13:48
Может папка пользователя с пробелами, или где там у вас что лежит?


Название: Re: QML + C++ + Android
Отправлено: Vilgeforc от Июнь 28, 2016, 00:21
папка пользователя с пробелами

Если бы, если бы. Это то и вызывает недоумение. Ни в пути проекта, ни в имени пользователя, ни в пути у ндк сдк и т.д., не то что пробелов и кирилицы нет, даже спец символы убраны.
По сути в мейкфайле у меня это меняет  libTheDemise.so на  "libTheDemise.so". Всё. При этом в первом случае ошибка, во втором успешная сборка. Я в недоумении.