2013/09/27

Android NDK でデフォルトディレクトリを jni 以外にする方法

Android NDK のビルドツール ndk-build はデフォルトでプロジェクト直下の jni ディレクトリを見に行き、その Application.mk もしくは Android.mk から処理を開始します。
JNI 製作時は便利なのですが、実行ファイルを作りたい時などは、「jni というディレクトリ名はどうなのよ?」って思いますJNI じゃなくても、jni ディレクトリ以下に作っておけば良いという考え方もあるかもしれませんが、やはり名は体を表すべきです。
他人(未来の自分)が混乱するものは極力避けるべきでしょう。


というわけで、任意のプロジェクト構成で ndk-build する方法を探ってみました。
例として、以下のような構成のプロジェクトで Android 用の実行ファイルを作成してみます。

$(NDK_PROJECT_PATH)/
                   |-src/
                   |    |-HelloWorld.c
                   |    |-Android.mk
                   |
                   |-Application.mk

Application.mk を作成する

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

Application.mk
APP_PROJECT_PATH := $(NDK_PROJECT_PATH)

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

プロジェクト作成

プロジェクトの作成は、jni 以下に作成するのと同様に行います。
例えば、以下のような感じです。

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;
}

ビルド

プロジェクト直下で、ndk-build を実行します。
この時、以下のようにオプションを追加するところがポイント。

$ ndk-build NDK_PROJECT_PATH=${PWD} NDK_APPLICATION_MK="\$(NDK_PROJECT_PATH)/Application.mk"
Compile thumb  : a.out <= HelloWorld.c
Executable     : a.out
Install        : a.out => libs/armeabi/a.out

NDK_PROJECT_PATH にプロジェクトのルートディレクトリ。
NDK_APPLICATION_MK に Application.mk ファイル。
上記2点を適切に指定する必要があります。

実行すると、無事 libs/armeabi/a.out が作成されました。

また、Windows の場合は以下で同様の処理が可能です。
> ndk-build.cmd NDK_PROJECT_PATH=%cd% NDK_APPLICATION_MK="$(NDK_PROJECT_PATH)/Application.mk"
"Compile thumb : a.out <= HelloWorld.c
Executable     : a.out
Install        : a.out => libs/armeabi/a.out

Windows の場合は $(PWD) が定義されていませんので、同様の環境変数 %cd% を使用してやる必要があるわけです。

参考
作成した実行ファイルをエミュレータ等に送って実行したりできます。
Android NDK で .so ではなく、実行ファイルをつくる - Hacking My Way ~ itogのhack日記


0 件のコメント: