Android Native Development Kit Cookbook - Liu Feipeng - E-Book

Android Native Development Kit Cookbook E-Book

Liu Feipeng

0,0
39,59 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.

Mehr erfahren.
Beschreibung

Building Android applications would usually mean that you spend all of your time working in Java. There are however times when this is not the most efficient or best method for the application being built. This is where Android NDK comes in. Android NDK allows the developer to write in Native C/C++, giving you the power to reuse code and libraries and also, in most cases, increase the speed and efficiency of your application.The "Android Native Development Kit Cookbook" will help you understand the development, building, and debugging of your native Android applications. We will discover and learn JNI programming and essential NDK APIs such as OpenGL ES, and the native application API. We will then explore the process of porting existing libraries and software to NDK. By the end of this book you will be able to build your own apps in NDK apps."Android Native Development Kit Cookbook" begins with basic recipes that will help you in the building and debugging of native apps, and JNI programming. The recipes cover various topics of application development with Android NDK such as OpenGL programming and Multimedia programming. We will begin with a simple recipe, Hello NDK, before moving on to cover advanced topics with recipes on OpenGL ES that focus on 2D and 3D graphics, as well as recipes that discuss working with NDK and external APIs. If you are looking for ways to make your application available in Android and take measures to boost your application's performance, then this Cookbook is for you.

Das E-Book können Sie in Legimi-Apps oder einer beliebigen App lesen, die das folgende Format unterstützen:

EPUB
MOBI

Seitenzahl: 418

Veröffentlichungsjahr: 2013

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



Table of Contents

Android Native Development Kit Cookbook
Credits
About the Author
About the Reviewers
www.PacktPub.com
Support files, eBooks, discount offers and more
Why Subscribe?
Free Access for Packt account holders
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Errata
Piracy
Questions
1. Hello NDK
Introduction
Setting up an Android NDK development environment in Windows
Getting ready
How to do it…
How it works…
There's more…
Setting up an Android NDK development environment in Ubuntu Linux
Getting ready
How to do it…
How it works…
There's more…
Setting up an Android NDK development environment in Mac OS
Getting ready
How to do it…
How it works…
Updating Android NDK
Getting ready
How to do it…
How it works…
There's more…
Writing a Hello NDK program
Getting ready
How to do it…
How it works…
There's more…
2. Java Native Interface
Introduction
Loading native libraries and registering native methods
Getting ready
How to do it…
How it works…
Passing parameters and receiving returns in primitive types
Getting ready
How to do it…
How it works…
Manipulating strings in JNI
Getting ready
How to do it
How it works…
There's more…
Managing references in JNI
How to do it…
How it works…
There's more…
Manipulating classes in JNI
Getting ready
How to do it…
How it works…
Manipulating objects in JNI
Getting ready
How to do it…
How it works…
Manipulating arrays in JNI
Getting ready
How to do it…
How it works…
Accessing Java static and instance fields in the native code
Getting ready
How to do it…
How it works…
Calling static and instance methods from the native code
Getting ready
How to do it…
How it works…
Caching jfieldID, jmethodID, and referencing data to improve performance
Getting ready
How to do it…
How it works…
Checking errors and handling exceptions in JNI
Getting ready
How to do it…
How it works…
There's more...
Integrating assembly code in JNI
Getting ready
How to do it…
How it works…
3. Build and Debug NDK Applications
Introduction
Building an Android NDK application at the command line
Getting ready
How to do it…
How it works…
There's more...
Taking screenshots from the command line
Building an Android NDK application in Eclipse
Getting ready
How to do it…
How it works...
Building an Android NDK application for different ABIs
Getting ready
How to do it...
How it works…
Building Android NDK applications for different CPU features
Getting ready
How to do it…
How it works…
There's more…
More about CPU feature detection
Different approaches of building for different cpu features
Debugging an Android NDK application with logging messages
How to do it…
How it works...
Debugging an Android NDK application with CheckJNI
How to do it...
How it works...
Debugging an Android NDK application with NDK GDB
Getting ready
How to do it...
How it works...
Debugging an Android NDK application with CGDB
Getting ready
How to do it...
How it works...
Debugging an Android NDK application in Eclipse
Getting ready
How to do it...
How it works...
There's more...
4. Android NDK OpenGL ES API
Introduction
Drawing 2D Graphics and applying transforms with the OpenGL ES 1.x API
Getting ready
How to do it...
How it works...
OpenGL ES rendering display through GLSurfaceView
Drawing objects at OpenGL ES
Colors at OpenGL ES
OpenGL ES transformation
Drawing 3D graphics and lighting up the scene with the OpenGL ES 1.x API
Getting ready
How to do it...
How it works...
Mapping texture to 3D objects with the OpenGL ES 1.x API
Getting ready
How to do it...
How it works...
There's more...
Drawing 3D graphics with the OpenGL ES 2.0 API
Getting ready
How to do it...
How it works...
OpenGL Shading Language (GLSL)
How to use shader:
There's more...
Displaying graphics with EGL
Getting ready
How to do it...
How it works...
Window management
There's more...
5. Android Native Application API
Introduction
Creating a native activity with the native_activity.h interface
Getting ready
How to do it…
How it works…
There's more…
Creating a native activity with the Android native app glue
Getting ready
How to do it…
How it works…
Managing native windows at Android NDK
Getting ready
How to do it…
How it works…
Detecting and handling input events at Android NDK
Getting ready
How to do it…
How it works…
Accessing sensors at Android NDK
Getting ready
How to do it…
How it works…
Managing assets at Android NDK
Getting ready
How to do it…
How it works…
There's more…
6. Android NDK Multithreading
Introduction
Creating and terminating native threads at Android NDK
Getting ready…
How to do it...
How it works...
Build with pthreads
Thread creation
Thread termination
Synchronizing native threads with mutex at Android NDK
How to do it...
How it works...
Initialize and destroy mutex
Using the mutex
There's more...
Synchronizing native threads with conditional variables at Android NDK
How to do it...
How it works...
Initialize and destroy conditional variables
Using the conditional variable:
There's more...
Conditional variable attributes functions
Timed conditional variable functions
Synchronizing native threads with reader/writer locks at Android NDK
Getting ready...
How to do it...
How it works...
Initialize and destroy a reader/writer lock
Using a reader/writer lock
There's more...
Timed read/write lock and trylock
Reader/writer lock attribute functions
Synchronizing native threads with semaphore at Android NDK
Getting ready...
How to do it...
How it works...
Initialize and destroy a semaphore
Using a semaphore
Scheduling native threads at Android NDK
Getting ready...
How to do it...
How it works...
Scheduling contention scope
Scheduling policy and thread priority
Scheduling using nice value/level
Managing data for native threads at Android NDK
Getting ready...
How to do it...
How it works...
Creation and deletion of thread-specific data key
Set and get thread-specific data
7. Other Android NDK API
Introduction
Programming with the jnigraphics library in Android NDK
Getting ready…
How to do it...
How it works...
There's more…
Programming with the dynamic linker library in Android NDK
Getting ready...
How to do it...
How it works...
Programming with the zlib compression library in Android NDK
Getting ready...
How to do it...
How it works...
There's more...
Programming audio with the OpenSL ES audio library in Android NDK
Getting ready...
How to do it...
How it works...
Object creation
Changing states of objects
Use and build with OpenSL ES Audio library
OpenSL ES audio recording
OpenSL ES audio playback
There's more...
Programming with the OpenMAX AL multimedia library in Android NDK
Getting ready...
How to do it...
How it works...
Use and build with the OpenMAX AL multimedia library:
OpenMAX AL video playback
There's more....
8. Porting and Using the Existing Libraries with Android NDK
Introduction
Porting a library as a shared library module with the Android NDK build system
Getting ready
How to do it...
How it works...
See also
Porting a library as a static library module with the Android NDK build system
Getting ready
How to do it...
How it works...
See also
Porting a library with its existing build system using the Android NDK toolchain
How to do it...
How it works...
There's more...
Using a library as a prebuilt library
How to do it...
How it works...
Using a library in multiple projects with import-module
How to do it...
How it works...
Porting a library that requires RTTI, exception, and STL support
How to do it...
How it works...
9. Porting an Existing Application to Android with NDK
Introduction
Porting a command-line executable to Android with an NDK build system
Getting ready
How to do it...
How it works...
Understanding the Android.mk files
Porting a command-line executable to Android with an NDK standalone compiler
Getting ready
How to do it...
How it works...
Porting libpng
Porting libseamcarv
Porting fusch
Adding GUI to a ported Android app
How to do it...
How it works...
Using background threads at porting
Getting ready
How to do it...
How it works...
Sending messages from the native code
Index

Android Native Development Kit Cookbook

Android Native Development Kit Cookbook

Copyright © 2013 Packt Publishing

All rights reserved. No part of this book may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, without the prior written permission of the publisher, except in the case of brief quotations embedded in critical articles or reviews.

Every effort has been made in the preparation of this book to ensure the accuracy of the information presented. However, the information contained in this book is sold without warranty, either express or implied. Neither the author, nor Packt Publishing, and its dealers and distributors will be held liable for any damages caused or alleged to be caused directly or indirectly by this book.

Packt Publishing has endeavored to provide trademark information about all of the companies and products mentioned in this book by the appropriate use of capitals. However, Packt Publishing cannot guarantee the accuracy of this information.

First published: March 2013

Production Reference: 1140313

Published by Packt Publishing Ltd.

Livery Place

35 Livery Street

Birmingham B3 2PB, UK.

ISBN 978-1-84969-150-5

www.packtpub.com

Cover Image by Artie Ng (<[email protected]>)

Credits

Author

Feipeng Liu

Reviewers

Roger Belk

Frank Grützmacher

Sylvain Ratabouil

Acquisition Editor

Martin Bell

Commissioning Editor

Shreerang Deshpande

Lead Technical Editor

Mayur Hule

Technical Editors

Lubna Shaikh

Worrell Lewis

Project Coordinator

Leena Purkait

Proofreader

Aaron Nash

Indexer

Monica Ajmera Mehta

Graphics

Aditi Gajjar

Valentina D'silva

Production Coordinator

Shantanu Zagade

Cover Work

Shantanu Zagade

About the Author

Feipeng Liu is a technology enthusiast who is focused on multimedia systems and applications. He started mobile applications development in 2008 on Windows Mobile. Since Feb 2010, he has been developing apps for Android with NDK. His Android apps have been used by many users. One of his apps, video converter Android, has reached one million downloads within 10 months. Feipeng received his B.ENG in Electrical and Electronic Engineering degree from Nanyang Technological University, and Master of Computing degree in the Department of Computer Science from National University of Singapore.

I would like to thank Shreerang Deshpande for offering me the opportunity to author this book and for helping me throughout the writing, and Leena Purkait for keeping track of its progress and coordination, Mayur Hule, Lubna Shaikh, and Worrell Lewis for editing the book drafts! I would like to express my gratitude to other Packt Publishing staff who helped with the book! My grateful thanks are also extended to Roger, Frank and Sylvain, who offered great suggestions during the review.

I also would like to thank Assoc. Prof. Wei Tsang Ooi in National University of Singapore, the supervisor of my master project. A lot of stuff in this book is based on the things I learnt during the project.

Last but not least, I would like to thank my parents Zhulan Shen and Yi Liu, and Ms. Yang Xiaoqing for the support and understanding during the writing of the book.

About the Reviewers

Roger Belk is a 45-year-old self-taught Android developer with 20 + apps in Google’s Play Store under the developer name BigTexApps. He started out using Google’s & MIT’s App Inventor and then after two years of learning to use AI, he taught himself to use Java to build Android apps. He has reviewed two other books, Google App Inventor, Ralph Roberts, Packt Publishing (ISBN 978-1-84969-212-0) and Android 3.0 Animation, Alex Shaw, Packt Publishing (ISBN 978-1-84951-528-3).

Frank Grützmacher spent some years in the research of distributed electronic design tools and worked for several German blue chip companies such as Deutsche Post and AEG. He was involved in Android platform extensions for a mobile manufacturer. Therefore, on one hand he knows how to build large enterprise apps and on the other hand how to make Android system apps.

He is currently working for the IT daughter of the largest German Telco company.

In the past, he has reviewed Corba- and Java-related books for American and German publishers.

Sylvain Ratabouil is a confirmed IT consultant experienced with C++ and Java technologies. He worked in the space industry and got involved in aeronautic projects at Valtech, where he is now taking part in the digital revolution.

As a technology lover, he is passionate about mobile technologies and cannot live or sleep anymore without his Android smart phone.

www.PacktPub.com

Support files, eBooks, discount offers and more

You might want to visit www.PacktPub.com for support files and downloads related to your book.

Did you know that Packt offers eBook versions of every book published, with PDF and ePub files available? You can upgrade to the eBook version at www.PacktPub.com and as a print book customer, you are entitled to a discount on the eBook copy. Get in touch with us at <[email protected]> for more details.

At www.PacktPub.com, you can also read a collection of free technical articles, sign up for a range of free newsletters and receive exclusive discounts and offers on Packt books and eBooks.

http://PacktLib.PacktPub.com

Do you need instant solutions to your IT questions? PacktLib is Packt’s online digital book library. Here, you can access, read and search across Packt’s entire library of books. 

Why Subscribe?

Fully searchable across every book published by PacktCopy and paste, print and bookmark contentOn demand and accessible via web browser

Free Access for Packt account holders

If you have an account with Packt at www.PacktPub.com, you can use this to access PacktLib today and view nine entirely free books. Simply use your login credentials for immediate access.

Preface

Since its first release in 2008, Android has become the largest mobile platform in the world. The total number of apps in Google Play is expected to reach 1,000,000 in mid 2013. Most of the Android apps are written in Java with Android Software Development Kit (SDK). Many developers only write Android code in Java even though they are experienced with C/C++, without realizing what a powerful tool they are giving up.

Android Native Development Kit (NDK) was released in 2009 to help developers write and port native code. It offers a set of cross-compiling tools and a few libraries. Programming in NDK offers two main advantages. Firstly, you can optimize your apps in native code and boost performance. Secondly, you can reuse a large number of existing C/C++ code. Android Native Development Kit is a practical guide to help you write Android native code with NDK. We will start with the basics such as Java Native Interface (JNI), and build and debug a native app (chapter 1 to 3). We will then explore various libraries provided by NDK, including OpenGL ES, Native Application API, OpenSL ES, OpenMAX AL, and so on (Chapters 4 to 7). After that, we will discuss porting existing applications and libraries to Android with NDK (Chapters 8 and 9). Finally, we will demonstrate how to write multimedia apps and games with NDK (Bonus chapters 1 and 2).

What this book covers

Chapter 1, Hello NDK, covers how to set up an Android NDK development environment in Windows, Linux, and MacOS. We will write a "Hello NDK" application at the end of the chapter.

Chapter 2, Java Native Interface, describes the usage of JNI in detail. We will call native methods from the Java code and vice versa.

Chapter 3, Build and Debug NDK Applications, demonstrates building native code from a command line and Eclipse IDE. We will also look at debugging native code with gdb, cgdb, eclipse, and so on.

Chapter 4, Android NDK OpenGL ES API, illustrates OpenGL ES 1.x and 2.0 APIs. We will cover 2D drawing, 3D graphics, texture mapping, EGL, and so on.

Chapter 5, Android Native Application API, discusses Android native application APIs, including managing native windows, accessing sensors, handling input events, managing assets, and so on. We will see how to write a pure native app in this chapter.

Chapter 6, Android NDK Multithreading, depicts Android multithreading API. We will cover creating and terminating native threads, various thread synchronization techniques (mutex, conditional variables, semaphore, and reader/writer lock), thread scheduling, and thread data management.

Chapter 7, Other Android NDK API, discusses a few more Android libraries, including jnigraphics, the dynamic linker library, the zlib compression library, the OpenSL ES library, and the OpenMAX AL library.

Chapter 8, Porting and Using Existing Libraries with Android NDK, describes various techniques of porting and using existing C/C++ libraries with NDK. We will port the boost library at the end of the chapter.

Chapter 9, Porting Existing Applications to Android with NDK, provides a step-by-step guide for porting an existing application to Android with NDK. We use an open source image resizing program as an example.

Bonus Chapter 1, Developing Multimedia Applications with NDK, demonstrates how to write multimedia applications with the ffmpeg library. We will port the ffmpeg library and use the library APIs to write a frame grabber application.

Bonus Chapter 2, Developing Games with NDK, discusses writing games with NDK. We will port the Wolfenstein 3D game to show how to set up game display, add game control, and enable audio effects for a game.

You can download the bonus chapters from http://www.packtpub.com/sites/default/files/downloads/Developing_Multimedia_Applications_with_NDK.pdf and http://www.packtpub.com/sites/default/files/downloads/Developing_Games_with_NDK.pdf.

What you need for this book

A computer with Windows, Ubuntu Linux, or MacOS installed is necessary (Linux or MacOS is preferable). Although we can run Android apps with an emulator, it is slow and inefficient for Android development. Therefore, it is recommended to have an Android device.

The book assumes a basic understanding of C and C++ programming languages. You should also be familiar with Java and Android SDK.

Note that the sample code of this book is based on Android ndk r8 unless otherwise stated, since it is the latest version of NDK at the time of writing. By the time the book is published, there should be newer versions. The code should also run on any newer versions. Therefore we can install NDK r8 or later.

Who this book is for

The book is written for anyone who is interested in writing native code for Android. The chapters are arranged from basic to intermediate to advanced, and they are relatively independent. Readers who are new to NDK are recommended to read from the beginning to the end, while readers who are familiar with NDK can pick up any specific chapters or even specific recipes.

Conventions

In this book, you will find a number of styles of text that distinguish between different kinds of information. Here are some examples of these styles, and an explanation of their meaning.

Code words in text are shown as follows: "Windows NDK comes with a new ndk-build.cmd build script."

A block of code is set as follows:

#include <string.h> #include <jni.h> jstring Java_cookbook_chapter1_HelloNDKActivity_naGetHelloNDKStr(JNIEnv* pEnv, jobject pObj) { return (*pEnv)->NewStringUTF(pEnv, "Hello NDK!"); }

When we wish to draw your attention to a particular part of a code block, the relevant lines or items are set in bold:

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := framegrabber LOCAL_SRC_FILES := framegrabber.c #LOCAL_CFLAGS := -DANDROID_BUILD LOCAL_LDLIBS := -llog -ljnigraphics -lz LOCAL_STATIC_LIBRARIES := libavformat_static libavcodec_static libswscale_static libavutil_static include $(BUILD_SHARED_LIBRARY) $(call import-module,ffmpeg-1.0.1/android/armv5te)

Any command-line input or output is written as follows:

$sudo update-java-alternatives -s <java name>

New terms and important words are shown in bold. Words that you see on the screen, in menus or dialog boxes for example, appear in the text like this: "Go to Control Panel | System and Security | System | Advanced system settings."

Note

Warnings or important notes appear in a box like this.

Tip

Tips and tricks appear like this.

Reader feedback

Feedback from our readers is always welcome. Let us know what you think about this book—what you liked or may have disliked. Reader feedback is important for us to develop titles that you really get the most out of.

To send us general feedback, simply send an e-mail to <[email protected]>, and mention the book title via the subject of your message.

If there is a topic that you have expertise in and you are interested in either writing or contributing to a book, see our author guide on www.packtpub.com/authors.

Customer support

Now that you are the proud owner of a Packt book, we have a number of things to help you to get the most from your purchase.

Downloading the example code

You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.

Errata

Although we have taken every care to ensure the accuracy of our content, mistakes do happen. If you find a mistake in one of our books—maybe a mistake in the text or the code—we would be grateful if you would report this to us. By doing so, you can save other readers from frustration and help us improve subsequent versions of this book. If you find any errata, please report them by visiting http://www.packtpub.com/submit-errata, selecting your book, clicking on the erratasubmissionform link, and entering the details of your errata. Once your errata are verified, your submission will be accepted and the errata will be uploaded on our website, or added to any list of existing errata, under the Errata section of that title. Any existing errata can be viewed by selecting your title from http://www.packtpub.com/support.

Piracy

Piracy of copyright material on the Internet is an ongoing problem across all media. At Packt, we take the protection of our copyright and licenses very seriously. If you come across any illegal copies of our works, in any form, on the Internet, please provide us with the location address or website name immediately so that we can pursue a remedy.

Please contact us at <[email protected]> with a link to the suspected pirated material.

We appreciate your help in protecting our authors, and our ability to bring you valuable content.

Questions

You can contact us at <[email protected]> if you are having a problem with any aspect of the book, and we will do our best to address it.

Chapter 1. Hello NDK

In this chapter, we will cover the following recipes:

Setting up an Android NDK development environment in WindowsSetting up an Android NDK development environment in Ubuntu LinuxSetting up an Android NDK development environment in Mac OSUpdating Android NDKWriting a Hello NDK program

Introduction

Android NDK is a toolset that allows developers to implement a part of or an entire Android application in a native language, such as C, C++, and assembly. Before we start our journey to NDK, it is important to understand the advantages of NDK.

First of all, NDK may improve application performance. This is usually true for many processor-bound applications. Many multimedia applications and video games use native code for processor-intensive tasks.

The performance improvements can come from three sources. Firstly, the native code is compiled to a binary code and run directly on OS, while Java code is translated into Java byte-code and interpreted by Dalvik Virtual Machine (VM). At Android 2.2 or higher, a Just-In-Time (JIT) compiler is added to Dalvik VM to analyze and optimize the Java byte-code while the program is running (for example, JIT can compile a part of the byte-code to binary code before its execution). But in many cases, native code still runs faster than Java code.

Tip

Java code is run by Dalvik VM on Android. Dalvik VM is specially designed for systems with constrained hardware resources (memory space, processor speed, and so on).

The second source for performance improvements at NDK is that native code allows developers to make use of some processor features that are not accessible at Android SDK, such as NEON, a Single Instruction Multiple Data (SIMD) technology, allowing multiple data elements to be processed in parallel. One particular coding task example is the color conversion for a video frame or a photo. Suppose we are to convert a photo of 1920x1280 pixels from the RGB color space to the YCbCr color space. The naive approach is to apply a conversion formula to every pixel (that is, over two million pixels). With NEON, we can process multiple pixels at one time to reduce the processing time.

The third aspect is that we can optimize the critical code at an assembly level, which is a common practice in desktop software development.

Tip

The advantages of using native code do not come free. Calling JNI methods introduces extra work for the Dalvik VM and since the code is compiled, no runtime optimization can be applied. In fact, developing in NDK doesn't guarantee a performance improvement and can actually harm performance at times. Therefore, we only stated that it may improve the app's performance.

The second advantage of NDK is that it allows the porting of existing C and C++ code to Android. This does not only speed up the development significantly, but also allows us to share code between Android and non-Android projects.

Before we decide to use NDK for an Android app, it is good to know that NDK will not benefit most Android apps. It is not recommended to work in NDK simply because one prefers programming in C or C++ over Java. NDK cannot access lots of APIs available in the Android SDK directly, and developing in NDK will always introduce extra complexity into your application.

With the understanding of the pros and cons of NDK, we can start our journey to Android NDK. This chapter will cover how to set up Android NDK development in Windows, Ubuntu Linux, and Mac OS. For developers who have set up an Android NDK development environment before, a recipe with detailed steps of how to update an NDK development environment is provided. At the end of the chapter, we will write a Hello NDK program with the environment setup.

Setting up an Android NDK development environment in Windows

In this recipe, we will explore how to set up an Android NDK development environment in Windows.

Getting ready

Check the Windows edition and system type. An Android development environment can be set up on Windows XP 32-bit, Windows Vista 32- or 64-bit, and Windows 7 32- or 64-bit.

Android development requires Java JDK 6 or above to be installed. Follow these steps to install and configure Java JDK:

Go to the Oracle Java JDK web page at http://www.oracle.com/technetwork/java/javase/downloads/index.html, and choose JDK6 or above for your platform to download.Double-click on the downloaded executable, and click through the installation wizard to finish the installation.Go to Control Panel | System and Security | System | Advanced system settings. A System Properties window will pop up.Click on the Environment Variables button in the Advanced tab; another Environment Variables window will pop up.Under System variables, click on New to add a variable with the name as JAVA_HOME and value as the path of the JDK installation root directory. This is shown as follows:Under System variables, scroll to find the PATH (or Path) environment variable. Insert %JAVA_HOME%\bin; at the beginning of the value. If no PATH or Path variable exists, create a new variable with the value set to %JAVA_HOME%\bin. Click on OK all the way through to dismiss all windows.To verify whether JDK is installed and configured correctly, start a new command-line console, and enter javac -version. If JDK is configured correctly, you will get the Java version in the output.

Cygwin is a Linux-like environment for Windows to run software available on Linux. Android NDK development requires Cygwin 1.7 or higher installed to execute some Linux programs; for example, the GNU make.

Since NDK r7, the Windows NDK comes with a new ndk-build.cmd build script, which uses NDK's prebuilt binaries for GNU make, awk, and other tools. Therefore Cygwin is not required for building NDK programs with ndk-build.cmd. However, it is recommended that you still install Cygwin, because ndk-build.cmd is an experimental feature and Cygwin is still needed by the debugging script ndk-gdb.

Follow these steps to install Cygwin:

Go to http://cygwin.com/install.html to download setup.exe for Cygwin. Double-click on it after the download is complete in order to start the installation.Click on Next, then select Install from Internet. Keep clicking on Next until you see the Available Download Sites list. Select the site that is close to your location, then click on Next:Look for GNU make under Devel, ensure it is version 3.81 or later, and gawk under Base. Alternatively, you can search for make and gawk using the Search box. Make sure both GNU make and gawk are selected to install, then click on Next. The installation can take a while to finish:

Eclipse is a powerful software Integrated Development Environment (IDE) with an extensible plugin system. It is the recommended IDE to develop Android apps. Go to http://www.eclipse.org/downloads/, and download the Eclipse Classic or Eclipse IDE for Java developers. Extract the compressed file and it will be ready for use. Note that Android development requires Eclipse 3.6.2 (Helios) or greater.

Tip

The Android developer website provides an Android Developer Tools bundle at http://developer.android.com/sdk/index.html. It includes the Eclipse IDE with the ADT plugin, and the Android SDK. We can download this bundle and skip the SDK installation described in steps 1 to 10 of the following How to do it... section.

How to do it…

The following steps show you how to set up an Android NDK development environment in Windows. We will first set up an SDK development environment. Steps 1 to 10 can be skipped if SDK is already set up.

Start Eclipse. Select Help | Install New Software, and a window titled Install will pop up.Click on the Add… button at the top-right will corner, and another window titled Add Repository will pop up.In the Add Repository window, enter ADT for Name and https://dl-ssl.google.com/android/eclipse/ for Location. Then click on OK.It may take a few seconds for Eclipse to load the software items from the ADT website. After loading, select Developer Tools and NDK Plugins, then click on Next to proceed:In the next window, a list of tools to be installed will be shown. Simply click on Next. Read and accept all the license agreements, then click on Finish.After installation finishes, restart Eclipse as prompted.Download Android SDK from http://developer.android.com/sdk/index.html.Double-click on the installer to start the installation. Follow the wizard to finish the installation.In Eclipse, select Window | Preferences to open the Preferences window. Select Android from the left panel, then click on Browse to locate the Android SDK root directory. Click on Apply, and then OK.Start Android SDK Manager at the Android SDK installation root directory. Select Android SDK Tools, Android SDK Platform-tools, at least one Android platform (the latest is preferred), System Image, SDK Samples, and Android Support. Then click on Install. in the next window, read and accept all the license agreements, then click on Install:Go to http://developer.android.com/tools/sdk/ndk/index.html to download the latest version of Android NDK. Unzip the downloaded file.

Tip

Downloading the example code

You can download the example code files for all Packt books you have purchased from your account at http://www.packtpub.com. If you purchased this book elsewhere, you can visit http://www.packtpub.com/support and register to have the files e-mailed directly to you.

Open Cygwin.bat under the cygwin root directory. It contains the following content by default:
@echo off C: chdir C:\cygwin\bin bash --login -i
Add the following content after @echo off before C:
set IS_UNIX= set JAVA_HOME=<JDK path> set PATH=<SDK path>\tools;<NDK path> set ANDROID_NDK_ROOT=/cygdrive/<NDK path>

As an example, the file content on my machine is as follows; note that Progra~1 is the short name for the Program Files folder:

set IS_UNIX=set JAVA_HOME=c:/Progra~1/Java/jdk1.7.0_05 set PATH=C:/Users/Administrator/AppData/Local/Android/android-sdk/tools;C:/Users/Administrator/Downloads/android-ndk-r8-windows/android-ndk-r8 set ANDROID_NDK_ROOT=/cygdrive/c/Users/Administrator/Downloads/android-ndk-r8-windows/android-ndk-r8
Start Cygwin by double-clicking on cygwin.bat, then go to the samples/hello-jni directory in NDK. Type the command ndk-build. If the build is successful, it proves that the NDK environment is set up correctly:In Eclipse, select Window | Preferences to open the Preferences window. Click on Android from the left panel, and select NDK from the drop-down list. Click on Browse to locate the Android NDK root directory. Click on OK to dismiss the pop-up window. This enables us to build and debug Android NDK applications with the Eclipse NDK plugin:

How it works…

In this recipe, we first set up an Android SDK development environment and then the NDK development environment.

Android NDK does not require installation. We downloaded NDK, and configured the path to make it more convenient to use.

Cygwin is not required for Android SDK development, but is essential for NDK development because NDK uses some Linux tools that depend on Cygwin.

NDK plugin in ADT: NDK plugin for Eclipse is available in Android Development Tools (ADT), which allows us to build and debug Android NDK applications easily.

Tip

The NDK plugin is only available for ADT 20.0.0 or later, which was released on June 2012. You may want to update your Eclipse ADT in order to use the NDK plugin.

There's more…

We installed Eclipse IDE as a part of our development environment. Eclipse is the recommended IDE for developing Android applications, and it comes with lots of useful tools and utilities to help our development. However, it is not a compulsory component of the development environment.

Setting up an Android NDK development environment in Ubuntu Linux

This recipe depicts how to set up an Android NDK development environment in Ubuntu Linux.

Getting ready

Check your Ubuntu version and make sure it is version 8.04 or later.

GNU C Library (glibc) 2.7 or above is required. It is usually installed with Linux by default. Two simple methods can check the version of glibc:

Start a terminal, and enter ldd --version. This will print the version of ldd and glibc:We can execute the library as an application. Start a terminal, locate the library location, and then enter the following command:
<glibc library location>/<glibc library>.

The following output will be displayed:

We need to enable 32-bit application execution if we are using a 64-bit machine. Start a terminal, and enter the following command:
sudo apt-get install ia32-libs
Install JDK 6 or above. At a terminal, enter the command sudo apt-get install openjdk-6-jdk, or alternatively we can enter sudo apt-get install sun-java6-jdk. After installation, we need to add the JDK path to the PATH environment variable by adding the following lines to ~/.bashrc:
export JDK_PATH=/usr/local/jdk1.7.0/bin export PATH=$PATH:$JDK_PATH

We will use Eclipse as our IDE. Please refer to the Setting up an Android NDK development environment in Windows recipe for instructions.

How to do it…

The following steps indicate the procedure of setting up an Android NDK development environment on Ubuntu Linux:

Follow steps 1 to 6 of the Setting up an Android NDK development environment in Windows recipe to install the ADT plugin for Eclipse.Download Android SDK from http://developer.android.com/sdk/index.html, then extract the downloaded package.Append the following lines to ~/.bashrc:
export ANDROID_SDK=<path to Android SDK directory> export PATH=$PATH:$ ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
Follow steps 9 and 10 of the Setting up an Android NDK development environment in Windows recipe to configure the SDK path at Eclipse, and download additional packages.Download the latest version of Android NDK from http://developer.android.com/tools/sdk/ndk/index.html, then extract the downloaded file.Change the lines that you appended to ~/.bashrc in step 3:
export ANDROID_SDK=<path to Android SDK directory> export ANDROID_NDK=<path to Android NDK directory> export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK
Start a new terminal, then go to the samples/hello-jni directory in NDK. Type the command ndk-build. If the build is successful, it proves that the NDK environment is set up correctly:

How it works…

We first set up Android SDK and then Android NDK. Ensure that the path is set properly, so that the tools can be accessed without referring to the SDK and NDK directories.

The .bashrc file is a startup file read by the bash shell when you start a new terminal. The export commands appended the Android SDK and NDK directory locations to the environment variable PATH. Therefore, every time a new bash shell starts, PATH is set properly for SDK and NDK tools.

There's more…

The following are a few more tips on setting up an NDK development environment:

Configure Path at Startup File: We append to the SDK and NDK paths to the PATH environment variable at ~/.bashrc file. This assumes that our Linux system uses the bash shell. However, if your system uses another shell, the startup file used may be different. The startup files used by some commonly used shells are listed as follows:
For C shell (csh), the startup file to use is ~/.cshrc.For ksh, the startup file to use can be obtained using the command echo $ENV.For sh, the startup file to use is ~/.profile. The user needs to log out of the current session and log in again for it to take effect.
Switch JDK: In Android development, we can either use Oracle Java JDK or OpenJDK. In case we run into issues with any one of the JDKs, we can switch to another Java JDK, if we have installed both of them.
To check which JDK the system is currently using, use the following command:
$update-java-alternatives -l
To switch between two JDKs, use the following command:
$sudo update-java-alternatives -s <java name>

The following is an example for switching to Oracle JDK 1.6.0:

$sudo update-java-alternatives -s java-1.6.0-sun

Setting up an Android NDK development environment in Mac OS

This recipe describes how to set up an Android NDK development environment in Mac OS.

Getting ready

Android development requires Mac OS X 10.5.8 or higher, and it works on the x86 architecture only. Ensure that your machine meets these requirements before getting started.

Register an Apple developer account, then go to https://developer.apple.com/xcode/ to download Xcode, which contains a lot of developer tools, including the make utility required for Android NDK development. After the download is complete, run the installation package and make sure that the UNIX Development option is selected for installation.

As usual, Java JDK 6 or above is required. Mac OS X usually ships with a full JDK. We can verify that your machine has the required version by using the following command:

$javac -version

How to do it…

Setting up an Android NDK development environment on Mac OS X is similar to setting it up on Ubuntu Linux. The following steps explain how we can do this:

Follow steps 1 to 6 of the Setting up an Android NDK development environment in Windows recipe to install the ADT plugin for Eclipse.Download Android SDK from http://developer.android.com/sdk/index.html, then extract the downloaded package.Append the following lines to ~/.profile. If the file doesn't exist, create a new one. Save the changes and log out of the current session:
export ANDROID_SDK=<path to Android SDK directory> export PATH=$PATH:$ ANDROID_SDK/tools:$ANDROID_SDK/platform-tools
In Eclipse, select Eclipse | Preferences to open the Preferences window. Select Android from the left panel, then click on Browse to locate the Android SDK root directory. Click on Apply, and then OK.In a terminal, start the Android SDK Manager at the tools directory by typing the command android. Select Android SDK Tools, Android SDK Platform-tools, at least one Android platform (the latest one is preferred), System Image, SDK Samples, and Android Support. Then click on Install. In the next window, read and accept all the license agreements, then click on Install.Download Android SDK from http://developer.android.com/sdk/index.html, and then extract the downloaded package.Change the lines that you appended to ~/.profile in step 3:
export ANDROID_SDK=<path to Android SDK directory> export ANDROID_NDK=<path to Android NDK directory> export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK
Start a new terminal, then go to the samples/hello-jni directory in NDK. Type the command ndk-build. If the build is successful, it proves that the NDK environment is set up correctly.

How it works…

The steps to set up an Android NDK development environment on Mac OS X are similar to Ubuntu Linux, since both of them are Unix-like operating systems. We first installed Android SDK, then Android NDK.

Updating Android NDK

When there is a new release of NDK, we may want to update NDK in order to take advantage of the new features or bug fixes with the new release. This recipe talks about how to update Android NDK in Windows, Ubuntu Linux, and Mac OS.

Getting ready

Please read the previous recipes in this chapter, depending on the platform of your choice.

How to do it…

In Windows, follow these instructions to update Android NDK:

Go to http://developer.android.com/tools/sdk/ndk/index.html to download the latest version of Android NDK. Unzip the downloaded file.Open Cygwin.bat under the cygwin root directory. The content should be similar to the following code snippet, if you have previously configured NDK on the system:
@echo off set IS_UNIX= set JAVA_HOME=<JDK path> set PATH=<SDK path>\tools;<NDK path> set ANDROID_NDK_ROOT=/cygdrive/<NDK path> C: chdir C:\cygwin\bin bash --login -i
Update <NDK path> from the old NDK path to the newly downloaded and decompressed location.

In Ubuntu Linux, follow these instructions to update Android NDK:

Download the latest version of Android NDK from http://developer.android.com/tools/sdk/ndk/index.html, then extract the downloaded file.If we have followed the Setting up an Android NDK development environment in Ubuntu Linux recipe, the following content should appear at the end of ~/.bashrc:
export ANDROID_SDK=<path to Android SDK directory> export ANDROID_NDK=<path to Android NDK directory> export PATH=$PATH:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK
Update the ANDROID_NDK path to the newly downloaded and extracted Android NDK folder.

In Mac OS, the steps are almost identical to Ubuntu Linux, except that we need to append the path to ~/.profile instead of ~/.bashrc.

How it works…

NDK installation is completed by simply downloading and extracting the NDK file, and configuring the path properly. Therefore, updating NDK is as simple as updating the configured path to the new NDK folder.

There's more…

Sometimes, updating NDK requires updating SDK first. Since this book focuses on Android NDK, explaining how to update SDK is beyond the scope of this book. You can refer to the Android developer website at http://developer.android.com/sdk/index.html, for details on how to do it.

At times, we may feel the need to use an old version of NDK to build certain applications because of compatibility issues. Therefore, it may be useful to keep multiple versions of Android NDK and switch between them by changing the path or simply using the full path to refer to a specific version of NDK.

Chapter 2. Java Native Interface

In this chapter, we will cover the following recipes:

Loading native libraries and registering native methodsPassing parameters and receiving returns in primitive typesManipulating strings in JNIManaging references in JNIManipulating classes in JNIManipulating objects in JNIManipulating arrays in JNIAccessing Java static and instance fields in native codeCalling static and instance methods from native codeCaching jfieldID, jmethodID, and reference data to improve performanceChecking errors and handling exceptions in JNIIntegrating assembly code in JNI

Introduction

Programming with Android NDK is essentially writing code in both Java and native languages such as C, C++, and assembly. Java code runs on Dalvik Virtual Machine (VM), while native code is compiled to binaries running directly on the operating system. Java Native Interface (JNI)