Android NDK で .so ではなく、実行ファイルをつくる

AndroidにはNDKという、JavaではなくネイティブのC/C++で開発するためのツールチェインが用意されていて、これを使えばパフォーマンスアップを望めたり、C/C++で書かれた資産を流用出来たりします。

こういった使い方をする場合は、ネイティブのコードをコンパイルして.soをつくり、それをJavaからloadLibrary()でロードする、という使い方をするのですが、.soではなく、実行ファイル形式もつくることが出来ます。

やり方は至って簡単で、Android.mkに以下を追記するだけです(※NDK r4)

include $(BUILD_EXECUTABLE)

サンプル
  • hello-exe.c
#include
int main(int argc, char ** argv)
{
	printf("Hello, world!\n");
	return 0;
}
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-exe
LOCAL_SRC_FILES := hello-exe.c

include $(BUILD_EXECUTABLE)
ビルドと実行

通常のNDKビルドと同様です。
$NDK_DIR/samples/hello-exe/jni 以下に

を置いて、

$ cd $NDK_DIR/samples/hello-exe
$ ../../ndk-build -B 

すると libs/armeabi 以下にhello-exe という実行ファイルが生成されます。

あとは端末上でパーミッションのある任意のディレクトリにコピーして、実行します。

$ adb push libs/armeabi/helloexe /data/data/com.itog_lab.sample.hello-exe

端末上で実行

$ adb shell
$ cd /data/data/com.itog_lab.sample.hello-exe
$ ./hello-exe
Hello, world!

直接実行することで、Javaと関係なしでネイティブの動作確認ができるので、呼び出し側の問題かネイティブコード内部の問題かの切り分けなどに使えそうですね。

元ネタ