2013/10/01

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

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

Eclipse CDT 上で Android NDK を使った JNI 作成環境を構築する

昔はコマンドラインから ndk-build を叩かないといけなかった Android NDK ですが、 いつの頃からか、Eclipse CDT 上でビルド出来るようになりました。
せっかくの統合開発環境ですから、これを使わない手はありません。
というわけで、環境構築方法を書いておこうと思います。

以下、前提条件です。
  • 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 毎に一度行えば大丈夫です。


既存のAndroidプロジェクトに JNI を追加する

まず、普通に Android アプリケーションプロジェクトを作成します。
その後、
プロジェクトを右クリック → Android Tools → Add Native Support...

jni ディレクトリが作成され、Android.mk 等が作成されているはずです。

ビルドする

Project → Build Project
libs 以下に soファイルが作成されます。

あとは、普通のJNI プロジェクトとして作成すればOKです。

2013/09/27

Android NDK で出力ディレクトリを libs 以外にする方法

Android NDK でデフォルトディレクトリを jni 以外にしてみたのは良いのですが、実行ファイルなのに libs ディレクトリに出力されるのはいかがなものかと名は体を表すべきなのです。
というわけで、libs ディレクトリ以外に出力する方法も書いておきます。

方法は簡単で、以下のように NDK_APP_DST_DIR に出力先のディレクトリを指定してやるだけです。

$ ndk-build NDK_APP_DST_DIR="${PWD}/out/\$(TARGET_ARCH_ABI)"

デフォルトだと、out/armeabi 以下に成果物が出力されます。

TARGET_ARCH_ABI の前の $ がエスケープされていることに注意してください。
TARGET_ARCH_ABI はターゲットアーキテクチャで、ビルドターゲットによって変わります。
つまり、このコマンドを実行した段階では展開してはいけません。
後展開するように、$ をエスケープしているわけです。

Windows の場合は以下のようになります。
> ndk-build.cmd NDK_APP_DST_DIR="%cd%/out/$(TARGET_ARCH_ABI)"

Windows の場合は $ が環境変数として展開されませんので、エスケープする必要はありません。


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日記


2013/01/17

Eclipse に NDK Plugin を入れようとしたら "Cannot complete the install because one or more required items could not be found" エラー

このところ、出番が少なくなってきたノートPC (Windows 7 64bit)。
長いこと放ったらかしになっていたので、開発環境を構築しなおしてみました。

「ブログのネタにもなるしね。」とか思って始めたのですが、早々にエラーが。
Eclipse (Juno RC1) をインストールして、最初に ADT をインストールしようとしたところ、 Cannot complete the install because one or more required items could not be found と言われてしまいました。
正確には Android Native Development Tools (NDK Plugins) をインストールしようとしたところでエラーが出ています。
以下、エラー部分抜粋
Cannot complete the install because one or more required items could not be found.
  Software being installed: Android Native Development Tools 21.0.1.v201212060256-543035 (com.android.ide.eclipse.ndk.feature.group 21.0.1.v201212060256-543035)
  Missing requirement: Android Native Development Tools 21.0.1.v201212060256-543035 (com.android.ide.eclipse.ndk.feature.group 21.0.1.v201212060256-543035) requires 'org.eclipse.cdt.feature.group 0.0.0' but it could not be found

「あれ、今までこんなエラー出たことないぞ」と思ってよくみてみると、CDT が入ってなかったからでした。
(赤字のところです)

今までは CDT のインストールの方を先にやってたからなぁ…
組み込み屋ではなくなってきたのを実感。

というわけで、CDT をインストール。
CDT Downloads

Eclipse を再起動の後、もう一度 Android Native Development Tools のインストールを試みると、今度はすんなりインストール出来ました。

Eclipse も依存関係とか自動でチェックしてインストールしてくれると楽なんですけどねぇ