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