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; }
- Android.mk
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 以下に
- hello-exe.c
- Android.mk
を置いて、
$ 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と関係なしでネイティブの動作確認ができるので、呼び出し側の問題かネイティブコード内部の問題かの切り分けなどに使えそうですね。