Название: 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: Код
qml: Код
Как только я начинаю дергать методы "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 появилось. Что покурить то? :)Я ошибся, оно уже и раньше было, а в 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++ части: Код
Проверил на телефоне - вроде бы работает более менее. Критика и варианты лучше приветствуются. 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 Код: 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. Название: Re: QML + C++ + Android Отправлено: Vilgeforc от Июнь 25, 2016, 14:27 Код: mingw32-make: [install_target] Error 2 (ignored) в самом конце makefile есть строки Код: install_target: first FORCE Не понимаю почему( Пока вручную правлю, хорошо бы понять, как сказать qmake самому эти кавычки добавлять. Название: Re: QML + C++ + Android Отправлено: navrocky от Июнь 27, 2016, 13:48 Может папка пользователя с пробелами, или где там у вас что лежит?
Название: Re: QML + C++ + Android Отправлено: Vilgeforc от Июнь 28, 2016, 00:21 папка пользователя с пробелами Если бы, если бы. Это то и вызывает недоумение. Ни в пути проекта, ни в имени пользователя, ни в пути у ндк сдк и т.д., не то что пробелов и кирилицы нет, даже спец символы убраны. По сути в мейкфайле у меня это меняет libTheDemise.so на "libTheDemise.so". Всё. При этом в первом случае ошибка, во втором успешная сборка. Я в недоумении. |