Russian Qt Forum
Март 29, 2024, 12:54
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Qt Embedded
>
Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено] (Прочитано 9576 раз)
0x0001
Гость
Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
:
Сентябрь 27, 2014, 13:22 »
Здравствуйте!
Есть исходники программы на java для Android API 18, программа сложная - работа с SMS/GSM/GPRS/Blutooth & прочее, но юзеру не устраивает GUI.
Задача
:
Имея исходники GUI Qt5.4 приложения, внедрить это java приложение в Qt5.4 приложение и скомпилировать все для Android 4.3.1.
с Android & java дело не имели, как понимаю надо юзать классы QAndroidJniObject & QAndroidJniEnvironment ?
GUI(View) отображает(и управляет) некоторой Моделью данных, тут в принципе достаточно осуществить Обмен сырыми данными между java & Qt5.4, модель, в принципе можно заполнять на стороне C++(Qt).
т.е. понадобится примерно такой интерфейс:
1. Пересылать запросы на java сторону (например, запросить некоторые данные полученные по bluetooth 3.0)
2. Получить Ответ
3. Получать асинхронные сообщения (сигналы) от java , например пришла SMS
Куда вообще смотреть, возможно ли это осуществить ? Спасибо!
«
Последнее редактирование: Сентябрь 27, 2014, 23:22 от 0x0001
»
Записан
vregess
Гость
Re: Android API18 (java) + Qt 5.3 (C++ & QML), data Трансферинг
«
Ответ #1 :
Сентябрь 27, 2014, 13:51 »
Цитата: 0x0001 от Сентябрь 27, 2014, 13:22
с Android & java дело не имели, как понимаю надо юзать классы QAndroidJniObject & QAndroidJniEnvironment ?
Да.
Цитата: 0x0001 от Сентябрь 27, 2014, 13:22
Куда вообще смотреть, возможно ли это осуществить?
Да, можно все 3 пункта, синхронно и асинхронно, вопрос только в написании оберток с обеих сторон.
Посмотри Qt Android Extras, там есть пример Qt Notifier. Он покажет, как работать с кастомной Activity. Все связи между java <--> с++ скорее всего будут идти через этот класс. Далее посмотри как вообще работает java в связке с c/c++ - документация по java native interface (JNI). Потом можно глянуть android NDK.
PS Стоит ли цеплять qt, если уже есть готовая java-программа, может просто обновить UI?
PPS размер шрифта нынче бесплатный.
Записан
0x0001
Гость
Re: Android API18 (java) + Qt 5.3 (C++ & QML), data Трансферинг
«
Ответ #2 :
Сентябрь 27, 2014, 18:39 »
Цитата: ck от Сентябрь 27, 2014, 13:51
Посмотри Qt Android Extras, там есть пример Qt Notifier. Он покажет, как работать с кастомной Activity. Все связи между java
Спасибо!
как раз то что надо, импортировал Весь java Eclipse проект в QtCreator проект (юзаю самобьюлд Qt5.4.0), ВСЕ заработало, Qt QML GUI работает с java... кстати QtCreator даже удобнее для чисто java проектов чем Eclipse, за исключением отсутствия контекстного Хелпа по библиотекам...
«
Последнее редактирование: Сентябрь 27, 2014, 23:20 от 0x0001
»
Записан
iLya84a
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #3 :
Сентябрь 29, 2014, 10:18 »
Ко всему сказанному хочу добавить, что в простых случаях необязательно наследовать от
org.qtproject.qt5.android.bindings.QtActivity
, чтобы связать Qt и Java. Приведу код своего пикера видео-файлов:
Код:
package org.qtproject.qt5.android.bindings;
import android.content.Intent;
import android.net.Uri;
import android.util.Log;
import android.content.Context;
import android.database.Cursor;
import android.provider.MediaStore;
public class FilePicker {
public static Intent createChooseVideoIntent() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType("video/mp4");
return intent;
}
public static String getFileName(Context context, Uri uri) {
String fileName = "";
Cursor cursor = null;
try {
String[] projection = { MediaStore.Video.Media.DISPLAY_NAME };
cursor = context.getContentResolver().query(uri, projection, null, null, null);
int nameIndex = cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DISPLAY_NAME);
cursor.moveToFirst();
fileName = cursor.getString(nameIndex);
} finally {
if (cursor != null) {
cursor.close();
}
}
return fileName;
}
}
Хорошо видно, что класс содержит только статические методы.
На стороне С++ сохраняю интент:
Код:
QAndroidJniObject intent = QAndroidJniObject::callStaticObjectMethod(
"org/qtproject/qt5/android/bindings/FilePicker",
"createChooseVideoIntent",
"()Landroid/content/Intent;");
Стартую активити с помощью
QtAndroid::startActivity
, не обращаясь к Java:
Код:
const int REQUEST_CODE = 42; // Any unique number
...
QtAndroid::startActivity(intent, REQUEST_CODE, this);
Последним параметром передаю указатель на объект класса, реализующего интерфейс
QAndroidActivityResultReceiver
Результат получаю асинхронно. При этом вызывается моя реализация метода
handleActivityResult
:
Код:
void FilePicker::handleActivityResult(int receiverRequestCode, int resultCode, const QAndroidJniObject &data)
{
if (receiverRequestCode == REQUEST_CODE && resultCode == RESULT_OK) {
QAndroidJniObject videoUri = data.callObjectMethod(
"getData",
"()Landroid/net/Uri;");
QAndroidJniObject videoFile = QAndroidJniObject::callStaticObjectMethod(
"org/qtproject/qt5/android/bindings/FilePicker",
"getFileName",
"(Landroid/content/Context;Landroid/net/Uri;)Ljava/lang/String;",
QtAndroid::androidActivity().object<jobject>(),
videoUri.object<jobject>());
emit filePicked(videoFile.toString());
}
}
В этом методе получаю текущий контекст с помощью метода
QtAndroid::androidActivity()
и передаю его в свой статический метод.
Преимущество такого подхода в легкой интеграции с существующим проектом.
Записан
0x0001
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #4 :
Сентябрь 30, 2014, 19:25 »
Цитата: iLya84a от Сентябрь 29, 2014, 10:18
Ко всему сказанному хочу добавить, что в простых случаях необязательно наследовать от [
СПАСИБО! Очень ценно!
Записан
vulko
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #5 :
Октябрь 28, 2014, 12:46 »
оффтоп:
ну нифига вы даете...))
обычно стараются всячески без JNI и нативного кода обойтись, а вы ради всего лишь интерфейса готовы на такой гемор...
может проще научиться собирать вьюхи в xml?
Записан
vregess
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #6 :
Октябрь 29, 2014, 08:50 »
Цитата: vulko от Октябрь 28, 2014, 12:46
а вы ради всего лишь интерфейса
Это твои домыслы.
Записан
vulko
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #7 :
Октябрь 29, 2014, 08:59 »
Цитата: ck от Октябрь 29, 2014, 08:50
Цитата: vulko от Октябрь 28, 2014, 12:46
а вы ради всего лишь интерфейса
Это твои домыслы.
Неужели?)
Цитировать
Есть исходники программы на java для Android API 18, программа сложная - работа с SMS/GSM/GPRS/Blutooth & прочее,
но юзеру не устраивает GUI.
Записан
vregess
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #8 :
Октябрь 29, 2014, 09:57 »
И что с того? Ты же пишешь
а вы
, наверное подразумевая всех участников, иначе бы обращался на ты, как в других постах.
Записан
vulko
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #9 :
Октябрь 29, 2014, 10:58 »
Цитата: ck от Октябрь 29, 2014, 09:57
И что с того? Ты же пишешь
а вы
, наверное подразумевая всех участников, иначе бы обращался на ты, как в других постах.
да лан, не придирайся к словам. всех ессесно не имел ввиду.
хотя по мне, так это дрочерство, писать под андройд на qt... просто потому что андройд очень простая платформа. жаба по синтаксису почти плюсы, но в разы удобнее и проще.
имхо автору логичнее было бы освоить xml layout'ы.
Записан
vregess
Гость
Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
«
Ответ #10 :
Октябрь 29, 2014, 13:03 »
ok.
Согласен, в данном случае, лучше остаться на java.
Записан
Страниц: [
1
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...