QP Development Kit Android-NDK

quantityforeheadMobile - Wireless

Dec 10, 2013 (3 years and 10 months ago)

198 views

QP state machine frameworks for AVR
QP Development Kit

Android-NDK
Document Revision A
December 2012
Copyright © Quantum Leaps, LLC
www.quantum-leaps.com

www.state-machine.com

Table of Contents
1 Introduction



.....................................................................................................................................................

1

1.1 About QP™



....................................................................................................................................................

2

1.2 About QM™



...................................................................................................................................................

3

1.3 About the QP™ Port to Android-NDK



............................................................................................................

4

1.4 Licensing QP™



..............................................................................................................................................

4

1.5 Licensing QM™



..............................................................................................................................................

4

2 Getting Started



................................................................................................................................................

5

2.1 QDK Installation



.............................................................................................................................................

5

2.2 Android-NDK Tools Installation



......................................................................................................................

7

2.3 Building the QP Libraries



...............................................................................................................................

8

2.4 Building the Example



.....................................................................................................................................

8

2.5 Building the Android Distributable



..................................................................................................................

9

2.6 Installing the Example Application on the Android Device



.............................................................................

10

2.7 Running the DPP Example Application



..........................................................................................................

12

3 Using QS Software Tracing



............................................................................................................................

13

3.1 Example of QSPY Output



..............................................................................................................................

13

4 The QP Port to Android-NDK



.........................................................................................................................

15

4.1 The qf_port.h Header File



..............................................................................................................................

15

4.2 The qf_port.c Source File



...............................................................................................................................

15

4.3 The qs_port.c Source File



..............................................................................................................................

15

4.4 The bsp.c File for the DPP example



...............................................................................................................

15

5 Related Documents and References



.............................................................................................................

16

6 Contact Information



........................................................................................................................................

17

Copyright © Quantum Leaps, LLC. All Rights Reserved.
1
Introduction
This QP Development Kit (QDK) describes how to use the QP/C active object (actor) framework on
Android-NDK (Android Native Development Kit).
Integrating QP with Android at the native code level (running outside the Android's Delvik Virtual Machine)

is interesting for applications requiring efficiency and real-time, or near real-time performance, such as
games. QP is an ideal platform for building highly modular, well structured, multithreaded Android
applications based on the concept of active objects (a.k.a.

Actors) and hierarchical state machines. Additinally, the free

graphical
QM modeling tool
can be used to generate large

parts of the code automatically.
QP complements Android-NDK by providing the high-level

structure, while OpenGL API renders the GUI. Also, the QP port

to Android-NDK enables developers to build efficient,

multithreaded Android applications at a much higher level than

POSIX threads (Pthreads) and without fiddling directly with the

troublesome low-level mechanisms such as POSIX mutexes,

condition variables, and so on.
The actual software used in ths document is as follows:
1.
Android NDK r8
2.
Cygwin + Devel package (for Windows builds)
3.
Android SDK
4.
Apache Ant
5.
Java runtime (needed for Apache Ant)
6.
QP/C/C++
4.5.02
or higher and QM v
2.2.03
.
7.
Qtools
4.5.x
x or higher (for the QSPY build)
For testing, the Application Note uses the Dining Philosopher

Problem (DPP) example application [QL ANDPP 08] running on

Android ARM/MIPS/X86 emulators and Android devices (see

Figure 1
).
1

of
17
Figure
1
The Dining Philosophers Problem
QP Example running on Nexus 7 tablet
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
1.1
About QP™
QP™
is a family of very lightweight, open source, active object

frameworks for developing multi-threaded, event-driven applications.

QP enables building well-structured, modular software as a set of

concurrently executing hierarchical state machines (UML statecharts)

directly in C or C++. QP is described in great detail in the book


Practical UML Statecharts in C/C++, Second Edition: Event-Driven

Programming for Embedded Systems
” [PSiCC2] (Newnes, 2008).
As shown in
Figure 2
, QP consists of a universal UML-compliant event

processor (QEP), a portable real-time framework (QF), a tiny run-to-
completion kernel (QK), and software tracing instrumentation (QS).

Current versions of QP include: QP/C™ and QP/C++™, which require

about 4KB of code and a few hundred bytes of RAM, and the ultra-
lightweight QP-nano, which requires only 1-2KB of code and just

several bytes of RAM. The Linux port described in this QDK Manual

pertains to QP/C and QP/C++.
Figure
2
QP components and their relationship with the target hardware, board support package

(BSP), and the application comprised of state machines
QP can work with or without a traditional RTOS or OS. In the simplest configuration, QP can completely
replace
a traditional RTOS. QP can manage up to 63 concurrently executing tasks structured as state
machines (called active objects in UML).
2

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
1.2
About QM™
QM™
(QP™ Modeler) is a free, cross-platform, graphical UML
modeling tool for designing and implementing real-time embedded
applications based on the QP™ state machine frameworks. QM™ is
available for Windows, Linux, and Mac OS X. QM™ provides intuitive

diagramming environment for creating good looking hierarchical state

machine diagrams and hierarchical outline of your entire application.
QM™ eliminates coding errors by automatic generation of compact C

or C++ code that is 100% traceable from your design. Please visit
state-machine.com/qm
for more information about QM™.
The source code included with this QDK can be edited manually in a
traditional code editor. However, significant parts of the code have
been generated
automatically
by the QM™ modeling tool from the
dpp.qm
model file included in the QDK. The preferred way of
developing QP™ applications is to make all the changes in the model

and generate the code automatically.
Figure
3
: The example model opened in the QM™ modeling tool
3

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
1.3
About the QP™ Port to Android-NDK
In this port, a QP application runs as a single process inside Android
NativeActivity
class, with each
QP active object executing in a separate lightweight POSIX thread (Pthread). The port uses a Pthread
mutex to implement the QP critical section and the Pthread condition variables to provide the blocking
mechanism for event queues of active objects.
The Android-NDK does not implement the standard C library fully. Instead it has it's own library called
Bionic libc. The Bionic libc is designed to be small, fast and to use BSD licensing.
The general assumption underlying the QP port to Android-NDK is that the application is going to be real-
time or perhaps “soft real-time”. This means that the port is trying to use the real-time features available in

the Bionic PThread API as much as possible. These features are tested against the Android Emulator
software.
The QP port to Android-NDK uses one dedicated Pthread to periodically call the
QF_tick()
function to
handle the armed time events. At startup, QP attempts to set the priority of this ”ticker” thread to the
maximum, so that the system clock tick occurs in the timely manner.
For QSPY tracing, an additional logger PThread is started. This thread works as a gateway for reading
the QSPY logging messages and feeding them through the standard Android logging mechanism.
1.4
Licensing QP™
The
Generally Available (GA)
distribution of QP™ available for download from the
www.state-
machine.com/

downloads

website is offered with the following two licensing options:

The GNU General Public License version 2 (GPL) as published by the Free

Software Foundation and appearing in the file
GPL.TXT
included in the packaging of

every Quantum Leaps software distribution. The GPL
open source
license allows

you to use the software at no charge under the condition that if you redistribute the

original software or applications derived from it, the complete source code for your

application must be also available under the conditions of the GPL (GPL Section

2[b]).

One of several Quantum Leaps commercial licenses, which are designed for

customers who wish to retain the proprietary status of their code and therefore cannot

use the GNU General Public License. The customers who license Quantum Leaps

software under the commercial licenses do not use the software under the GPL and

therefore are not subject to any of its terms.
For more information, please visit the licensing section of our website at:
www.state-
machine.com/licensing
.
1.5
Licensing QM™
The QM™ graphical modeling tool available for download from the
www.state-
machine.com/

downloads

website is
free
to use, but is not open source. During the
installation you will need to accept a basic End-User License Agreement (EULA),
which legally protects Quantum Leaps from any warranty claims, prohibits removing
any copyright notices from QM, selling it, and creating similar competitive products.
4

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
2
Getting Started
This section describes how to install, build, and use QDK-Android-NDK based the Dining Philosophers
Problem (DPP) example. This information is intentionally included early in this document, so that you
could start using the QDK as soon as possible.
NOTE:
This QDK assumes that the standard QP baseline distribution has been installed, before
installing this QDK. It is also strongly recommended that you read the
QP tutorial
before you start
experimenting with this QDK.
2.1
QDK Installation
The QDK code is distributed in a ZIP archive (
qdkc_android-ndk.zip
. You can unzip the archive into
the same directory into which you’ve installed all the QP baseline code. The installation directory you
choose will be referred henceforth as QP Root Directory
<qp>
. The following
Listing 1
shows the
directory structure and selected files included in the QDK-Android-NDK distribution. (Please refer to the
“Overview of QP Directories and Files” video on the state-machine.com website to understand the
general structure of QP directories and files):
Listing
1
Selected QP directories and files after installing QDK-Android-NDK.
qpc\ - QP/C installation directory
+-doc\
| +-AN_DPP.pdf - App Note “Dining Philosopher Problem Example”
| +-AN_QP_and_POSIX.pdf – App Note “QP and POSIX”
| +-QDK_Android-NDK.pdf – This QDK Manual
|
+-include/ - QP public include files
|
+-ports/ - QP ports
| +-android-ndk/ - Android-NDK port
| | +-gnu/ - GNU compiler
| | | +-Android.mk - NDK-build makefile for QP libraries
| | | +-AndroidManifest.xml - Manifest for the QP libraries
| | | +-qep_port.h - QEP platform-dependent public include
| | | +-qf_port.h - QF platform-dependent public include
| | | +-qs_port.h - QS platform-dependent public include
| | | +-qf_port.c - QF plaform-dependent implementation
| | | +-qs_port.c - QSPY plaform-dependent implementation
|
+-examples/ - subdirectory containing the QP example files
| +-android-ndk/ - Android-NDK examples
| | +-gnu/ - GNU compiler
| | | +-dpp/ - Dining Philosopher Problem application
| | | | +-jni/ - Java native interface compatible files
| | | | | +-Android.mk - NDK-build makefile for application
| | | | | +-Application.mk - NDK-build app build config
| | | | | +-bsp.c - Board Support Package for Android
| | | | | +-bsp.h - BSP header file
| | | | | +-display.c - OpenGL display routines
| | | | | +-display.h - OpenGL display routine API
| | | | | +-dpp.h - the DPP header file
| | | | | +-
dpp.qm - the DPP model file for QM
5

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
| | | | | +-main.c - the main function
| | | | | +-philo.c - the Philosopher active object
| | | | | +-table.c - the Table active object
| | | | |
| | | | +-libs/ - JNI ndk library accessed by NativeActivity
| | | | | +-armeabi/ - JNI lib for armeabi architecture
| | | | | | +-libdpp.so - JNI Shared lib QP/C Android NDK DPP
| | | | | | +-libdpp-qspy.so - JNI Shared lib QP/C Android NDK DPP QSPY
| | | | | +-armeabi-v7a/ - JNI lib for armeabi-v7a architecture
| | | | | | +-libdpp.so - JNI Shared lib QP/C Android NDK DPP
| | | | | | +-libdpp-qspy.so - JNI Shared lib QP/C Android NDK DPP QSPY
| | | | | +-mips/ - JNI lib for mips architecture
| | | | | | +-libdpp.so - JNI Shared lib QP/C Android NDK DPP
| | | | | | +-libdpp-qspy.so - JNI Shared lib QP/C Android NDK DPP QSPY
| | | | | +-x86/ - JNI lib for x86 architecture
| | | | | | +-libdpp.so - JNI Shared lib QP/C Android NDK DPP
| | | | | | +-libdpp-qspy.so - JNI Shared lib QP/C Android NDK DPP QSPY
| | | | |
| | | | +-obj/ - various object files
| | | | | +-convert_dependecies.sh - NDK-build auto-generated script
| | | | | +-local - local object files
| | | | | | +-armeabi/ - object files for armeabi
| | | | | | +-armeabi-v7a/ - object files for armeabi-v7a
| | | | | | +-mips/ - object files for mips
| | | | | | +-x86/ - object files for x86
| | | | |
| | | | +-bin/ - Packaged application files
| | | | | +-DiningPhilosophersProblem-debug.apk - debug version
| | | | +-res/ - resource files for application
| | | | | +-drawable-ldpi/ - low res images for application
| | | | | | +-application_icon.png - low res application icon
| | | | | +-drawable-hdpi/ - high res images for application
| | | | | | +-application_icon.png - high res application icon
| | | | | +-drawable-mdpi/ - medium res images for application
| | | | | | +-application_icon.png - meduim res application icon
| | | | | +-drawable-xhdpi/ - xtra high res images for application
| | | | | | +-application_icon.png - xtra high res application icon
| | | | |
| | | | +-AndroidManifest.xml - Manifest for the QP libraries
| | | | +-build.xml - Ant build script for buiding the app
| | | | +-local.properties - Project properties for ANT
6

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
2.2
Android-NDK Tools Installation
You need to install all of the following software on your computer.
1.
Android NDK r8
2.
Cygwin + Devel package (for Windows builds)
3.
Android SDK
4.
Apache Ant
5.
Java runtime (needed for Apache Ant)
6.
QP/C/C++
4.5.02
or higher and QM v
2.2.03
.
7.
Qtools
4.5.x
x or higher (for the QSPY build)
If you are using Windows, setup the paths by modifying
cygwin.bat
, add following lines (if you are using
Linux or Mac, adjust accordingly):
set PATH=<ANDROID_SDK_DIR>/android-sdk/tools;<ANDROID_SDK_DIR>/android-sdk/platform-
tools;<ANDROID_NDK_DIR>;<JAVA_BIN_DIR>;<ANT_BIN_DIR>
set JAVA_HOME=<Java NDK DIR>
set ANDROID_NDK_ROOT=<ANDROID_NDK_DIR>
set NDK_MODULE_PATH=<one dir above QPC>
set QTOOLS=<QTOOLS_INSTALL_DIR>
set QPC=<QPC_INSTALL_DIR>
The following lising shows the real life example (please adjust to your installations):
Listing
2
Example of
cygwin.bat
(located in the Cygwin installation folder)
rem @echo off
C:
chdir C:\cygwin\bin
set JAVA_HOME=/cygdrive/c/tools/java/jdk1.7.0_07
set ANDROID_HOME=/cygdrive/c/tools/android/android-sdk
set ANDROID_NDK_ROOT=/cygdrive/c/tools/android/android-ndk-r8b
set NDK_MODULE_PATH=/cygdrive/d/qp
set QPC=/cygdrive/d/qp/qpc
set QPCPP=/cygdrive/d/qp/qpcpp
set QPN=/cygdrive/d/qp/qpn
set QTOOLS=/cygdrive/d/qp/qtools
set PATH=%ANDROID_HOME%/tools;%ANDROID_HOME%/platform-tools;%ANDROID_NDK_ROOT%;
%JAVA_HOME%/bin;/cygdrive/c/tools/apache-ant-1.8.4/bin
bash --login -i
Make sure that you can succesfully start:

android.bat
(from regular Windows command line)

ant
(from Cygwin or regular Windows command line)

ndk-build
and
adb
(from Cygwin).
7

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
2.3
Building the QP Libraries
As QP libraries for Android are defined as modules, you don't need to build them separately. Instead they
are automatically pulled (and build) to the application through the module dependency system.
The Android NDK build system is called
ndk-build
, which itself is a wrapper around GNU Make. It has a
concept of "modules". Each module is defined in a
Android.mk
file. In this file, the compiler flags and
dependencies to other modules are declared. Most of the time, the modules map 1:1 to specific libraries.
NOTE
: The QP libraries and QP applications for Android-NDK can be built in the following four
build
configurations
:
debug
- this configuration is built with full debugging information and minimal optimization.
release
- this configuration is built with no debugging information and high optimization. Single-
stepping and debugging is effectively impossible due to the lack of debugging information and
optimized code, but the debugger can be used to download and start the executable.
qspy-debug
- this configuration is built with the QS software tracing instrumentation and full
debugging information.
qspy-release
- this configuration is built with the QS software tracing instrumentation but no
debugging information.
To select the QSPY version of the
libdpp
is packaged to the
.apk
-file, you need to modify the following
line in
AndroidManifest.xml
file in the application folder:
<meta-data android:name="android.app.lib_name" android:value="dpp" />
to:
<meta-data android:name="android.app.lib_name" android:value="dpp-qspy" />
2.4
Building the Example
As shown in
Listing 1
, the DPP application example for Android-NDK is located in the directory
qpc/examples/android-ndk/gnu/dpp/
. This directory contains the
Android.mk
file and
build.xml
file

to build the example.
The build is started using the following command (inside Cygwin for Windows):
ndk-build
or
ndk-build NDK_DEBUG=1
The latter command builds all libraries with debug symbols, and the first command without debug
symbols.
The following screen shot shows the console output from the build in Cygwin on Windows. Plese note that

the complete build takes a while, because the QP libraries and application code is re-build for all
platorms, such as 80x86, ARM, and MIPS. To clean the build, you can use the command:
ndk-build clean
8

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
Figure
4
Building the DPP example in Cygwin on Windows:
2.5
Building the Android Distributable
Additionally, after building the native shared library, you need to build and package the Android apk-
distributable file. The Android toolset uses the Ant tool to do this.
The Ant tool reads its configuration for the build from the
build.xml
file, which in turn includes the
local.properties
file. These files need to be regenerated once to mach your configuration. This is
done using following command (from the application directory):
android.bat update project -p .
NOTE:
The
android.bat
command prints some error messages to the Cygwin console, but you
can ignore them. At this point you only care for updating the
local.properties
file.
After this, the Android package is build with following command:
ant debug
or
ant release
9

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
Figure
5
Building the DPP example in Cygwin on Windows:
2.6
Installing the Example Application on the Android Device
The DPP example is Android OpenGL application that needs to be transferred to the Android emulator or
a real device. The transferring is done using a tool called "
adb
".
To install an
apk
package to the emulator or a real device, first launch the Android emulator (Android
emulator is launched with the Anroid
AVD Manager
tool), or connect your Android device to the host
computer via a USB cable.
Figure
6
Starting the Androidn emulator from the Androind AVD
10

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
Figure
7
Android emulator before (left) and after (right) installing the DPP example application
Next, from the Cygwing terminal issue following command:
adb install -r bin/DiningPhilosophersProblem-debug.apk
11

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
2.7
Running the DPP Example Application
After succesfull installation, you can start the DPP application by clicking the application icon on the
emulator or on the device.
The DPP screen should appear and start running immediately. The application presents a white table
surrounded by 5 seated philosophers. The philosophers are color coded with following codes:

red = hungry

green = eating

blue = thinking
Figure
8
Android running the DPP example application in normal mode (left) and paused (right)
While the application is running, you can tap the screen to pause it (send the
PAUSE_SIG
to the Table
active object). When the application is paused the circle in the middle changes the color from white to
grey and the Table active object stops giving permissions to eat to the Philosophers, so after a short while

all Philos become hungry (red). Another tap on the screen resumes the normal operation.
12

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
3
Using QS Software Tracing
The QP port to Android-NDK provides particularly easy access to the QS (Quantum Spy) software tracing

information (see [Q_SPY-Ref] and Chapter 11 of [PSiCC2] book for more information about the QS
software tracing system). In the Android-NDK port, you can choose to have the QS data converted on-
the-fly from the compressed binary to the human readable format for direct output to the Android system
log. This on-the-fly formatting of the binary QS data is achieved by incorporating code normally used in
the QSPY host application into the application.
To select which version of the
libdpp
is packaged to the
.apk
-file, you need to modify the following line
in
AndroidManifest.xml
file:
<meta-data android:name="android.app.lib_name" android:value="dpp
-qspy
" />
After this modification, you need to rerun the "
ant debug
" or "
ant release
" command and load the
application to the emulator or device with "
adb install -r
".
The QS data can be read using the "
adb
" tool while the qspy-enabled version of the application is
running. To show QSPY-information, use following command:
adb logcat -s "dpp"
The parameter
-s "dpp"
instructs to show only messages with "
dpp
" tag.
NOTE:
This QS implementation requires access (during the build) to the QSPY host application
code, which resides in the
Qtools
collection. Therefore, Qtools needs to be installed in your system
and the QTOOLS environment variable must be defined.
3.1
Example of QSPY Output
To see the QS ouptut, issue the following command from the Cygwin prompt:
adb logcat -s "dpp"
Figure
9
The QSPY output after typing command
adb logcat -s "dpp"
13

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
14

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
4
The QP Port to Android-NDK
The QP port to Android-NDK is based on the POSIX port, described in the Application Note “QP and
POSIX” (included in the QDK-Android-NDK). This section describes the modifications with respect to the
POSIX port.
4.1
The qf_port.h Header File
Special thread type is defined to allow joining the pthread on exit. Without this, the Android process
lifecycle might leave dangling threads.
typedef struct PThreadTypeTag { /* Thread type struct */
pthread_t thread;
bool running;
} PThreadType;
4.2
The qf_port.c Source File
SCHED_FIFO scheduling policy is used for PThreads. This allows setting separate priorities for active
objects.
Q_ALLEGE(pthread_attr_setdetachstate(&attr,
PTHREAD_CREATE_JOINABLE) == 0);
The threads for Active Objects are created as
joinable
, so that the main thread can ensure termination of
all pthreads before exiting. This remedies the problems caused by Android process lifecycle.
4.3
The qs_port.c Source File
Callback function:
QSTimeCtr QS_onGetTime(void):
clock_gettime()
is used to achieve 1 usec accuracy with large enough roll over value.
4.4
The bsp.c File for the DPP example
Callback function
Q_onAssert()
: is implemented using
__android_log_assert()
function. This
function causes signal 11 to be sent to the process for termination.
Function
BSP_displayPhilStat()
only modify the values that are drawn on next animation thread frame

draw.
Function:
QF_run()
: the main loop blocks while the animation is stopped, waiting for events to arrive.
When animation is running, frames are constantly re-drawn.
Function
android_main()
is the entry point to the native application from "native application glue"
component, originating from the Java NativeActivity class via JNI. Android makes sure that the .bss
variables are initialized when the library is first loaded. On concecutive start-ups the variables are not
cleared. Because of this, the .bss is manually cleared on every startup.
Callback function
QSPY_onPrintLn()
records are forwarded to android logging facility via
__android_log_print()
call.
15

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
5
Related Documents and References
Document
Location
[PSiCC2] “Practical UML Statecharts in C/C++,
Second Edition”, Miro Samek, Newnes, 2008
Available from most online book retailers, such as
amazon.com
. See also:
http://www.state-
machine.com/psicc2.htm
[QP 08] “QP Reference Manual”, Quantum
Leaps, LLC, 2008
http://www.state-machine.com/doxygen/qpn/
[QL AN-DPP 08] “Application Note: Dining
Philosopher Problem Application”, Quantum
Leaps, LLC, 2008
http://www.state-machine.com/resources/

-

AN_DPP.pdf
[QL AN-POSIZ 12] “Application Note: QP and
POSIX”,
Quantum Leaps, LLC, 2012
http://www.state-machine.com/linux/

-

AN_QP_and_POSIX.pdf
[Android-DEV] “Android Developers” website
http://developer.android.com

[Android-NDK] “Android NDK” website
http://developer.android.com/tools/sdk/ndk

[Cygwin] “Cygwin website
http://www.cygwin.com/

[Apache ANT] Ant website
http://ant.apache.org/

16

of
17
Copyright © Quantum Leaps, LLC. All Rights Reserved.
QDK™ Android-NDK
www.state-machine.com/android
6
Contact Information
Quantum Leaps, LLC
103 Cobble Ridge Drive
Chapel Hill, NC 27516
USA
+1 866 450 LEAP (toll free, USA only)
+1 919 869-2998 (FAX)
e-mail:
info@quantum-leaps.com

WEB :
http://www.quantum-leaps.com


http://www.state-machine.com

Practical UML Statecharts

in C/C++, Second Edition:
Event Driven Programming

for Embedded Systems
”,
by Miro Samek,
Newnes, 2008
17

of
17