Russian Qt Forum
Ноябрь 22, 2024, 17:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]  (Прочитано 10141 раз)
0x0001
Гость
« : Сентябрь 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
Гость
« Ответ #1 : Сентябрь 27, 2014, 13:51 »

с Android & java дело не имели, как понимаю надо юзать классы QAndroidJniObject & QAndroidJniEnvironment ?
Да.

Куда вообще смотреть, возможно ли это осуществить?
Да, можно все 3 пункта, синхронно и асинхронно, вопрос только в написании оберток с обеих сторон.
Посмотри Qt Android Extras, там есть пример Qt Notifier. Он покажет, как работать с кастомной Activity. Все связи между java <--> с++ скорее всего будут идти через этот класс. Далее посмотри как вообще работает java в связке с c/c++ - документация по java native interface (JNI). Потом можно глянуть android NDK.

PS Стоит ли цеплять qt, если уже есть готовая java-программа, может просто обновить UI?
PPS размер шрифта нынче бесплатный.
Записан
0x0001
Гость
« Ответ #2 : Сентябрь 27, 2014, 18:39 »

Посмотри 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
Гость
« Ответ #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
Гость
« Ответ #4 : Сентябрь 30, 2014, 19:25 »

Ко всему сказанному хочу добавить, что в простых случаях необязательно наследовать от [
СПАСИБО! Очень ценно!
Записан
vulko
Гость
« Ответ #5 : Октябрь 28, 2014, 12:46 »

оффтоп:

ну нифига вы даете...))
обычно стараются всячески без JNI и нативного кода обойтись, а вы ради всего лишь интерфейса готовы на такой гемор... Улыбающийся

может проще научиться собирать вьюхи в xml? Улыбающийся
Записан
vregess
Гость
« Ответ #6 : Октябрь 29, 2014, 08:50 »

а вы ради всего лишь интерфейса
Это твои домыслы.
Записан
vulko
Гость
« Ответ #7 : Октябрь 29, 2014, 08:59 »

а вы ради всего лишь интерфейса
Это твои домыслы.

Неужели?)

Цитировать
Есть исходники программы на java для Android API 18, программа сложная - работа с SMS/GSM/GPRS/Blutooth & прочее, но юзеру не устраивает GUI.
Записан
vregess
Гость
« Ответ #8 : Октябрь 29, 2014, 09:57 »

И что с того? Ты же пишешь а вы, наверное подразумевая всех участников, иначе бы обращался на ты, как в других постах.
Записан
vulko
Гость
« Ответ #9 : Октябрь 29, 2014, 10:58 »

И что с того? Ты же пишешь а вы, наверное подразумевая всех участников, иначе бы обращался на ты, как в других постах.

да лан, не придирайся к словам. всех ессесно не имел ввиду.

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

имхо автору логичнее было бы освоить xml layout'ы.
Записан
vregess
Гость
« Ответ #10 : Октябрь 29, 2014, 13:03 »

ok.
Согласен, в данном случае, лучше остаться на java.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.077 секунд. Запросов: 20.