Russian Qt Forum

Qt => Qt Embedded => Тема начата: 0x0001 от Сентябрь 27, 2014, 13:22



Название: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: 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

Куда вообще смотреть, возможно ли это осуществить ? Спасибо!


Название: Re: Android API18 (java) + Qt 5.3 (C++ & QML), data Трансферинг
Отправлено: vregess от Сентябрь 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 размер шрифта нынче бесплатный.


Название: Re: Android API18 (java) + Qt 5.3 (C++ & QML), data Трансферинг
Отправлено: 0x0001 от Сентябрь 27, 2014, 18:39
Посмотри Qt Android Extras, там есть пример Qt Notifier. Он покажет, как работать с кастомной Activity. Все связи между java
Спасибо!
как раз то что надо, импортировал Весь java Eclipse проект в QtCreator проект (юзаю самобьюлд  Qt5.4.0), ВСЕ заработало, Qt QML GUI работает с java... кстати QtCreator даже удобнее для чисто java проектов чем Eclipse, за исключением отсутствия контекстного Хелпа по библиотекам...


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: iLya84a от Сентябрь 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 (http://qt-project.org/doc/qt-5/qtandroid.html#startActivity), не обращаясь к Java:
Код:
const int REQUEST_CODE = 42; // Any unique number
...
QtAndroid::startActivity(intent, REQUEST_CODE, this);
Последним параметром передаю указатель на объект класса, реализующего интерфейс QAndroidActivityResultReceiver (http://qt-project.org/doc/qt-5/qandroidactivityresultreceiver.html)
Результат получаю асинхронно. При этом вызывается моя реализация метода handleActivityResult (http://qt-project.org/doc/qt-5/qandroidactivityresultreceiver.html#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() (http://qt-project.org/doc/qt-5/qtandroid.html#androidActivity) и передаю его в свой статический метод.

Преимущество такого подхода в легкой интеграции с существующим проектом.


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: 0x0001 от Сентябрь 30, 2014, 19:25
Ко всему сказанному хочу добавить, что в простых случаях необязательно наследовать от [
СПАСИБО! Очень ценно!


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: vulko от Октябрь 28, 2014, 12:46
оффтоп:

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

может проще научиться собирать вьюхи в xml? :)


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: vregess от Октябрь 29, 2014, 08:50
а вы ради всего лишь интерфейса
Это твои домыслы.


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: vulko от Октябрь 29, 2014, 08:59
а вы ради всего лишь интерфейса
Это твои домыслы.

Неужели?)

Цитировать
Есть исходники программы на java для Android API 18, программа сложная - работа с SMS/GSM/GPRS/Blutooth & прочее, но юзеру не устраивает GUI.


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: vregess от Октябрь 29, 2014, 09:57
И что с того? Ты же пишешь а вы, наверное подразумевая всех участников, иначе бы обращался на ты, как в других постах.


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: vulko от Октябрь 29, 2014, 10:58
И что с того? Ты же пишешь а вы, наверное подразумевая всех участников, иначе бы обращался на ты, как в других постах.

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

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

имхо автору логичнее было бы освоить xml layout'ы.


Название: Re: Android API18 (java) + Qt 5.4 (C++ & QML), data Трансферинг [решено]
Отправлено: vregess от Октябрь 29, 2014, 13:03
ok.
Согласен, в данном случае, лучше остаться на java.