Two kinds of Apps
Apps in the DalvikVM
(that’s the kind of apps you probably know)
(created using the NDK)
One VM to rule them all
Dalvik is a Virtual Machine (VM)
A VM is a common abstraction across different
„Translates“ VM Bytecode to platform specific
It just works™
The DalvikVM is already optimized for the x86
Apps relying on the Android SDK / Dalvik Bytecode
will automatically benefit from Platform-specific
Optimizations (like SSE & Co.)
From Source to Bytecode
ONE DOES NOT SIMPLY
RUN CODE ON MULTIPLE
NOT SURE IF NDK CAN HELP ME
RUN CODE FASTER
OR MAKE THINGS EVEN MORE
What’s the NDK?
NDK stands for Native Development Kit
Allows to compile C/C++ code to native (read:
platform specific) executables/libraries.
Build scripts/toolkit to incorporate native code in
Android apps via the Java Native Interface (JNI)
Has to be compiled for every platform you want to
e.g., complex algorithms, multimedia applications, games
app that takes advantage of direct CPU/HW access
e.g., using SSSE3 for optimization
Fluid and lag-free animations
Software code reuse
What could possibly go wrong?
Performance improvements are not guaranteed
In fact, you could make it worse (read: slower).
Added complexity (Java/C++ Interop, Multiple
Somewhat harder to debug
What’s an NDK app?
It’s an Android application that uses
Libraries are .so files, usually found
These libs can be generated from
native sources inside jni folder,
game engines, or required by other
3rd party libraries.
There is no 100% native application.
Even an application purely written
in C/C++, using native_app_glue.h,
will be executed in the context of
the Dalvik Virtual Machine.
NDK Development in a Nutshell
APP_ABI := all
or APP_ABI := x86
Bionic C Library
Compatibility with Standard C/C++
Bionic C Library:
Lighter than standard GNU C Library
Not POSIX compliant
pthread support included, but limited
No System-V IPCs
Access to Android* system properties
Bionic is not binary-compatible with the standard C library
It means you generally need to (re)compile everything
using the Android NDK toolchain
By default, libstdc++ is used. It lacks:
Standard C++ Library support (except some headers)
C++ exceptions support
Fortunately, you have other libs available with the NDK:
Compile for all the platforms.
If you have the source code of your native libraries, you can compile it for several CPU
architectures by setting APP_ABI to all in the Makefile “jni/Application.mk”:!
Put APP_ABI=all inside
ARM v7a libs are built
ARM v5 libs are built
x86 libs are built
mips libs are built
The NDK will generate optimized code for all target ABIs
You can also pass APP_ABI variable directly to ndk-build, and specify each ABI:
Use lib/x86 libraries