Android & iOS – on the edge of Qt and Java/Objective-C

Android & iOS – on the edge of
Qt and Java/Objective-C
Maciej Węglarczyk
Android & iOS – on the edge of Qt
and Java/Objective-C
About me
●
Cracow, Poland
●
Graduated from AGH-UST with MSc in CS
●
6+ Qt years
●
Game industry
●
Ganymede Ltd. (3 years+)
●
Android & iOS lead
Android & iOS – on the edge of Qt
and Java/Objective-C
The purpose of this talk
●
Explain if / why one needs to write code beyond Qt
●
Show what cannot be done with only Qt
●
Give a taste of the way to communicate with native environments
●
Give a brief overview how Qt is integrated with Android & iOS
Android & iOS – on the edge of Qt
and Java/Objective-C
Agenda
●
Reasons of extending Qt app with native code
●
Needed tools
●
Mixing Qt with Java/Objective-C
●
Adding 3rd party libraries
●
Modifying application entry point
Android & iOS – on the edge of Qt
and Java/Objective-C
Beyond Qt
“It's a dangerous business, Frodo, going out of your door”
Bilbo Baggins
Android & iOS – on the edge of Qt
and Java/Objective-C
EXTENDING? WHY?
Android & iOS – on the edge of Qt
and Java/Objective-C
Importance of rich features
●
Over 1,000,000 apps available in Google Play and Apple AppStore each
●
Very demanding users
●
Different ways of monetization
●
Chances of being featured
●
Increasing user engagement
●
Virality
Android & iOS – on the edge of Qt
and Java/Objective-C
Native integration - it's actually nothing new
●
Qt Windows Extras, Qt Mac Extras, Qt X11 Extras
●
Mobile OSes are evolving faster
●
The problem is similar
Android & iOS – on the edge of Qt
and Java/Objective-C
Where to start?
●
First of all – know what you want and why
●
Check if Qt supports it
●
If not, check if it hasn't been done already by someone else...
●
...or if it couldn't be done by someone else in near future. :)
Android & iOS – on the edge of Qt
and Java/Objective-C
What's not possible with Qt (at least for now)
●
Notifications (push, rich)
●
Alarms
●
SMS API
●
Communication with other apps
●
Lock screen widgets
●
●
Home screen widgets
●
Google / Apple API
●
Maps
●
Game Services / Center
●
Calendar
●
...
Many useful 3rd party integrations
●
Facebook Connect
●
Google Analytics
●
Monetization libs (i.e. Chartboost)
●
...
Android & iOS – on the edge of Qt
and Java/Objective-C
Required tools
Android
iOS
●
QtCreator
●
QtCreator
●
Some IDE for Java, i.e. Eclipse
●
Xcode
●
Android SDK & NDK
●
Apple Developer Program Account
●
Ant
●
Xcode Command Line Tools
●
Some devices
●
Simulator is OK
(emulator is still rather slow and sometimes unreliable)
(devices are better, though)
Android & iOS – on the edge of Qt
and Java/Objective-C
Useful tips
●
Compile Output panel is much much more informative than Issues panel
●
Android: QtCreator's Build command builds only Qt code, not Java yet
●
Android: turn on the androiddeployqt's verbose option
Android & iOS – on the edge of Qt
and Java/Objective-C
Basic Android / iOS projects
●
Just take any of Qt's examples for given platform
●
Compile and run it from QtCreator
●
That's it
Android & iOS – on the edge of Qt
and Java/Objective-C
ADDING NATIVE CODE
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding native code – Android
●
JNI – Java Native Interface
●
Encapsulated into Qt's androidextras module
●
Containing a couple of useful classes and a namespace QtAndroid
QT += androidextras
QAndroidActivityResultReceiver
QAndroidJniEnvironment
QAndroidJniObject
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding native code – Android
●
Both directions possible:
●
C++ -> Java
●
Java -> C++
<Example>
https://github.com/FenixVoltres/QtAndroidCpp2Java
https://github.com/FenixVoltres/QtAndroidJava2Cpp
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding native code – iOS
It's very simple:
●
Create some C++ class with normal header
●
Use Objective-C in bodies of declared methods.
●
That's all!
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding native code – iOS
●
Following example taken from Richard Moe Gustavsen's
talk on Qt for iOS from last year Qt DD 13
<Example>
https://github.com/richardmg/qtdd13_qmlapp
Android & iOS – on the edge of Qt
and Java/Objective-C
How about Swift?
●
C++ code can’t be executed from Swift directly
●
Objective-C wrapper needed
Swift -> Objective-C++ -> Qt
Android & iOS – on the edge of Qt
and Java/Objective-C
ADDING NATIVE LIBRARIES
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding native libraries – Android
●
Make sure you have defined ANDROID_PACKAGE_SOURCE_DIR variable in .pro file
●
Add libs folder inside and put there all jars you want
●
$PROJECT
android-sources
●
libs
●
●
<put your jar here>
<Example>
https://github.com/FenixVoltres/QtAndroidNativeLib
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding native libraries – iOS
Even simpler:
LIBS += -F/path/to/frameworks/folder
LIBS += -framework StoreKit
Android & iOS – on the edge of Qt
and Java/Objective-C
MODYFYING ENTRY POINT
Android & iOS – on the edge of Qt
and Java/Objective-C
Why one would modify an entry point?
●
Not whole application must be written in Qt
●
To override some Qt's behavior
●
To make some actions before Qt is loaded
Android & iOS – on the edge of Qt
and Java/Objective-C
Deployment process – Android
●
●
A bit complicated
Two overrided classes – QtActivity.java and QtApplication.java
are copied to android build folder
●
Located in $QT/android_xxx/src/android/java/src/org/qtproject/qt5
●
Used in AndroidManifest.xml
Android & iOS – on the edge of Qt
and Java/Objective-C
Adding .java source files
●
●
●
Define ANDROID_PACKAGE_SOURCE_DIR variable in .pro file,
so it points to folder with Android internal folders structure
(src, res, assets, libs) or let QtCreator does it for you
Put all .java files in proper folder structure connected with their packages
in src folder
Put all other resources in proper folders – all of them will be copied into
the final .apk file
Android & iOS – on the edge of Qt
and Java/Objective-C
Modifying app’s entry point – Android
●
AndroidManifest.xml can be changed – any different Activity can be an entry point.
●
QtActivity and QtApplication can be overridden
<Example>
https://github.com/FenixVoltres/QtAndroidSplash
Android & iOS – on the edge of Qt
and Java/Objective-C
Deployment process – iOS
●
Again, very simple
●
Building a project creates Xcode project file in build folder
●
It can be open an freely modified after QtCreator build.
●
After any change in QtCreator the process must be repeated!
Android & iOS – on the edge of Qt
and Java/Objective-C
Modifying app’s entry point – iOS
●
Open Xcode project generated by QtCreator
●
Modify what you want.
Android & iOS – on the edge of Qt
and Java/Objective-C
WRAP UP
Android & iOS – on the edge of Qt
and Java/Objective-C
Mixing Qt with native code
●
Much easier on iOS than on Android
●
Almost everything is possible
Good luck!
Android & iOS – on the edge of Qt
and Java/Objective-C
THANK YOU!
Android & iOS – on the edge of Qt
and Java/Objective-C
Q &A
t
m
Questions & Answers maybe
Maciej Węglarczyk
[email protected]