page.title=Sample: hello-jni @jd:body

On this page

  1. Android.mk
  2. Application.mk
  3. Java-side Implementation
  4. C-side Implementation

This sample guides you through HelloJNI, a minimal application built with the NDK. This sample is in the {@code samples/hello-jni/} directory under the root directory of your NDK installation.

Android.mk

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 {@code libhello-jni.so}, once the build system adds the {@code lib} prefix and the {@code .so} extension.

LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE    := hello-jni

For more information about what the {@code Android.mk} file does, and how to use it, see Android.mk.

Application.mk

This line tells the build system the CPU and architecture against which to build. In this example, the build system builds for all supported architectures.

APP_ABI := all

For more information about the {@code Application.mk} file, and how to use it, see Application.mk.

Java-side Implementation

The {@code helloJNI.java} file is located in {@code hellojni/src/com/example/hellojni/}. It 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 {@code .so} file upon application startup.

System.loadLibrary("hello-jni");

The {@code native} keyword in this method declaration tells the virtual machine that the function is in the shared library (that is, 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() );

C-side Implementation

The {@code hello-jni.c} file is located in {@code hello-jni/jni/}. It contains a function that returns a string that the Java side requested). The function declaration is as follows:

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )

This declaration corresponds to the native function declared in the Java source code. The return type, {@code 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 {@code 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:

Following these rules, this example uses the function name {@code Java_com_example_hellojni_HelloJni_stringFromJNI}. This name refers to a Java function called {@code stringFromJNI()}, which resides in {@code hellojni/src/com/example/hellojni/HelloJni.java}.

{@code JNIEnv*} is the pointer to the VM, and {@code jobject} is a pointer to the implicit {@code this} object passed from the Java side.

The following line calls the VM API {@code (*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 ".");