Skocz do zawartości

Kurs Qt – #3 – pierwsza aplikacja mobilna na Androida


Pomocna odpowiedź

(edytowany)

Zachęcam każdego któremu udało się mimo wszystko na Windows do podzielenia się doświadczeniami.

Edytowano przez sp3uqw
  • Lubię! 1

@sp3uqw 

Cześć.

Ja również miałem ten problem. 

NDK r20 nie potrafiłem go rozwiązać. Będę próbował jeszcze raz. 

Sprawdzałem w Android Studio działa NDK w wersji r20 skompilowałem aplikację z natywnym kodem C++

 

@sebaskow  Jeśli możesz, to podczas testów zapisuj co się dzieje na jakich wersjach narzędzi, może to pomoże rozwiązać problem u innych. Przy okazji, czy pamietasz fakt instalowania Gradle przez Qt?  

Testowałem tą część artykułu na Win10 i nie miałem problemów. Autor zwraca uwagę na tą odpowiednią wersję, ale tak to przeszło bez problemów. Nawet mogę powiedzieć, że zaskoczyło mnie, że jak zmienia się przy uruchamianiu Debug > Desktop QT na Android to zadziałało bez żadnych błędów.

  • Lubię! 1

VICTORIA!!!

Udało sie skompilować i uruchomić aplikacje na Androida z Qt na Win10. Problemem okazała sie wersja android sdk

Ja miałem zainstalowana wersję 29. Musiałem ją wyinstalować i zainstalować wersję 28 (niższe też nie chciały działać). Wersję tę można też wybrać w opcjach projektu: trzeba wybrać Build Android APK. Wygląda jakby Qt Creator wybierał defaultowo najwyższą zainstalowana wersję.

Na trop naprowadziła mnie dyskusja: https://amin-ahmadi.com/2015/11/29/how-to-install-qt-for-android/

Qt dla Androida jest niestety bardzo czułe na wersje bibliotek. Podejrzewam, że nie jest to kwestia Windowsa czy Linuxa, na Linuxie miałem tylko wersje androida w wersji 28 od początku i stąd zapewne szybszy sukces.

W załącznikach screeny z moich ustawień i działający przykład na symulatorze (na tablecie też ruszyło).

PS. Czas na konkretną aplikację 🙂

BuildSettings.thumb.JPG.8f49b8ba66eb2bf3ac4535d3d0d0a2cf.JPGOptions.thumb.JPG.ed124310d6d83dbda1ca1defb230953a.JPGapp.thumb.JPG.96bc20adbb77c47e3b5097d72e5488d8.JPG

settingsAndroid.JPG

  • Lubię! 2

Witam wszystkich. 

Ja również rozwiązałem problem w następujący sposób:

ustawiłem w gradle.properties:  (plik ten generuje się podczas budowy)

  •  androidBuildToolsVersion=28.0.3

Moje SDK to:

  • 26.1.1

Moje NDK to:

  • 20.0.5594570

W konfiguracji qmake.conf (ścieżka: C:\Qt\Qt5.13.0\5.13.0\android_x86\mkspecs\android-clang\qmake.conf) w wierszu 

  • QMAKE_LINK    = $$QMAKE_CXX $$QMAKE_CFLAGS -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a 

dopisałem

  • QMAKE_LINK    = $$QMAKE_CXX $$QMAKE_CFLAGS -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a -nostdlib++

Następnie skorzystałem z porady:

Niestety to co chcę zrobić przy pomocy aplikacji wciąż jest problematyczne. A mianowicie skorzystać z klasy QNetworkManager i tu pojawia się problem bo Qt dla Androida potrzebuje osobne biblioteki do obsługi SSL.

Ponieważ nie mam problemu z Andorid Studio i Javą dałem sobie spokój.

Pozdrawiam

gradle.properties.PNG

Qt Android.png

@Matthew11 Gradle sam się generuje podczas budowania.

  • Lubię! 1

Cześć,

Mam podobne odczucia co do wykorzystania Qt dla Androida. Qt może byc fajnym rozwiazaniem jeżeli tworzymy wieloplatformowe aplikacje, jednakże jeżeli chcemy sie skupić na Androidzie, to Android Studio jest najlepszym rozwiązaniem.

Witam,

Mam te same problemy co wyżej opisane (cannot find -lc++).

Android Studio działa poprawnie i aplikacja łączy się z telefonem w Win i Lin.

Qt 5.12 w Win działa poprawnie z mingw.

Zainstalowałem Ubuntu 18.04 od nowa i mam problem Qt nie widzi mkfile .

Dodałem gcc i g++ zamieniłem i to samo.

Może ktoś napisze jak instalować Qt na 18.04 co dodać itd.

To samo jak dodać poprawnie JDK .

@akuch2  Moja konfiguracja na Ubuntu 18.04:

  • Narzędzia Qt:


910677388_Screenshotfrom2019-07-0716-27-37.thumb.png.edb7f2012a9933578eb69bd84f51ae17.png
 

  • openJDK:

Instalacja: https://openjdk.java.net/install/index.html

Standardowo ścieżka którą należy dodać w Qt powinna wygląda tak: /usr/lib/jvm/java-8-openjdk-amd64 możesz to też sprawdzić urchamiając w terminalu: "update-alternatives --list java". NDK i SDK tak samo jak na Windows u mnie konkretne wersje to SDK Version: 26.1.1, NDK Version: 19.2.5345600

1689661217_Screenshotfrom2019-07-0717-38-14.thumb.png.ca6d79256764c8f3043aeb5af1a3297d.png

  • Lubię! 1

Witam ponownie,

Panowie wielkie dzięki za podpowiedzi.

Uruchomiłem zarówno na Win7 jak i wirtualce Ubuntu 18.04.

Na Win7 dodałem zmienne środowiskowe i poprawiłem plik qmqke.config i to załatwiło temat.

W ubuntu (po zainstalowaniu) dodałem:

  • sudo apt-get install openjdk-8-jdk - to poprawnie instaluje jave
  • sudo apt install build-essential - to kompilatory

Qt pobrałem z adresu   http://download.qt.io/official_releases/qt/5.12/ (na stronie Qt Download pomimo zaznaczenia opensource pobrałem triala). Pobrałem 5.12.3 i  Ndk 19c. Po zainstalowaniu i ustawieniu napis „Forbot” ukazał się na moim telefonie.

  • Lubię! 1

Pierwsze podejście do Bluetooth w QT. Wcześniej pisałem "aplikacje" mobilne w Apache Cordova, w QT tylko na desktopy. Korzystałem m.in. z blogu

oraz repozytorium z przykładami z książki Qt-5-Projects.

ESP32Controller.thumb.png.271c9714e37dbd2bb44004976d1ca5d2.png
O dziwo 

QByteArray readingsLine = bt.socket->readLine();
receivedData = QString(readingsLine) + receivedData;

zniekształca otrzymywany tekst z mikrokontrolera (brakuje np pierwszej litery).

Swoją drogą jaki jest właściwy sposób przechowywania wskaźników

    QBluetoothDeviceDiscoveryAgent *agent = new QBluetoothDeviceDiscoveryAgent;
    QBluetoothSocket *socket;

tak by były dostępne z różnych klas (różnych okien aplikacji)? Static pointer w oddzielnej klasie?

Źródło mojej radosnej twórczości: ESP32Controller.zip

Cześć @rziomber. Metoda, którą użyłeś readLine() według dokumentacji nie ma możliwości zwracania błędów więc nie dowiesz się czy dzieje się coś złego. Spróbuj printować wszystko co przychodzi w konsoli qDebug() << socket.readAll() - jak zobaczysz że nadal brakuje danych to problem leży raczej po stronie BT. Może zdarza się tak, że część danych (pierwsze znaki) "przychodzą" wraz z jednym sygnałem readyRead() a reszta z kolejnym. Zamiast czytania pojedynczych linii, spróbuj wykorzystać readAll() i gromdzić dane w jakimś buforze np. QByteArray jako member MainWindow i dopiero w tym buforze szukaj linii. Jeśli tracisz zawsze początek danych to strzelam, że wina leży w metodzie odczytu z socketu. 

Odnośnie wskaźników to nie sądze, żeby dobrym pomysłem było eksponowanie ich poza klasę. Raczej stworzyłbym kilka metod w tej klasie, w ktorej korzystam z socketu i agenta i tylko te udostępnił poza klasą i to za ich pomocą korzystał z QBluetoothDeviceDiscoveryAgent i QBluetoothSocket jeśli byłaby taka potrzeba. Więc przechowywałbym je jedynie w klasie, która obsługuje socket i agenta i z tej klasy korzystał. Przy okazji, podczas tworzenia nowych obiektów klas Qt -> new QBluetoothDeviceDiscoveryAgent używaj new QBluetoothDeviceDiscoveryAgent(this) albo sam zadbaj o zwolnienie pamięci po tych obiektach. Więcej info tutaj: https://doc.qt.io/qt-5/objecttrees.html#overview

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...