[Родной]: использование функций Java и сторонних библиотек в Qt для Android
Недавно я использую qt для записи приложения Android.
Но у меня есть большой вопрос, могу ли я использовать/называть какой-то родной андроид APIS, например вызов специальной активности?
Например, в Android SDK я вызываю контакты в java:
Intent intent = new Intent (Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult (намерение, PICK_CONTACT);
Есть ли некоторые библиотеки С++-оболочки для API-интерфейсов java android sdk?
Или, если мне нужен какой-то специальный компонент (написанный с помощью java), могу ли я его использовать в моей программе Android-андроида?
Или сделать программу со смешанными страницами/действиями "чистого qt" и "стандартного java" или "С++ android NDK"?
(Я задаю этот вопрос, потому что у меня есть опыт работы с MOSYNC-фреймворком, который был хорошим, но вы были ограничены его собственными библиотеками, вы не могли использовать какие-либо внешние библиотеки или стандартные API-интерфейсы Android...)
Спасибо заранее.
EDIT:
в соответствии с улучшениями в JNI (
http://qt-project.org/doc/qt-5/qtandroidextras-index.html), у меня есть вопрос:
я могу использовать "любые" сторонние библиотеки Android для Android в моем проекте qt? Как я использую эти библиотеки в проектах Java SDK?
Ответы
Ответ 1
Чтобы сделать то, что вы хотите, вам нужно вызвать код Java из вашего кода на С++ через JNI. Для этого я не знаю никаких библиотек-оболочек С++. Вам нужно будет получить Java-виртуальную машину от JNI_OnLoad, и когда вы хотите вызвать метод Java, вам нужно будет подключить виртуальную машину к вашему потоку, с помощью которой вы получите JNIEnv, который вы можете использовать для поиска нужного вам класса и методов вызова в теме. Эта ссылка должна помочь с деталями.
Что касается того, стоит ли использовать QT для разработки приложений для Android, да, если вам нужна кросс-платформенная поддержка и вы хотите развернуть одно и то же приложение на Android, Linux, Windows и т.д. Если вы только разрабатываете приложения для Android, то по моему опыту проще и быстрее использовать Android напрямую.
Ответ 2
Я не уверен, как вы продолжаете работу с Qt для Android. Но на этот момент эта идея официально поддерживается командой KDE (K Desktop Environment). Они называют это проектом KDE Necessitas. И они выпустили первую бета-версию этого проекта в октябре 2012 года.
Поэтому, когда вы устанавливаете Necessitas SDK, вы, вероятно, устанавливаете эти вещи.
- Qt Creator - Qt IDE, настроенная для Android.
- Android NDK - для создания общего объекта из Qt-кода.
- Android SDK - настраивается с поддержкой Qt.
Используя настраиваемый Qt Creator, вы можете
- Создайте проект пользовательского интерфейса Android.
- Создайте пользовательский интерфейс в интегрированном Qt Designer.
- Скомпилируйте код С++ для сборки .so файла и оберните его кодом Java.
- Создайте APK и разверните.
- Отладка APK.
Одна из основных проблем, с которыми я сталкиваюсь в Qt для Android, касается пользовательского интерфейса. Пользовательский интерфейс имеет собственный внешний вид KDE 4.x(тот же, что и на рабочих столах). Темы андроидского интерфейса (Holo и т.д.) Еще не доступны.
И поскольку этот проект все еще бета-версия, я не уверен в доступности классов-оболочек/функций для собственных функций Android. Пожалуйста, просмотрите официальную документацию для более подробной информации.
Надеюсь, что это поможет.
Ответ 3
Вы можете программировать на C/С++ с помощью Android NDK. Вам придется обернуть свою базу данных С++ в статическую библиотеку и загрузить ее через оболочку Java и JNI.
Стандартный NDK не поддерживает RTTI, и многие функциональные возможности стандартного С++ также недоступны, например std::string и т.д. Чтобы решить эту проблему, вы можете перекомпилировать NDK. Дмитрий Москальчук поставляет модифицированную версию NDK, которая поддерживает это в http://www.crystax.net/android/ndk-r3.php. Эта модифицированная версия работает на всех телефонах Android, работающих на процессоре ARM.
Примечание. JNI-вызовы могут значительно снизить вашу производительность. Java не так уж трудна, если вы знаете, как программировать на C/С++. Преимущество Java заключается в том, что приложение может работать на любом устройстве под управлением Android, где приложения NDK зависят от архитектуры, в которой она была скомпилирована.