VisualStudio上でAndroidNDKを使った開発を行う

正直なところAndroidでゲームを作るなら出来る限りJavaなどを使わず、ほぼ全てをNDKを使ってC/C++で書いたほうが効率が良いと思うのです。ただ、NDKで開発する場合はメイクファイルを書かないといけなかったり、cygwinからndk-buildを叩かないといけなかったりと微妙に面倒くさい。

そこで色々調べていると、VisualStudioのMSBuildを使ってVisualStudioでNDKを用いた開発を行うようにできる「vs-andorid」を見つけたので紹介します。

▼vs-android
GitHub - gavinpugh/vs-android: Integrated development of Android NDK C/C++ software with Microsoft Visual Studio.

これを使えばコンパイルからリンク…パッケージファイルの生成までVisualStudio上で行うことができるようになります。また、コンパイル時間についてもNDK標準のndk-buildより早いという特徴もあるので利用を検討するメリットは十分にあるかと思います。
素晴らしいです!Gavin氏ありがとう!

インストールについて

このプロジェクトの「Installation」にしっかりインストール方法を書いてくれているのでそちらを見れば十分かと思いますが、せっかくなのでインストール手順についても説明しておきます。

インストールする前に用意するもの

通常の開発環境も準備しておきましょう。インストール方法などは過去の投稿の「Android SDKのインストール」を参考にすると良いかも知れません。

最新版のNDKをインストールしておきましょう。残念ながらウチではインストール方法の記事を書いていないので、google先生に質問してみてください…いずれウチでも書いときます…。
インストール後は環境変数ANDROID_NDK_ROOTを追加しておきましょう。*1

変数名 ANDROID_NDK_ROOT
変数値 C:\android-ndk-r5b*2

Visual Studio 2010が必要になります…持ってないよ…ってか自分はVS2008しか持ってません…っが、無料で使えるExpress版でも問題なく動作したので心配はありません。
Visual Studio 2010 Expressはこちら「http://www.microsoft.com/japan/msdn/vstudio/express/」からダウンロードできます。ここのVisual C++ 2010 Expressをインストールしておきましょう。インストール後は再起動を求められるのでご注意を。

インストール

では、早速インストールします。
もちろん上述の3つが既にインストールされていることが前提となります。

まずは、プロジェクトサイトのDownloadsから最新版のvs-android-*.zipをダウンロードしてきます(現時点でのバージョンはv0.21)。サンプルプロジェクトである「sanangeles.zip」もアップされているので一緒に落としておくと良いでしょう。

ダウンロードできたら適当な場所に解凍し*3、解凍したフォルダ直下にあるMSBuildフォルダの中の「install.cmd」を実行します。
これだけでvs-android自体のインストールは完了です。

Apache Antについてもあった方が良いらしいのでインストールします。
Apache Ant - Binary Distributions
上記のサイトの「Current Release of Ant」にある最新のパッケージをダウンロードしてきて、適当な場所に解凍します。基本的には全角やスペースを含まない場所であればお好みで問題ありません。ここで配置したパスはあとで使うので覚えておいてください。
また、Javaが必要になるようですがSDKを正しくインストールしてあるなら恐らく問題ないかと思います。

実際に使ってみる

インストールができたら実際にサンプルプロジェクトを使って試してみましょう。サンプルプロジェクトはvs-androidプロジェクトサイトのDownloadsにある「sanangeles.zip」です。これを雛形にしていくと良いのかも知れません。
使い方についても、プロジェクトサイトの方(ここ)でも詳しく解説されています。
ここでの解説も「sanangeles.zip」を使って説明します。

新規プロジェクトの作成

まずは、VisualStudio2010を立ち上げて新しいプロジェクトを作成します。自分はVisualStudio2010を持っていないので、ここではVisual C++ 2010 Expressを用いて手順を説明しています。
新しいプロジェクトは、メニューのファイル>新規作成>プロジェクトから作成できます。
空のプロジェクトを選択し、プロジェクト名をサンプルと同じ「sanangeles」としましょう。場所は各自適用の場所を指定してください。また、「ソリューションのディレクトリを作成」のチェックを忘れずに外しておきましょう。自分はコレを見落としていて少し躓きました。

サンプルプロジェクトをVSのプロジェクトに追加

新規プロジェクトを作成したら、ダウンロードしておいた「sanangeles.zip」を解凍し、中身全てを作成したプロジェクトにコピーしてください。上の例であれば、C:\work\android\sanangelesフォルダに、「sanangeles.zip」内のjniフォルダ、resフォルダ、srcフォルダ、AndroidManifest.xmlbuild.xml、default.properties、local.propertiesをコピーすることになります。
コピーしたら、jniフォルダのソースファイルをプロジェクトに組み込みましょう。

ソリューションプラットフォームを追加

次にAndroidプラットフォーム用の構成を追加します。構成の追加は、ソリューションエクスプローラーのソリューションを右クリック>構成マネージャーから行うことが出来ます。


OpenGLESを使うための設定

サンプルではOpenGLESを使っているので、GLESが静的リンクされるよう設定します。
ソリューションエクスプローラーのプロジェクトを右クリック>プロパティを選択し、プロジェクトのプロパティダイアログを開きます。プロパティダイアログの「構成プロパティ>C/C++プリプロセッサ」を選び、「プリプロセッサの定義」を編集し、「DISABLE_IMPORTGL」してください。

続いてリンカーの設定もしておきます。同じくプロジェクトのプロパティダイアログから「構成プロパティ>リンカー>コマンドライン*4」を選び、「追加オプション」に「-lGLESv1_CM」を追加します。

Ant Buildを設定

次はAnt Buildの設定を行います。
「構成プロパティ>Linker>Android Ant Build」を選び、「Ant Build」の項目を「ant debug」に設定し、「Path to Ant Batch File」に事前に配置しておいたAntのなかにある「ant.bat」へのパスを設定します。

最後に、「local.properties」ファイル内の「sdk.dir」にAndroidSDKのパスを記述してください。「local.properties」は今回作成したプロジェクトファイルと同じフォルダ内にあります。

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must *NOT* be checked in Version Control Systems,
# as it contains information specific to your local configuration.

# location of the SDK. This is only used by Ant
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=C:\\Program Files\\Android\\android-sdk-windows
ビルド

以上でひと通り設定完了です。F7キーを押して実際にビルドしてみましょう。

ビルドが正しく通れば↑のようにBUILD SUCCESSFULと表示され、パッケージが生成されます。
もし「Unable to locate tools.jar」と表示されてビルドに失敗するようであれば、環境変数に「JAVA_HOME」を追加してからリビルドしてみてください。自分の場合、この設定を行わないとエラーが出ました。

変数名 JAVA_HOME
変数値 C:\Program Files\Java\jdk1.6.0_23*5

このエラーについては、下記のブログを参考にさせて貰いました。
takuanのメモ antでUnable to locate tools.jarが出た場合の対処

最後に

それでは、最後に生成されたパッケージを起動してみます。
AndroidSDKのplatform-toolsフォルダ内にあるadb.exeを利用します。
サンプルのプロジェクトの場所*6に、apk-install.batを作成し下記のように記述します。

"%ANDROID_SDK_ROOT%\platform-tools\adb" install -r bin\DemoActivity-debug.apk
"%ANDROID_SDK_ROOT%\platform-tools\adb" shell am start -n com.example.SanAngeles/.DemoActivity

AndroidSDKへのパスは各自違う場合がありますが、ここでは便宜上ANDROID_SDK_ROOTにパスが設定されているとして説明します。それぞれ、各自完了に合わせて書き換えてください。
このバッチファイルをダブルクリックすれば、端末にパッケージがインストールされ、その後アプリが起動します。

おわり

ん〜、こんなところでしょうか?ひとまず、これでVisualStudio上でビルドを行い、バッチファイルを叩くことで端末へのインストール→起動を行うことができます。実際の運用方法だったりは各自検討してみてください。
現状ではVisualStudio上でデバッグできるわけでは無いようですし、Java部分に関しても完全スルーな感じですが、ほぼネイティブコードのみで開発するのであれば、ビルド時間が短くなる、メイクファイルを書く必要がない、もちろんVisualStudio上なのでインテリセンスの恩恵を受けられるなどの利点があるので、活用方法を模索してみると面白いと思います。
また、良い使い方など思いついたなら教えてもらえると嬉しいですね。

*1:マイコンピュータ右クリック>プロパティ>詳細設定タブ>環境変数、から設定できる。

*2:各自の環境で様々です。環境に合わせたものを設定してください。

*3:全角パスや半角スペースを含まない場所にしておいた方が無難かもしれない(未検証)。

*4:Linkerと、リンカーがありますがカタカナのリンカーの方です。

*5:このパスは各自違う可能性があるので、適宜JDKへのパスを設定してください。

*6:sanangeles.vcxprojなどがある場所です。

画面の向きを固定する

Androidでゲームを作る際、端末の向きに関係なくシューティングゲームなら縦画面!アクションゲームなら横画面固定!って感じで作りたくなる。そんなときは、マニュフェストファイルの方で設定してしまえば固定することができます。

マニュフェストファイルはEclipseから直接編集できるのでそれを利用しましょう。

設定できる内容はここに詳しく記載されています。(英語)
http://developer.android.com/guide/topics/manifest/activity-element.html#screen

簡単に下の3つの機能さえ把握しておけば良いかと。

unspecified

システムによる自動選択、要するにデフォルトの挙動。

portrait

縦画面固定。*1

landscape

横画面固定。*2


以上、これで画面の向きに左右されずアプリ作りに専念できるようになります。

*1:GLSurfaceView.onSurfaceChanged(w,h)時にhの方が大きな値でくる模様。

*2:GLSurfaceView.onSurfaceChanged(w,h)時にwの方が大きな値でくる模様。

Android自作アプリでタイトルバーを消す

Androidでアプリを…もといゲームを作っていると画面上部に出てくるタイトルバーが邪魔です。

なので、消して完全なフルスクリーンにしてしまいましょう。
これは、ActivityクラスのonCreateで下記のようなコードを呼び出せば実現できます。

// この2つをインポートしないとエラーになります
import android.view.Window;
import android.view.WindowManager;

public class ExampleActivity extends Activity
{
    private ndk.application.Framework m_application;

    @Override
    public void onCreate( Bundle savedInstanceState )
    {
        super.onCreate(savedInstanceState);

        // フルスクリーンにします
        setFullscreen();

        // 以下色々な実装
    }

    // フルスクリーン化
    private void setFullscreen()
    {
        // フルスクリーンに設定し、タイトルバーを消しています
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
    }
}

こんな感じです。
ん〜、ソースコードの色が見辛い・・・。

Androidの実機画面をキャプチャする

Androidアプリ開発を行っていると実機上の画面をキャプチャ(スクリーンショットを撮る)したくなることがあると思います。ブログに開発日記書くときなんかも画像貼った方が見栄えがしますし。
エミュレータWindowsのPrintScreenでキャプっても良いですが、エミュレータが動作が重いですからね・・・。ってことで、実機画面をキャプチャするわけですが、これにはAndroid SDK Toolsに入っている「ddms.bat」を利用します。

「ddms.bat」を使うには、Android SDKのplatform-toolsにパスが通っている必要があります。設定するパスについては、以前の記事「実機(xperia)で開発中のアプリを動かす」の方で解説しているのでソチラを参照してもらえると助かります。

パスの設定ができたら、コマンドプロンプトを開いて*1次のコマンドを打ち込み「Dalvik Debug Monitor」を立ち上げます。・・・あ、この時点で実機がPCにつながっている必要があります。コレについても先ほどの記事を参考にしてください。

C:\>ddms(enterキーを入力)

するとこんな画面が立ち上がるはずです。

メニューの「Device」から「Screen Capture」をクリックすれば実機の現在の画面がキャプチャすることができます。・・・できたでしょうか?うまく行かない場合は、実機がキチンと認識されているか、パスは正しく通っているか再度確認してください。

Androidマーケット提出時のスクリーンショットなどもこの機能を使って作成すれば良いのかな?

*1:スタートメニュー>ファイル名を指定した実行>cmdと入力してEnterキー

実機(xperia)で開発中のアプリを動かす

Androidアプリ開発を始めましたが、肝心のAndroid端末を持っていなかったのでこの度中古のXperiaを購入しました。今のところSIMカード無し(WiFi通信のみ)で、開発用の端末として使いたいと思っています。*1

ということで、早速Xperiaでサンプルを動かしてみたので、手順をメモとして残しておきます。

PATHを設定(事前準備)

まずは、今後色々(adb.exe/dmms.batなど)使うかと思うので、Android SDK Tools関連のパスを通しておきます。*2

恐らくデフォルトの設定でAndroid SDKインストールした場合は、下の場所にインストールされているはず。

パスが確認できたら、マイコンピュータを右クリックし「プロパティ」を選択し、システムプロパティダイアログを開き、そこからシステムプロパティの「詳細設定」タブに移動し、「環境変数」ボタンをクリックして環境変数ダイアログを開く。

「システム環境変数」のリストの中に変数「Path」を探しダブルクリック、すると変数の編集ダイアログが開くので、「変数値」の箇所の末尾に下記の2つのパスを追加します。

ドライバのインストール

次にPCにxperiaにアクセスするためのドライバをインストールします。

PCとXperiaをUSBケーブルでつないだ状態*3で、Xperiaの「設定」>「アプリケーション」>「開発」へ行き、「USBデバッグ」を有効にします。*4

すると暫く待っていれば、PC側で新しいハードウェアが云々といって、ドライバのインストールを促してくると思うので、あとは指示に従って進めていけばドライバがインストールされます。

Xperiaが認識されているか確認

とりあえず、ドライバがインストールされていればXperiaと接続できる状態にあるはずなので、正しく動作しているか確認しましょう。
コマンドプロンプトを開いて*5、次のように入力します。

C:\>adb devices
※adbは、パスを通した「C:\Program Files\Android\android-sdk-windows\platform-tools」に置かれている。


するとこんな感じで、認識されているデバイスが列挙されます。
ただ、もしかするとうまく行かない人が居るかもしれない・・・というか自分は上手く行かなかったので。そういう人は、下の手順も試してみてください。

C:\>adb kill-server
C:\>adb start-server
C:\>adb devices


「ハードウェアの安全な取り外し」からXperia(ADB Interface Driver)を停止させようとすると、無理ですと言われることがありますがコレについては、上記の「adb kill-server」をすれば停止できるようになるので、「adb kill/start-server」についても覚えておくほうが吉かと。

実際にAndroid端末(Xperia)上でサンプルを動かす

それでは実際にXperiaにてサンプルを起動させるので、eclipseを立ち上げます。
eclipseが立ち上がったら、メニューの「実行」>「実行構成」>「Android アプリケーション」から目的のプロジェクトを選択し、「ターゲット」タブに移動後に「Depelopment Target Selection Mode」を「手操作」に設定しておきます。

この設定にしておくことで、アプリ実行時にどの端末を使うのか確認してくれるようになります。
それでは、この状態で目的のプロジェクトを実行してみてください。すると、下記のようなダイアログが出てきますので、端末を選択して実行します。

実行すれば端末にアプリがインストールされ、実際にアプリが起動します。

※コレはAndroid SDKのサンプル「JetBoy」の画面です。

これで、開発中のアプリが実機上で動作させられるようになったはずです。もし上手くいかないって場合は、Xperiaの「設定」>「アプリケーション」の「提供元不明のアプリ」にチェックマークを入れてから試してみると良いかもしれません。

最後に

デバッグ時の端末設定

開発中のアプリデバッグ時に端末側のいくつか設定を行うかもしれません。
可能性としては、

  • 設定>アプリケーション>開発>USBデバッグ
  • 設定>アプリケーション>開発>スリープモードにしない
  • 設定>アプリケーション>提供元不明のアプリ

これら3つかな?・・・これらは、普段は必要ない機能だと思うのでデバッグが終了したら元に戻しておいたほうが良いです。この辺をまとめてON/OFFするウィジェットがあれば教えて欲しいかも・・・。

インストールされたアプリ

eclipse経由で起動した開発中のアプリについても、実際にAndroid端末にインストールされているので必要なくなったらアンインストールしたほうが良いかも知れません。ただ、デフォルトのアプリケーション管理画面が凄く使いづらいので、なんらかのアンインストーラー系のアプリを入れたほうが無難です。
自分の場合は、「Easy Uninstaller」を入れてあります。
このアプリならインストール日時順にソート*6することができるので、目的のアプリを探しやすくなるのでお勧めです。

次回

今回はここまで。この日記を書く際に実機画面のキャプチャ(スクリーンショット)画像を貼り付けていますが、このキャプチャ方法については次の日記にでもメモを残しておきたいと思います。

*1:Xperiaは手に入れた時点ではver1.6の状態だったので、ひとまずPC経由でver2.1アップデートしてある

*2:Android SDK Tools関連のパスの場所がよく分からないという場合は、Windowsのスタートメニューから、「Android SDK Tools」>「SDK Manager」を右クリックして「プロパティ」ダイアログを開き、そこの「リンク先」に設定されているパスを参考にすると良い。

*3:"充電する"の状態で問題ない。

*4:スリープモードのチェックはお好みで。

*5:Windowのスタートメニュー>ファイル名を指定して実行>名前に"cmd"と入力してEnterキー

*6:Sortメニューで「By Date Descending」にしておく。

Android NDKでメイクファイルを書きたくない!

Android NDKでC/C++コードをビルドするために、Android.mkファイルを編集する必要がありますが出来る限り書きたくないです。
だって、面倒くさい…。
ソースファイル追加するたびに、LOCAL_SRC_FILESに追記していくのは、ちょっと…。なので、jniフォルダ以下のC/C++コードを検索してビルドされる形にAndroid.mkを変更しました。

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

# モジュール名
LOCAL_MODULE := ndk-application

# # インクルードディレクトリを追加したい場合はココに追記
# # 現在はコメントアウトしてある
# LOCAL_C_INCLUDES += $(LOCAL_PATH)/hoge

# # リンクさせたいライブラリがある場合はココに追記
# # 現在はコメントアウトしてある
# LOCAL_LDLIBS += -llog
# LOCAL_LDLIBS += -lGLESv1_CM

# ソースファイルのリストアップ
# コンパイル対象(c/cpp)のファイルをリストアップする
LOCAL_SRC_FILES += $(shell find -name '*.c')
LOCAL_SRC_FILES += $(shell find -name '*.cpp')

# 検索直後はパスに./jni/が含まれてしまっているので削除
LOCAL_SRC_FILES := $(subst ./jni/,, $(LOCAL_SRC_FILES))

include $(BUILD_SHARED_LIBRARY)

こんな感じです。
とりあえずこれでjniフォルダ以下の全てのc/cppファイルがコンパイル対象になってビルドが走るようになります。この方法だとjni以下のソースコードが否応なしにコンパイル対象になってしまうので、それはそれで問題かもしれません。コンパイルを通したくない場合、jniフォルダ(以下)から退避させておく必要があるので注意です。
まぁ、ソースファイルをいちいちメイクファイルに書き出したくないって人で、とりあえずビルドできればいいやって方は参考にしてみてください。

……というか、自分は勘違いしていて、そもそもAndroid.mkなんて触らなくていいんだけど…ってオチはないんでしょうか?Eclipse側で管理できるよ〜とか、何かその辺の情報持っている方居られたら是非教えて欲しいです…。
このままだと、自分でNDKのプロジェクト管理ツールを作ってしまいそうなので。

Android SDKのサンプル"SkeletonApp"を動かす

今回は、前回試すことができなかったSDKサンプルを動かしてみたいと思います。

まずはSDKのサンプルを自身のワークスペースにコピーしてきます。*1
サンプルはデフォルトのインストール状態であれば下記の場所に配置されています。

同フォルダには「android-7〜9」などのフォルダがありますが、前回作成したXperia風のADVが「Android 2.1-update1 - API Level 7」ですので、今回は「android-7」に含まれるサンプルを使います。「android-7」の中にある「SkeletonApp」をフォルダごと各自のEclipseワークスペースにコピーします。

自分の場合は、ワークスペースフォルダ内に「samples」フォルダを作成し、その中に「SkeletonApp」をコピーしました。

  • c:\work\android\workspace\samples\SkeletonApp


コピーが終わったらEclipseからプロジェクトを読み込みます。
Eclipseのメニュー「ファイル⇒新規⇒その他」から「Android プロジェクト」ウィザードを選択します。

*1:別にコピーする必要はないが念のため

続きを読む