Android NDK開発環境構築から実行まで
作成するAndroidアプリは下のような流れのアプリ。
- JavaからCに数値を渡す
- Cは受け取った数値を加算してJavaに返す
- Javaは帰ってきた数値を画面に表示する
開発環境構築
Cygwinのサイトからsetup.exeをダウンロードしCygwinをインストールする。
※今回はCドライブ直下に配置しました。
C:\cygwin
Android DevelopersからAndroidNDK(Windows版)をダウンロードしCygwinの/home/(user)/に展開する。(今回使用したのはandroid-ndk-r5b-windows.zip)
C:\cygwin\home\(user)\android-ndk-r5b
Eclipseを起動し新しいAndroidプロジェクトを作成する。
- Project name
- TestNDK
- Build Target
- Android 2.1-update1 API 7
- Application name
- TestNDK
- Package name
- com.example.testndk
- Create Activity
- MainActivity
- Min SDK Version
- 7
作成したプロジェクトの直下(srcと同じ階層)にjniディレクトリを作成し、その中にAndroid.mkとcalc.cの2つのファイルを作成する。
- TestNDK
- src
- com.example.testndk
- MainActivity.java
- gen
- Android2.1-update1
- jni
- Android.mk
- calc.c
- res
- layout
- values
- AndroidManifest.xml
Android.mkには以下を記述する。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := mcalc LOCAL_SRC_FILES := calc.c include $(BUILD_SHARED_LIBRARY)
calc.cには以下を記述する。
#include <jni.h> jint Java_com_example_testndk_MainActivity_add( JNIEnv* env, jobject thiz, jint a, jint b){ return a + b; }
javaから呼び出すためにMainActivity.javaには以下を記述する。
package com.example.testndk; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class MainActivity extends Activity { static { System.loadLibrary("mcalc"); } public native int add(int x, int y); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText("add(5, 3)->" + add(5, 3)); setContentView(tv); } }
作成したプロジェクトを/cygwin/home/(user)/にコピーする。
Cygwinを立ち上げコピーしたプロジェクトに移動し、ndk-buildを実行するとビルドが始まる。
cd /home/(user)/TestNDK/ /home/(user)/android-ndk-r5b/ndk-build
コピーしたプロジェクト内にlibsが作成されているので、それをEclipse側の同プロジェクトにコピーする。
- TestNDK
- src
- Android2.1-update1
- jni
- libs
- obj
- res
Eclipseのメニュープロジェクトからクリーンプロジェクトを行う。
後はプロジェクトを実行すると画面にadd(5, 3)->8が表示される。
add(5, 3)->8