Как стать автором
Обновить

Комментарии 19

Не пойму, что мешало загрузить проект в QtCreator и добавить поддержку андроида там
Поддержка в QtCreator Java очень слабая. Хотелось просто всё отлаживать через андроид студию и работать именно с ней, а не в Qt
Извините, но разве Вам не нужно было уже написанное на Qt/C++ приложение под iOS портировать на Android? То есть, нужно было решить задачу настройки проекта для сборки под Android? Ну и разрешить некоторые возможные проблемы, но делать это не с помощью JAVA, а с использованием C++ или если повезёт, то QML?
не. приложение на objective c. Оно использовало SDK, написанное на qt (процентов 10 всего приложения), Поэтому, так сходу сделать нельзя было. Smog1on1the1water постом следующим комментом более точно описал проблему
>> Извините, но разве Вам не нужно было уже написанное…

Нет, не нужно.

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

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

SDK, о которой идет речь — это прикладная библиотека, которая работает со сложными данными и выполняет достаточно интенсивные вычисления в single precision float. Она оптимизирована с использованием SIMD SSE/NEON и работает в (разных!) реальных проектах под Windows, OS X/iOS, Fedora x64/ARM и др. Использование Qt исторически обусловлено рисованием графических 2D примитивов (плюс сторонние ограничения, но речь не о них), и вот сейчас подошла очередь Android, под который данная прикладная библиотека и была безо всяких проблем собрана. Да, проект был загружен в QtCreator, нажаты «те самые две кнопки» для поддержки андроида, внесены необходимые изменения под специфику runtime libraries, и все благополучно собралось.

Так что проблема не с ней, а с UI в виде конечного приложения. Этот UI, как и ранее на других платформах, был выполнен посредством естественных средств, предоставляемых самой средой. Т.е. в данном случае на Java/Android Studio. Повторю еще раз: весь UI сделан на Java, а не на QT/C++, методы прикладной библиотеки благополучно вызываются через JNI.

Такая связка прекрасно работает (и прекрасно зарекомендовала себя на всех предыдущих платформах), но за исключением тех случаев в Android (только в нем и только для текста), когда библиотеке необходимо вывести текст (QPainter::drawText). Для этого требуется наличие созданного экземпляра QApplication, который, в свою очередь, хочет иметь загруженным плагин платформы (в данном случае libqtforandroid). Который и не хочет грузиться. QtCore, QtGui грузятся, а libqtforandroid — нет. Причем QGuiApplication (именно в нем вызывается загрузка платформенного плагина) не может никак увидеть плагин загруженным даже в том случае, если он предварительно был принудительно и успешно загружен «руками» посредством средств самого Qt.

Изучение проблемы выявило, что андроидная реализация Qt отличается своей спецификой от других платформ. В частности, Qt неявно предполагает, что оно было загружено посредством специального Java Qt Activity, которое через JNI загружает .so библиотеку от собранной C++ части, ищет в нем символ main и передает в него управление. Поэтому, если UI выполнено на С++ и собрано в QtCreator — QtActivity.class там неявно присутствует, и загрузка libqtforandroid проходит благополучно. А вот в случае, если UI собирается в Android Studio и Java Activity свое собственное — инициализацию выполнить не удается (по крайней мере, нам пока не удалось найти правильного решения).
Возможно настало время переписать UI на Qt/QML и решить проблему раз и навсегда?
К сожалению, в данном случае это будет сродни заметанию сора под ковер:

1. Android UI уже написано, работает (за исключением ситуации с отрисовкой текста), и тратить ресурсы на его переделку на данном конкретном цикле разработки бессмысленно
2. В следующих циклах разработки планируется отказаться от Qt части в принципе (можно было бы поперечислять причины, но тема совсем не об этом).
Чукча купил себе Камаз, приехал домой, собрал родню у себя в чуме, сидит, рассказывает:
— Хорошая машина Камаз. В кабине тепло, фары тайгу освещают… одно плохо — собаки быстро устают.
Забавный анекдот, вот только не разобравшись в ситуации, ошибочно интерпретировав слова автора и посчитав его идиотом, кем в итоге вы показали себя?

Минус в карму можете себе добавить самостоятельно.
Господа, вы уж извините, но отредактировать статью, а потом отвечать на комментарии к первоначальной версии в таком ключе — это грубое нарушение сетевого этикета, если говорить мягко. Гугл все помнит, я сейчас даже скрин сделал с кеша, раз такие претензии появились.

Было:
Недавно встала передо мною задача портировать приложение с ios на андроид. Основной болью при портировании была работа с SDK приложения. Оно было написано на Qt и исопльзовалось для рисования текста/стрелочек/областей и всего прочего.
Речь идет о портировании приложения, мельком замечание про какое-то загадочное SDK и дальше некое «оно». Логично предположить, что речь о портировании приложения, которое написано на Qt, хотя по факту это вообще написание нативного приложения, которое просто использует библиотеку на Qt

Сейчас добавилось предложение:
То есть, приложение было написано на objective c, и использовало qt библиотеку, а не было qt проектом.
Это меняет картину, и конечно, выставляет меня человеком который даже читать не умеет, не то что думать.

Так что если кому и минус в карму, так точно не мне.
Ну если для вас является нормой считать окружающих идиотами (ну да, ведь это же логично предположить, правильно?), то я вас понял, да. Голова и язык — они же только для этого и предназначены, чтобы травить анекдоты на хабре.
Статья в каком-то смысле претендует на изобретение велосипеда, но в интернете я не нашёл решения… В интернете не так уж много пишут об использовании qt под андроид, а здесь была задача подружить qt и андроид студию.
Конечно, не нашли, так просто никто не делает.
Недавно встала передо мною задача портировать приложение с ios на андроид.
Для этого нужно нажать две кнопки в QtCreator
Всё-таки весь графический интерфейс, как мне показалось, лучше делать в андроид студии
Что? Зачем? Чем лучше? Что значит показалось? Лучше потратить месяц чем нажать две кнопки?

Вы сами себе на ровном месте создали проблемы и героически их преодолели, статья о том, как нельзя делать ни в коем случае.
Для этого нужно нажать две кнопки в QtCreator

Был бы весьма признателен, если бы сказали какие. Не хочу в будущем повторять ошибок.
Открываем .pro файл в QtCreator, появляется нечто вроде этого:
Настройка проекта


В левом нижнем углу нажимаем на play
Play


Выбираем подключенный телефон или симулятор, создастся .apk, зальется и запустится автоматически.

Чтобы появился профиль на первом экране, нужно зайти в настройки QtCreator и указать путь до Android SDK и NDK.
Вы не поняли меня. У меня на Qt небольшая библиотека, которая занимается расчётом и рисованием, а не весь проект. Весь гуи написан был на чистом objective c. Когда я начинал портирование, то передо мною стоял вопрос: на чём реализовывать основную часть? Либо Android Studio, либо всё писать в Qt. Я выбрал андроид студию потому, что по ней масса литературы и я знаком с Java. Знал бы я, что так трудно подключить qt в неё, то сразу бы делал всё в qt.
Очень хорошо смысл проблемы описал Smog1on1the1water немного выше
Для Qt под Android, особенно на момент начального запуска, в итоге сам пришёл к использованию Ministro. Тогда Qt получается отдельно и некоторые вещи, типа по какой поверхности рисовать приложение и что там с потоками обработки событий — Ministro это решает лучше, чем встраиваемый в apk Qt.

Другое дело, что Ministro — совсем внешняя зависимость и недавно у download.qt-project.org кончился SSL-сертификат, и Ministro поэтому отказался запускать наше приложение :-)

Вопрос решился созданием своего зеркала Ministro, о чём и хочу предупредить коллег :-)
>> download.qt-project.org кончился SSL-сертификат, и Ministro поэтому отказался запускать наше приложение

Welcome to DLL hell, now on Android!

А вот про зеркало было бы любопытно послушать для общего развития.
Очень просто, нашёл на cdimages.debian.org зеркало Министро в виде тупо файлов, wget'ом выкачал (опциями типа -np -m) всё, что выкачалось (получилось порядка 1 гигабайта), выложил на свой сервер так, чтобы пути получались такие же, как у qt.io и download.qt-project.org, в нужной мне xml'ке (libs.xml, относящийся к qt 5.4) поменял sed'ом старый адрес сервера на новый, попутно убедившись, что нигде-нигде нет ни одного слова про https, в котором возможны проблемы с сертификатом. В своём приложении в xml настройке Министро прописал свой адрес. Заработало :-)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории