Comments 19
Не пойму, что мешало загрузить проект в QtCreator и добавить поддержку андроида там
+1
Поддержка в QtCreator Java очень слабая. Хотелось просто всё отлаживать через андроид студию и работать именно с ней, а не в Qt
0
Извините, но разве Вам не нужно было уже написанное на Qt/C++ приложение под iOS портировать на Android? То есть, нужно было решить задачу настройки проекта для сборки под Android? Ну и разрешить некоторые возможные проблемы, но делать это не с помощью JAVA, а с использованием C++ или если повезёт, то QML?
+1
не. приложение на objective c. Оно использовало SDK, написанное на qt (процентов 10 всего приложения), Поэтому, так сходу сделать нельзя было. Smog1on1the1water постом следующим комментом более точно описал проблему
+1
>> Извините, но разве Вам не нужно было уже написанное…
Нет, не нужно.
Прикладная библиотека реализует общую для всех платформ бизнес-логику. При этом UI под каждой платформой в общем случае отличается, поскольку решает различные задачи, создается для различных условий и различных/различными сторонними компаниями.
Поэтому речь не о портировании UI вообще, а о создании нового UI свойственными платформе средствами с использованием кросс-платформенной библиотеки, содержащей реализацию бизнес-логики.
Нет, не нужно.
Прикладная библиотека реализует общую для всех платформ бизнес-логику. При этом UI под каждой платформой в общем случае отличается, поскольку решает различные задачи, создается для различных условий и различных/различными сторонними компаниями.
Поэтому речь не о портировании UI вообще, а о создании нового UI свойственными платформе средствами с использованием кросс-платформенной библиотеки, содержащей реализацию бизнес-логики.
+1
Ничего не мешало, так и было сделано. Автор статьи просто акцентировался на злоключениях, поэтому некоторые другие моменты описания исходной задачи были недостаточно ацентированы.
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 свое собственное — инициализацию выполнить не удается (по крайней мере, нам пока не удалось найти правильного решения).
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 свое собственное — инициализацию выполнить не удается (по крайней мере, нам пока не удалось найти правильного решения).
+1
Возможно настало время переписать UI на Qt/QML и решить проблему раз и навсегда?
+1
К сожалению, в данном случае это будет сродни заметанию сора под ковер:
1. Android UI уже написано, работает (за исключением ситуации с отрисовкой текста), и тратить ресурсы на его переделку на данном конкретном цикле разработки бессмысленно
2. В следующих циклах разработки планируется отказаться от Qt части в принципе (можно было бы поперечислять причины, но тема совсем не об этом).
1. Android UI уже написано, работает (за исключением ситуации с отрисовкой текста), и тратить ресурсы на его переделку на данном конкретном цикле разработки бессмысленно
2. В следующих циклах разработки планируется отказаться от Qt части в принципе (можно было бы поперечислять причины, но тема совсем не об этом).
+1
Чукча купил себе Камаз, приехал домой, собрал родню у себя в чуме, сидит, рассказывает:
— Хорошая машина Камаз. В кабине тепло, фары тайгу освещают… одно плохо — собаки быстро устают.
— Хорошая машина Камаз. В кабине тепло, фары тайгу освещают… одно плохо — собаки быстро устают.
0
Забавный анекдот, вот только не разобравшись в ситуации, ошибочно интерпретировав слова автора и посчитав его идиотом, кем в итоге вы показали себя?
Минус в карму можете себе добавить самостоятельно.
Минус в карму можете себе добавить самостоятельно.
-3
Господа, вы уж извините, но отредактировать статью, а потом отвечать на комментарии к первоначальной версии в таком ключе — это грубое нарушение сетевого этикета, если говорить мягко. Гугл все помнит, я сейчас даже скрин сделал с кеша, раз такие претензии появились.
Было:
Сейчас добавилось предложение:
Так что если кому и минус в карму, так точно не мне.
Было:
Недавно встала передо мною задача портировать приложение с ios на андроид. Основной болью при портировании была работа с SDK приложения. Оно было написано на Qt и исопльзовалось для рисования текста/стрелочек/областей и всего прочего.Речь идет о портировании приложения, мельком замечание про какое-то загадочное SDK и дальше некое «оно». Логично предположить, что речь о портировании приложения, которое написано на Qt, хотя по факту это вообще написание нативного приложения, которое просто использует библиотеку на Qt
Сейчас добавилось предложение:
То есть, приложение было написано на objective c, и использовало qt библиотеку, а не было qt проектом.Это меняет картину, и конечно, выставляет меня человеком который даже читать не умеет, не то что думать.
Так что если кому и минус в карму, так точно не мне.
+1
Статья в каком-то смысле претендует на изобретение велосипеда, но в интернете я не нашёл решения… В интернете не так уж много пишут об использовании qt под андроид, а здесь была задача подружить qt и андроид студию.Конечно, не нашли, так просто никто не делает.
Недавно встала передо мною задача портировать приложение с ios на андроид.Для этого нужно нажать две кнопки в QtCreator
Всё-таки весь графический интерфейс, как мне показалось, лучше делать в андроид студииЧто? Зачем? Чем лучше? Что значит показалось? Лучше потратить месяц чем нажать две кнопки?
Вы сами себе на ровном месте создали проблемы и героически их преодолели, статья о том, как нельзя делать ни в коем случае.
0
Для этого нужно нажать две кнопки в QtCreator
Был бы весьма признателен, если бы сказали какие. Не хочу в будущем повторять ошибок.
0
Открываем .pro файл в QtCreator, появляется нечто вроде этого:
В левом нижнем углу нажимаем на play
Выбираем подключенный телефон или симулятор, создастся .apk, зальется и запустится автоматически.
Чтобы появился профиль на первом экране, нужно зайти в настройки QtCreator и указать путь до Android SDK и NDK.
Настройка проекта

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

Выбираем подключенный телефон или симулятор, создастся .apk, зальется и запустится автоматически.
Чтобы появился профиль на первом экране, нужно зайти в настройки QtCreator и указать путь до Android SDK и NDK.
+1
Вы не поняли меня. У меня на Qt небольшая библиотека, которая занимается расчётом и рисованием, а не весь проект. Весь гуи написан был на чистом objective c. Когда я начинал портирование, то передо мною стоял вопрос: на чём реализовывать основную часть? Либо Android Studio, либо всё писать в Qt. Я выбрал андроид студию потому, что по ней масса литературы и я знаком с Java. Знал бы я, что так трудно подключить qt в неё, то сразу бы делал всё в qt.
Очень хорошо смысл проблемы описал Smog1on1the1water немного выше
Очень хорошо смысл проблемы описал Smog1on1the1water немного выше
0
Для Qt под Android, особенно на момент начального запуска, в итоге сам пришёл к использованию Ministro. Тогда Qt получается отдельно и некоторые вещи, типа по какой поверхности рисовать приложение и что там с потоками обработки событий — Ministro это решает лучше, чем встраиваемый в apk Qt.
Другое дело, что Ministro — совсем внешняя зависимость и недавно у download.qt-project.org кончился SSL-сертификат, и Ministro поэтому отказался запускать наше приложение :-)
Вопрос решился созданием своего зеркала Ministro, о чём и хочу предупредить коллег :-)
Другое дело, что Ministro — совсем внешняя зависимость и недавно у download.qt-project.org кончился SSL-сертификат, и Ministro поэтому отказался запускать наше приложение :-)
Вопрос решился созданием своего зеркала Ministro, о чём и хочу предупредить коллег :-)
0
>> download.qt-project.org кончился SSL-сертификат, и Ministro поэтому отказался запускать наше приложение
Welcome to DLL hell, now on Android!
А вот про зеркало было бы любопытно послушать для общего развития.
Welcome to DLL hell, now on Android!
А вот про зеркало было бы любопытно послушать для общего развития.
0
Очень просто, нашёл на cdimages.debian.org зеркало Министро в виде тупо файлов, wget'ом выкачал (опциями типа -np -m) всё, что выкачалось (получилось порядка 1 гигабайта), выложил на свой сервер так, чтобы пути получались такие же, как у qt.io и download.qt-project.org, в нужной мне xml'ке (libs.xml, относящийся к qt 5.4) поменял sed'ом старый адрес сервера на новый, попутно убедившись, что нигде-нигде нет ни одного слова про https, в котором возможны проблемы с сертификатом. В своём приложении в xml настройке Министро прописал свой адрес. Заработало :-)
0
Only those users with full accounts are able to leave comments. Log in, please.
Разработка Android приложений с использованием qt и android studio