opamp_sando's blog

クソザコが割りと適当なことを書くためにある備忘録です。あとたまに普通の日記も書きます

Android NDKでHelloWorldしてみる (without Eclipse)

タイトルどおりAndroid NDKを使ってhello worldしてみる(Eclipseは使わない)
と言っても、ほとんどNDKに入ってたhello-jniを1から作るだけだけど。

SDKとかNDKは準備してありPATHも通してあるものとする。

Projectを作る

まずProjectを作る

$ android create project -t android-15 -p `pwd` -k "opamp.experimental" -a HelloWorld

値は適当に調整して。"-t android-15"にするとandroid 4.0以降のみの対応になるので2.xとかならandroid-10くらいにするといい。-pはprojectを作るディレクトリを指定する。`pwd`だとカレントディレクトリになる。

Javaコードを記述する

まず、javaの方から記述してみる。例えば次のような感じ。

package opamp.experimental;

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

public class HelloWorld extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
                /*helloメソッドからの戻り値を表示するプログラム*/
                TextView t = new TextView(this);
                t.setText(hello());
                setContentView(t);
    }

        public native String hello(); // これがhelloメソッド(あとでC言語で実装する)。nativeをつける

        static {
                System.loadLibrary("hello");//helloをロードするみたいな。
        }
}

とりあえずこれでおk。

jniディレクトリを作る

これ以降を上のandroidコマンドの-pで指定したディレクトリ(プロジェクトのrootディレクトリ)とする。

$ cd <project>

まずprojectに移動してjniディレクトリを作る

$ mkdir jni

Cを書いてみる。

さっき作ったjniの中にhello.cを作る

$ touch hello.c

そしてこれに以下のように記述する

#include<string.h>
#include<jni.h>

/*
jstringとかその辺はおそらくjniのものなのでjniで調べれば詳しくわかる(と思う)。
メソッド名はJava_から初めて"_"で区切ってパッケージ名、そのメソッドのある(javaの)ソース
そして最後にメソッド名(ここではhello)というふうに命名する。
*/
jstring Java_opamp_experimental_HelloWorld_hello(JNIEnv* env, jobject thiz){
        return (*env)->NewStringUTF(env, "Hello World!!");
}

こっちはほんとsampleのコピーだけど...

Android.mkを作る

同じくjniのディレクトリにAndroid.mkを作り以下のように書き込む

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
#include $(BUILD_EXECUTABLE) #このように書くと実行可能ファイルがビルドされる (main関数が必要)
include ${BUILD_SHARED_LIBRARY} #このように書けば今回利用できる共有libraryが生成される。

最後のincludeはコメントにも書いたがBUILD_SHARED_LIBRARYとする。ちなみに実行可能ファイルを作ってみてandroid端末に持って行ってターミナルから実行しようとしたが権限が無くて結局できなかったし、chmodもunable to chmodと言われて結局権限付与もできなかった。(多分出来る端末もある)

ビルドのためのスクリプトを書く

シェルスクリプトなどでビルド用のスクリプトを書く。ぶっちゃけいるんだろうか?(規模が大きく複雑化したらあったほうが便利なのかな)
名前はなんでもいい。(今回はbuild_native.sh)とした。

#!/bin/sh
ndk-build #Android-NDKのrootにPATHを通す必要があるよ。

とそんな感じで書けばおk。

アプリケーションをビルドしてapkを生成する。

実際にビルドしてみる。

$ cd <project>
$ ./build_native.sh &&ant debug

でビルド。うまく行けば共有ライブラリが生成され続いてapkがビルドされ/bin以下に出力される。

適当に端末に送って実行

Dropboxなりなんなりで端末にapkを送ってインストールして実行してみる。
うまく行けばHelloWorldできてるはず。
面倒だったので画像はない...orz

終わりに

とりあえずhello worldならこんな感じかな。とりあえず今後もうちょっと勉強して色々できるようになりたい。
何かあったらその都度またここにメモしていくことにするよ。

Firefox ブラウザ無料ダウンロード