2014年2月3日月曜日

わかりやすいAndroid NDK導入手順 2014年版

AndroidでNDKを利用する手順について調べてみました。NDKについての解説記事はたくさんありますが、情報が古くて、そのままだと使えないことが多かったので、現時点での僕が試した方法について説明します。

まずは準備から。

今回使用した開発環境は、Windows7 64bit、JDK1.7.0、ADT(v22.3.0-887826)です。Android SDKのAPIレベルは、最新版の19を使用しました。

コマンドプロンプトからjavahコマンドを実行できるように、あらかじめJDKへのパスは設定しておいてください。パスの設定はこちらが参考になります。

http://www.javadrive.jp/install/jdk/index4.html

まずは、NDKのダウンロードサイトから、NDKのWindows 64bit版をダウンロードします。

http://developer.android.com/tools/sdk/ndk/index.html

android-ndk-r9c-windows-x86_64.zipというファイルです。

ファイルをダウンロードして、解凍したら、C:\ndkというディレクトリを作って、そこに入れてください。場所は任意ですが、ここではわかりやすいように、実際に僕が利用している環境を記します。

C:\ndk\android-ndk-r9c-windows-x86_64\android-ndk-r9c

という場所にNDKが入りました。

次に、ADTを起動して、[Window -Preference]の[Android - NDK]という設定画面を開いてください。


NDK Location

C:\ndk\android-ndk-r9c-windows-x86_64\android-ndk-r9c

と入力して、OKを押して、設定画面を終了してください。

これで設定は完了です。



続いて、実際のAndroidプロジェクトでNDKを使用する手順を説明します。まずは通常通り、Android Application Projectを新規作成してください。





ここでは、JNITestという名前でプロジェクトを作成しました。プロジェクトのデータは

C:\ws_android\ws_test\JNITest

に作成されました。

自動生成されたMainActivityを編集します。

res/layout/activity_mail.xmlを以下のように編集してください。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

</RelativeLayout>
内容はほぼデフォルトのままで、TextViewにlabelというIDを付けただけです。
MainActivity.javaは以下のように編集してください。
package com.fumobox.jnitest;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  TextView label = (TextView)findViewById(R.id.label);
  
  Test test = new Test();
  label.setText("Result: " + test.test01(9));
 }

}
次に、プロジェクトにTest.javaというクラスを作成して、中身を以下のように記述してください。
package com.fumobox.jnitest;

public class Test {

 static {
        System.loadLibrary("JNITest");
    }
 
 public native int test01(int value);
 
}
これがNativeコード呼び出し用のクラスになります。次はNativeコードの作成です。



C:\ws_android\ws_test\JNITestの下に、jniというディレクトリを作成してください。ここにNativeコードとビルド用のファイルが作成されます。

ADT内で、ProjectExplorer内にある、JNITestプロジェクトを右クリックして、Android Tools - Add Native Support ...を押すと、下のような画面が表示されるので、そのままFinishを押してください。



成功すると、jniディレクトリに、Android.mkJNITest.cppが追加されます。

スタードメニューのプログラムのファイルと検索にcmdと入力すると、cmd.exeが見つかるはずです。実行するとコマンドプロンプトが表示されます。

コマンドプロンプトで、cd C:\ws_android\ws_test\JNITestと入力して、プロジェクトのディレクトリに移動してください。

そこで、以下のコマンドを実行します。
javah -o jni/JNITest.hpp -classpath bin/classes com.fumobox.jnitest.Test
問題なければ、何も表示されません。成功すると、jniディレクトリ内にJNITest.hppというファイルが追加されます。ADTから見ると、JNITest.hppにエラーがあるように見えますが、ここでADTを再起動すると、エラー表示は消えます。コンソールにCannot run program "cygpath"というメッセージが表示されますが、これも無視しても問題ないようです。

JNITest.cppは下のように編集してください。関数名はJNITest.hppからコピーしました。
#include <jni.h>
#include <JNITest.hpp>
JNIEXPORT jint JNICALL Java_com_fumobox_jnitest_Test_test01(JNIEnv *env, jobject o, jint value) {
 return value * 7;
}
これで作業は完了です。実機かエミューレーターでアプリを起動してください。

Result: 63と表示されていたら、実行は成功です。

参考になったサイトはこちら

http://digital4johnny.blog.fc2.com/blog-entry-109.html

試してみて、もしうまくいったら、こちらにコメントいただけるとうれしなっしー



20140209
作業順が間違っていたので修正しました。

0 件のコメント:

コメントを投稿