前回はAndroid NDKに含まれるJNIサンプルプロジェクト「Hello-jni」をビルド実行した。今回はAndroid JNIプロジェクトの構造を知るために、「Hello-jni」とまったく同じプロジェクトをゼロから作成してみる。
Eclipseを起動したら、「File」メニューから「Android Project」を作成する。
今回はプロジェクト名を「Test102Prj」、ターゲットを「Android 2.3」、パッケージ名を「com.test102」、アクティビティ名を「Test102Act」とし、プロジェクト名、パッケージ名、アクティビティ名を区別できるようにした。
次にC言語ソースファイルを保存するフォルダをプロジェクト内に作成する。プロジェクトを右クリックして現れるメニューの「New」にある「Folder」を選択する。
次にjniフォルダの中にmakefileを作成する。「jni」フォルダを右クリックして現れるメニューの「New」にある「File」を選択する。
ファイル名は「Android.mk」とする。これは常に固定のファイル名で、大文字小文字を区別するので要注意だ。

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := test102jni LOCAL_SRC_FILES := test102jni.c include $(BUILD_SHARED_LIBRARY)
次にjniフォルダの中にC言語のソースファイルを作成する。「jni」フォルダを右クリックして現れるメニューの「New」にある「File」を選択する。

Javaへエクスポートする関数名は「Java_com_test102_Test102Act_stringFromJNI」のように、「Java_プロジェクト名_アクティビティ名_関数名」と設定する。
#include <string.h> #include <jni.h> jstring Java_com_test102_Test102Act_stringFromJNI( JNIEnv* env, jobject thiz ) { return (*env)->NewStringUTF(env, "Test102text"); }

package com.test102; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Test102Act extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); } public native String stringFromJNI(); static { System.loadLibrary("test102jni"); } }

cd /cygdrive/c/workspace/Test102Prj ndk-build
Cygwinでビルドできたら、Androidパッケージのビルド/実行をする。プロジェクトを右クリックして現れたメニューの「Run As」にある「Android Application」を選択する。