2015年2月13日金曜日

android NDK をandroid studioから使う

前回android ndk をeclipseから使う方法を紹介したが
http://kokawa2003.blogspot.jp/2015/02/android-ndk.html
同じ事をandroid studioでするともっと簡単。
それを以下に紹介する。

目的はString okawapos(int pos)をCで実装してJavaから使うこと。

まずNDKをandroid studioで使う方法だが
https://developer.android.com/tools/studio/index.html
https://developer.android.com/tools/sdk/ndk/index.html
には全く記述なし。
だから将来変わるのかもだけど現在十分簡単だから変わらないと思う。
なお使ったバージョンはandroid studio 1.1 beta4
やりかた
①androidアプリプロジェクトを作る
   プロジェクト hello4
           パッケージ com.fujikom.www.hello4
   このMainActivityにString okawapos(int pos) を作るので以下のように実装
public class MainActivity extends ActionBarActivity {
    public native String  okawapos(int pos);
    static {
        System.loadLibrary("hello");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tv = new TextView(this);
        tv.setText( okawapos(5) );
        setContentView(tv);
    }
 略
②このプロジェクトにjniフォルダを作り中にファイルを2個Android.mk,hello.c入れる

 これはandroid studioからフォルダを右クリックー>新規でOK
   ファイルの中身はこれ
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := hello.c
include $(BUILD_SHARED_LIBRARY)
モジュール名の定義LOCAL_MODULE    := helloがないことに注意。いらない
hello.c
#include <string.h>
#include <jni.h>
jstring
Java_com_fujikom_www_hello4_MainActivity_okawapos( JNIEnv* env, jobject thiz,jint pos )
{
    char buff[256];
    sprintf(buff,"Hello, World! %d okawa kouji \n",pos);
    return (*env)->NewStringUTF(env, buff);
}
何度もいうがこの関数名のルール”パッケージ_クラス_関数名”のルールを守ること
③ビルド定義を書く。
build.gradleに
        ndk {
            moduleName "hello"
        }
を書く。これがSystem.loadLibrary("hello");と一致すれば成功する。
こんな感じ
    defaultConfig {
        applicationId "com.fujikom.www.hello4"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName "hello"
        }
    }
build.gradleは2ファイルあるので間違えないこと

④ndkのパスを定義
local.properties を開くと
sdk.dir=/home/kokawa2003/adt-bundle-linux-x86-20140702/sdk
となっているので上か下にNDK追記
ndk.dir=/home/kokawa2003/android-ndk-r10
sdk.dir=/home/kokawa2003/adt-bundle-linux-x86-20140702/sdk
とする。
⑤実行、うまく行けば実行され
Hello, World! 5 okawa kouji
が表示される