2013/10/01

Eclipse CDT 上で Android NDK を使って実行ファイルを作成する方法

Android 用の実行ファイルを Eclipse CDT で作成する方法を書いておきたいと思います。
Android プロジェクトの中に実行ファイルを作成することも可能で、そちらの方が簡単です。
この記事は、「独立したバイナリ作るのに Java との混合プロジェクトを作るなんて気持ち悪い。」って思う人向けですそうそう居まい

前提条件として、以下が必要です。
  • ADT インストール済みで Java アプリケーションが作れる
  • CDT がインストール済み
  • Android Native Development Tools がインストール済み

Preprocessor Include Paths を無効にする

Eclipse 4.2 (JUNO) 以上を使用している場合は、以下の作業をしておかないと include path が適切に処理されません。
Android Native Development Tools が新しい CDT の機能に対応していないのが原因のようなので、そのうち必要なくなるかもしれません。

Window → Preferences → C/C++ → Property Pages Settings

Display "Preprocessor Include Paths" page のチェックを外す。
この作業は Workspace 毎に一度行えば大丈夫です。


新規C(++)プロジェクトを作成

必須ではありませんが、パースペクティブを C/C++ にしておくと良いでしょう。

File → New → C Project (C++ Project)


Makefile Project → Empty Project など Toolchains に Android GCC が含まれているものを探し、Android GCC を選択

空のプロジェクトが生成されます

Include path の追加

Android プロジェクトに JNI として C プロジェクトを追加した場合は、Include path の設定が自動で行われます。しかし、新規 C プロジェクトでは自動で行われません理由までは追っかけてないのですが、NDK が JNI に特化した作りになっていますので、もともと考慮されていないのだと思われます。
少々面倒くさいのですが、自分で設定してやる必要があります。

Project 右クリック → Properties → C/C++ General → Includes → Add

以下のようにパスを設定します。
NDK のインストールディレクトリは適宜修正してください。
C:\android-ndk-r9\platforms\android-18\arch-arm\usr\include

ビルドコマンドの変更

そのままでも、jni というディレクトリを作成すれば、ビルド可能なのですが、せっかくなので src というディレクトリ以下にソースコードを配置したいと思います。

Project 右クリック → Properties → C/C++ Build → Builder Settings

"Use default build command" のチェックを外し、Build command: の欄に以下を記述します。
注: この設定は、以降の Application.mk 等を作成することを前提にしています。

Linux
ndk-build NDK_PROJECT_PATH=$(PWD) NDK_APPLICATION_MK="$(NDK_PROJECT_PATH)/Application.mk" NDK_APP_DST_DIR="$(NDK_PROJECT_PATH)/out/\$(TARGET_ARCH_ABI)"

Windows
(Windows で引数を与える場合は、明示的に ndk-build.cmd を指定しないといけないようです)
ndk-build.cmd NDK_PROJECT_PATH=$(PWD) NDK_APPLICATION_MK="$(NDK_PROJECT_PATH)/Application.mk" NDK_APP_DST_DIR="$(NDK_PROJECT_PATH)/out/\$(TARGET_ARCH_ABI)"

Application.mk を作成する

正確には、Application.mk を作成しなくても良いのですが、柔軟なプロジェクト構成のためにはあったほうが良いでしょう。
基本的には、プロジェクトディレクトリの直下に配置します。

Application.mk
APP_PROJECT_PATH := $(NDK_PROJECT_PATH)
 
# ターゲットの Android.mk を指定する
APP_BUILD_SCRIPT := $(APP_PROJECT_PATH)/src/Android.mk

コード等の追加

src ディレクトリ等を作成し、Android.mk やソースコードを設置します。

src/Android.mk
LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_MODULE    := a.out
LOCAL_SRC_FILES := HelloWorld.c
 
include $(BUILD_EXECUTABLE)

本筋とは関係ないですが、一応ソースコードも載せておきます。

src/HelloWorld.c
#include <stdio.h>
 
int main(int argc, char *argv[]) {
 printf("Hello world.");
 return 0;
}

ビルド実行

Project → Build Project


out/armeabi/a.out 等、実行バイナリが出力されれば成功です。

うまくいかない場合は、Console にエラーが出ているはずです。
適切に対処してください。

0 件のコメント: