The book "Android NDK Beginner's Guide" by Sylvain Ratabouil is 425 pages long and it's just a "beginner's guide". I will try to make this as short as possible, and provide a quick step by step guide to a working NDK example.
What you need :
- working Android environment. I will use Eclipse on Windows for this so it will be easier to have the same. Working means you already succeed with a Hello World example
- Android NDK - check http://developer.android.com/tools/sdk/ndk/index.html. As a alternative in future developemnts you can also use CristaX's custom made NDK, which has some improvements but for this example the one from Google is enough
- Cygwin - only for windows devices
- for simplicity, NDK should just be unzipped to a directory and Cygwin installed via installer. No headaches with environment variables & stuff for now. For this example, it should be enough.
The steps :
So, we will do the sum of two numbers, written in native code and used in the android project :
1. Prepare your android project :
- you need a android project in Eclipse to begin with
- in the root directory(same level with "src"), create a new directory called "jni"
- in a package of your choosing(for me : com.blogspot.soiuz - replace all later occurrences with your package name) create the SimpleLib java class and add the code :
package com.blogspot.soiuz; public class SimpleLib { static { System.loadLibrary("sLib"); } // Native - sum of two numbers public static native long add(int a, int b); }
- this is the minimum you need : loadLibrary with the name of the native library we will later create(in this case "sLib") and at least one function declaration to use\test(in this case, adding of two numbers).
- based on the code here we will automatically generate a header file, so this is important
- open Command Prompt, and navigate to the bin directory of your android project
- to create a header file, we will use javah from the JDK tools by calling :
javah -jni com.blogspot.soiuz.SimpleLib
- if it says it cannot find the class, make sure you can navigate from the bin directory, to SimpleLib.java by going com\blogspot\soiuz\SimpleLib. EG: you might need to step into the directory classes and run javah from there.
- in the pointed directory you will have com_blogspot_soiuz_SimpleLib.h, This is the C header file that we need to implement next.
- move this file to the jni folder and refresh the folder in Eclipse
- if you look into the file, you will have the add function written in a wierd manner : JNIEXPORT jlong JNICALL Java_com_blogspot_soiuz_SimpleLib_add , this is standard jni signature
2. Implementing the C library :
- right-click on the jni folder and choose New→File. Save it as sLib.c
- add code to it :
#include "com_blogspot_soiuz_SimpleLib.h" long add(int a, int b) { return a+b; } JNIEXPORT jlong JNICALL Java_com_blogspot_soiuz_sLib_add(JNIEnv *env, jclass obj, jint a, jint b) { return add(a, b); }
- so we : add the header, implement our method in C, copy the method declaration for the generated header file and the variable names and call the native function. Easy.
3. The Makefile :
- we have some files and this makefile will tell how they will be used
- so, again, New -->File and create Android.mk
- add text to it :
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := sLib LOCAL_SRC_FILES := sLib.c include $(BUILD_SHARED_LIBRARY)
- no spaces empty lines, indentation.All text should start from begin of line
- in the makefile we need to specify : Module library - sLib, files we want to build - sLib.c
4. Building all :
- for this we need 2 tools : NDK , and if you want to do this on windows you also need Cygwin
- assuming both are installed and configured, open cygwin and execute the 2 next commands
- cd /cygdrive/d/workspace/AndroidNdk (navigates to android project root directory. All drives are mapped under cygdrive)
- /cygdrive/d/install/android-ndk-r6b/ndk-build (form the Ndk installation directory, it will execute ndk-build)
- if all was ok, it will show some text saying that libsLib.so was created in \libs\armeabi\.This is the needed library
5. Using, testing
- SimpleLib.add(1,2); This is all you need to do
- class SimpleLib is already created inside the android project and i suggest you make a class like that to act as a intermediary between java code and native library
No comments:
Post a Comment