NDK Programmer's Guide
|
This sample provides a bare-bones look at a minimal application built with the NDK.
The following two lines provide the name of the native source file, along
with the name of the shared library to build. The full name of the built
library is libhello-jni.so
, but you should omit the
lib
prefix and the .so
extension.
LOCAL_SRC_FILES := hello-jni.c LOCAL_MODULE := hello-jni
For more information on what this file does, and how to use it, see the Android.mk section.
This line tells the build system the architecture against which to build. If you don't specify anything, the build system defaults to armeabi.
APP_ABI := all
For more information on what this file does, and how to use it, see the Application.mk section.
This file calls a function to retrieve a string from the native side, then displays it on the screen.
The source code contains three lines of particular interest to the NDK user. They are presented here in the order in which they are used, rather than by line order.
This function call loads the .so
file upon application
startup.
System.loadLibrary("hello-jni");
The native
keyword in this method declaration tells the
DVM that the function is in the shared library (i.e., implemented on the native
side).
public native String stringFromJNI();
The Android framework calls the function loaded and declared in the previous steps, displaying the string on the screen.
tv.setText( stringFromJNI() );
This file contains a function that returns a string that the Java side requested (see "Java-side implementation"). The function declaration is as follows:
jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject x )
This declaration corresponds to the native function declared in the
Java source code. The return type, jstring
, is a data type defined
in the Java Native Interface Specification. It is not actually a string, but a
pointer to a Java string.
After jstring
comes the function name, which is based on the
Java function name and and the path to the file containing it. Construct it
according to the following rules:
Java_
to it..java
file extension.Thus, in this example, the function name
Java_com_example_hellojni_HelloJni_stringFromJNI
refers to a Java
function called stringFromJNI()
, which resides in
hellojni/src/com/example/hellojni/HelloJni.java
.
Finally, JNIEnv*
is the pointer to the VM, and
jobject
is a pointer to the implicit “this” object passed from
the Java side.
The following line calls the VM API (*env), and passes it a return value: that is, the string that the function on the Java side had requested.
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");