I am working on some Qt/QML app which will be deployed to Android OS. Now, I need module androidextras
but if I put androidextras
inside my .pro
file as follows
QT += qml quick widgets sql core bluetooth printsupport androidextras
and I rerun qmake
, I get following error:
Project ERROR: Unknown module(s) in QT: androidextras
I also tried to open and run the example project Qt Notifier but the same error occurs so that I cannot build either my app or the example, which should have worked out of the box.
I am using KUbuntu 15.04
with gcc version 4.9.2 (Ubuntu 4.9.2-10ubuntu13)
compiler and Desktop Qt 5.5.0 GCC 64bit
Qt version. How do I build this androidextras
module?
I have Android arm v7
kit installed as you can see from the Maintenance Tool screenshot:
I've recompiled whole Qt with clear && ./configure -opensource -confirm-license -verbose -cups -plugin-sql-mysql -android-sdk /opt/android-sdk-linux -android-ndk /opt/android-ndk-r10d && make && make install
, set up
Qt version and Qt Kit in QtCreator, changed build kit and still same error pops up. Why?
Extras modules are meant to provide additional functions specific to a certain platform and thus available only on that platform. It could be the support to the badge number on iOS apps, the support to Windows jump lists or some utility functions to convert from a type to the corresponding platform native type (e.g. QPixmap
to CGImageRef
, again in Mac extras).
There exist four extras modules - Win, Mac/iOS, X11, Android - and as long as you compile for the specific chosen platform against the specific kit, everything is fine. And it's also automatic, for desktop environment: your host machine is always your target machine.
Mobile kits are instead used to cross-compile from a certain (desktop) host machine to another (mobile) target machine. In this settings you can easily (and erroneously) compile platform specific code with the wrong kit.
Generally speaking, you should put platform specific modules/code inside conditionals to ensure that it is compiled only against the specific kit for which they are available. That's especially true for software which must be compiled both for desktop and mobile platforms or across different desktop platforms. Conditional in .pro
file could look like this:
android: QT += androidextras
mac: QT += macextras
// ...other platform specific and platform independent settings
See this answer for an android .pro
example file which includes also manifest specific settings.
The same approach should be followed in code, i.e. check the OS and conditionally compile the platform code. For instance a multi-platform implementation of a function could look like this:
if defined(Q_OS_ANDROID)
#include <QtAndroid>
#include <QAndroidJniObject>
#endif
// other code...
void YourClass::function()
{
#if defined(Q_OS_ANDROID)
// platform code
#elif defined(Q_OS_WIN)
#endif
}
See for instance this answer for a complete Android example or this other answer for some useful iOS specific keywords.