2010年08月24日
AndroidのNDKのツールを使って実行ファイルをビルドする簡単な方法
AndroidのNDKはJavaからJNIを経由して呼び出すダイナミックリンクライブラリを作るためのツールですが、ここに含まれるコンパイラとインクルードヘッダ、ライブラリを使って普通にmainから始まる実行ファイルをビルドすることもできます。ここではその簡単な方法を紹介します。
Makefileの記述
Makefile
NDK_TOPにはNDKをインストールしたディレクトリを指定します。
NDK_TOP=/path/to/your/android-ndk-r4b CC = $(NDK_TOP)/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc LIBS = -llog TARGET_ARCH_CFLAGS = -march=armv5te -msoft-float SYSROOT = $(NDK_TOP)/build/platforms/android-4/arch-arm CFLAGS = -mandroid --sysroot=$(SYSROOT) $(TARGET_ARCH_CFLAGS) LDFLAGS = -mandroid --sysroot=$(SYSROOT) $(LIBS) hello : hello.o
ポイントはCFLAGSとLDFLAGSに-mandroidと--sysrootを指定することです。gccの-mandroidオプションに関しては以前の記事でも紹介しました。
サンプルプログラム
hello.c
#include <stdio.h> #include <android/log.h> #define LOG_TAG "hello" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) int main() { printf("Hello, world to stdout.\n"); LOGI("Hello, world to log.\n"); return 0; }
adb shellからの実行。
# ./hello Hello, world to stdout. #
logcatの結果。
I/hello ( 292): Hello, world to log.
参考:logwrapper
androidにはlogwrapperというユーティリティコマンドがあり、これを使うとstdoutをandroidのログシステムにリダイレクトすることができます。
logwrapper経由で起動。
# logwrapper ./hello #
ttyには何もでません。
代わりにlogcatの方に出てます。
I/hello ( 296): Hello, world to log. I/./hello ( 295): Hello, world to stdout. I/logwrapper( 295): ./hello terminated by exit(0)
次回予告
次はもう少し実用的なプログラムとして、ruby 1.9.2 のビルド方法を紹介します。
トラックバックURL
トラックバック一覧
1. KZM-CA9-01ボードのリンク集 [ KMC Staff Blog ] 2010年09月16日 10:44
4コアのCortex-A9のKZM-CA9-01ボードを使って実験したことを書いたページをまとめてみました。