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ボードを使って実験したことを書いたページをまとめてみました。

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード