cocos2d-x 勉強第2回「Android向けにビルドする」

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー SEGAさん、DIVAの筐体ください(ズザー

前回のおさらい

前回(cocos2d-x 勉強第1回「Hello World」)は、 cocos2d-xのインストールから、プロジェクトの作成、iOS向けのビルドまでを試しました。
今回は、Android向けのビルドを試してみることにします。

build_native.shの実行

ぐぐったり、proj.androidの中身を見ていたりすると、ビルドにはproj.android/build_native.shの実行をすればよいらしいことが分かる。
必要な外部ライブラリなどもあるようだけれど、まずはやってみるのが信条なのである。

$ ./build_native.sh
please define NDK_ROOT

please define NDK_ROOT
(NDK_ROOTを定義してくれ)

いいだろう。定義しようじゃないか。

Android NDK/SDKのインストール

Android NDKとは?

The NDK is a toolset that allows you to implement parts of your app using native-code languages such as C and C++.

(智史之介訳: NDKは、CやC++のようなネイティブコード言語を使用してAndroidアプリケーションを実装できるようにするツールセットでござる。)

ほほう。クロスコンパイラ御用達のライブラリということですな。

Android SDKとは?

The Android SDK provides you the API libraries and developer tools necessary to build, test, and debug apps for Android.

(智史之介訳: Android SDKは、Androidアプリのビルド、テスト、デバッグに必要なツールおよびAPIライブラリ群を提供するでござる。)

自分の環境はUnityの勉強時に既に入れてあるので、今回これが必要かどうかはわからないけど、とりあえず入れといた方がよいような気がする!

ダウンロード&インストール

  • http://developer.android.com/tools/sdk/ndk/index.html
  • http://developer.android.com/sdk/index.html

自分の環境にあったファイルをダウンロードして、解凍したら、任意の場所に設置します。
自分の場合はこんな感じで配置しておきました。

/Users/hayabusa/Applications/android-ndk
/Users/hayabusa/Applications/android-sdk

さっきのproj.android/build_native.shの中身にNDK_ROOTの定義を追記してもいいんだけど、グループで開発する場合にそんな事をすると盛大に顰蹙を買う事になるので、 モテ紳士でありたいならば、おとなしく.bashrcにでも書いておくことをオススメします。

$ vi ~/.bashrc
export NDK_ROOT=/path/to/android-ndk
export ANDROID_HOME=/path/to/android-sdk

再度build_native.shの実行

$ ./build_native.sh
The Selected NDK toolchain version was 4.8 !
NDK_ROOT = /Users/hayabusa/Applications/android-ndk
COCOS2DX_ROOT = /Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/../../..
APP_ROOT = /Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/..
APP_ANDROID_ROOT = /Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android
Using prebuilt externals
Android NDK: WARNING:/Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/../../../cocos2dx/Android.mk:cocos2dx_static: LOCAL_LDLIBS is always ignored for static libraries
Android NDK: WARNING:/Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/../../../cocos2dx/platform/android/Android.mk:cocos2dxandroid_static: LOCAL_LDLIBS is always ignored for static libraries
make: Entering directory `/Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android'
[armeabi] Compile++ thumb: cocos2dcpp_shared <= main.cpp
[armeabi] Compile++ thumb: cocos2dcpp_shared <= AppDelegate.cpp
[armeabi] Compile++ thumb: cocos2dcpp_shared <= HelloWorldScene.cpp
(snip...)
[armeabi] SharedLibrary : libcocos2dcpp.so
[armeabi] Install : libcocos2dcpp.so => libs/armeabi/libcocos2dcpp.so
make: Leaving directory `/Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android'

お、今度はなんかできたっぽいぞ。

シミュレータでの起動

ビルドまでは(たぶん)オーケーなので、シミュレータにアプリをインストールして起動してみたい。
proj.android/README.mdに書かれている感じでinstallコマンドを実行してみる。

$ ant debug install
Buildfile: /Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/build.xml
BUILD FAILED
/Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/build.xml:46: sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var
Total time: 0 seconds

ありゃ、失敗だ。。

こういう場合の対処もREADME.mdにきちんと書いてある。惚れてまうやろー!

$ android list target
Available Android targets:
----------
id: 1 or "android-17"
Name: Android 4.2.2
Type: Platform
API level: 17
Revision: 2
Skins: HVGA, QVGA, WQVGA400, WQVGA432, WSVGA, WVGA800 (default), WVGA854, WXGA720, WXGA800, WXGA800-7in
ABIs : armeabi-v7a, mips, x86
$ android update project -p . -t 1
$ android update project -p ../../../cocos2dx/platform/android/java -t 1

改めて実機へのインストールを試みてみよう。

$ ant debug install
Buildfile: /Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/build.xml
-set-mode-check:
-set-debug-files:
-check-env:
[checkenv] Android SDK Tools Revision 21
[checkenv] Installed at /Users/hayabusa/Applications/android-sdk
(...snip)
install:
[echo] Installing /Users/hayabusa/development/hayabusa/cocos2d-x/cocos2d-x/projects/study001helloworld/proj.android/bin/study001helloworld-debug.apk onto default emulator or device...
[exec] * daemon not running. starting it now on port 5037 *
[exec] * daemon started successfully *
[exec] 283 KB/s (2600905 bytes in 8.950s)
[exec] pkg: /data/local/tmp/study001helloworld-debug.apk
[exec] Success
BUILD SUCCESSFUL
Total time: 22 seconds

きたっぽい!

インストール成功!

また天才ぶりを発揮してしまったか…。

起動成功!

次回に向けて

今回は、ただ「android向けにビルドして起動する」というだけの課題なのに妙にいろいろなところでつまづいたな…。
これも私がモテすぎるが故の代償なのか…うわなんだおまえはやめrあqwせdrftgyふじこlp;@:「

次回は、タッチ処理周辺を試してみようかなと思っています。

今回遭遇した、本編とは無関係そうなエラーとその対処方に関して

Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 9 in ./AndroidManifest.xml

./build_native.sh実行時のエラー。
APP_PLATFORMの値が定義されていないために、自動生成された値に問題があると思われます。
下記の記述で回避可能。

$ vi ./jni/Application.mk
APP_PLATFORM := android-9

cocos2dx/Android.mk:cocos2dx_static: LOCAL_LDLIBS is always ignored for static libraries

同じく./build_native.sh実行時のエラー。
どうやら、Android NDK r9特有のエラーのようだ。r8eに差し替えて実行したら発生しなくなりました。
ダウンロードリンクを一応載せておきます。

http://dl.google.com/android/ndk/android-ndk-r8e-darwin-x86_64.tar.bz2

java.lang.IllegalArgumentException: Unable to find native library: cocos2dcpp

どうやらエミュレーターの設定次第で発生するようだ。
Nexus7のデフォルト設定をcloneして作成したAVDでは発生しなかった。

今回のソースコード

https://github.com/8823-scholar/cocos2d-x-study/tree/de0d4c57c9dad8c3995f0a0b3d674f074f24000f