Android - Invoke JNI based methods (Bridging C/C++ and Java)
Here’s a screen shot

Step By Step Instructions below:
Step #1: Compile the project using ant. Some snippets are shown below.
NativeAdd.java class (with Native method)
package org.apache;
import android.util.Log;
public class NativeAdd {
static {
try {
Log.i("JNI", "Trying to load libNativeAdd.so");
System.loadLibrary("NativeAdd");
}
catch (UnsatisfiedLinkError ule) {
Log.e("JNI", "WARNING: Could not load libNativeAdd.so");
}
}
public static native long add(long a, long b);
}
Snippet that shows how this class/method is invoked from the main activity
public void onClick(View view) {
Log.i(LOG_TAG, "onClick");
EditText a = (EditText) findViewById(R.id.a);
EditText b = (EditText) findViewById(R.id.b);
EditText c = (EditText) findViewById(R.id.c);
Log.i(LOG_TAG, "calling native method");
long sum = NativeAdd.add(Long.parseLong(a.getText().toString()),
Long.parseLong(b.getText().toString()));
Log.i(LOG_TAG, "back from native method");
String text = Long.toString(sum);
c.setText("Native add returns = " + text.subSequence(0, text.length()));
}
Step #2: Generate header files using java by running the following command.
javah -classpath ../../android.jar;../bin/classes; org.apache.NativeAdd
Here’s how the header file (org_apache_CallNative.h) looks like
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class org_apache_NativeAdd */
#ifndef _Included_org_apache_NativeAdd
#define _Included_org_apache_NativeAdd
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: org_apache_NativeAdd
* Method: add
* Signature: (JJ)J
*/
JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add
(JNIEnv *, jclass, jlong, jlong);
#ifdef __cplusplus
}
#endif
#endif
Step #3: Code a tiny C file (org_apache_NativeAdd.c) as shown below:
#include "org_apache_NativeAdd.h"
JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add
(JNIEnv *env, jclass c, jlong a, jlong b)
{
return a + b;
}
Step #4: Please read the following article before you try the next step.
Shared library “Hello World!” for Android
Step #5: Compile and link the org_apache_NativeAdd.c/org_apache_NativeAdd.h into a shared library.
arm-none-linux-gnueabi-gcc -I/usr/lib/jvm/java-1.5.0-sun/include -I/usr/lib/jvm/java-1.5.0-sun/include/linux -fpic -c org_apache_NativeAdd.c arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o libNativeAdd.so org_apache_NativeAdd.oNOTE: details on armelf_linux_eabi.xsc are in the Step #4. Step #6: copy the library to the emulator. Copy the Application as well.adb push native/libNativeAdd.so /system/lib adb install bin/CallNative.apkStep #7: Run the app to try some values. That’s it!
Download the sources and Application - CallNative.zip


[...] http://euedge.com/blog/2007/12/06/google-android-runs-on-sharp-zaurus-sl-c760http://davanum.wordpress.com/2007/12/09/android-invoke-jni-based-methods-bridging-cc-and-java [...]
Android Internals « $HOME
30 Dec 07 at 11:49 pm
[...] capture video or use location based services, you may however try to use JNI. Davanum Srinivas presents how to achieve this step by step. This way one can make part of his app partially native to gain performance, for instance in case [...]
Do Android dream of something more than Java? « Mantrid’s Weblog
28 Apr 08 at 3:53 am
thanks for the infomation
the CallNative.zip download is not work, can you fix that?
thanks
Yael
Yael
7 Dec 08 at 6:16 am