Android
cocos2d-x

Mavericksでcocos2d-x 3.0.0finalをAndroid実機で動かすまでのあれこれ

More than 3 years have passed since last update.

iOS+XCodeはすぐ動くがAndroidがクセモノだったのでメモ。
eclipseは使わずコマンドラインで行う場合。

インストール

まず以下をインストールしてパスを通す
Android SDK http://developer.android.com/sdk/
Android NDK https://developer.android.com/tools/sdk/ndk/
apache ant http://ant.apache.org/bindownload.cgi
cocos2d-x 3.0.0 http://www.cocos2d-x.org/download

ここに書いてある
http://www.cocos2d-x.org/wiki/How_to_run_cpp-tests_on_Android

setup

cd cocos2d-x-3.0
./setup.py

ここで各々にパスが通っているか~./.profileを確認
(※サイトのドキュメントは.bash_profileになっているが、出力通りの操作だと.profileにはいる)

# Add environment variable COCOS_CONSOLE_ROOT for cocos2d-x
export COCOS_CONSOLE_ROOT=/Users/keidroid/cocos2d-x-3.0/tools/cocos2d-console/bin
export PATH=$COCOS_CONSOLE_ROOT:$PATH

# Add environment variable NDK_ROOT for cocos2d-x
export NDK_ROOT=/Users/keidroid/android-ndk-r9d
export PATH=$NDK_ROOT:$PATH

# Add environment variable ANT_ROOT for cocos2d-x
export PATH=/Users/keidroid/android-sdks/tools:$PATH

export ANDROID_HOME=/Users/keidroid/android-sdks
export ANT_ROOT=/Users/kei/apache-ant-1.9.4/bin
export PATH=$ANT_ROOT:$PATH

# Add environment variable ANDROID_SDK_ROOT for cocos2d-x
export ANDROID_SDK_ROOT=/Users/kei/android-sdks
export PATH=$ANDROID_SDK_ROOT:$PATH
export PATH=$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH

プロジェクト作成

cocosコマンドでnewする
cocos new {プロジェクト名} -p {パッケージ} -l {言語} -d {ディレクトリ}

cd cocos2d-x-3.0/project
cocos new Hello -p net.keidroid.hello -l cpp -d .

ビルド/実行

cd proj.android
./build_native.py
ant debug install

↓こちでも良いけど

cocos run -p android

んで、多分以下の様なエラー出るので

{path}/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

local.propertiesを確認したり、update projectしたり

android update project -p . -t 1
android update project -p ../cocos2d/cocos/2d/platform/android/java -t 1

ファイル追加

HelloWorld確認した後、ファイルを追加するとエラーになる。
Android.mkがsrcファイルを以下のように指定してるせい

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

なので、

Classes内にディレクトリを作って整理する Android.mkの自動化
http://ichiokumanyen.hatenablog.jp/entry/2013/10/05/220232

を参考に以下のように変更

CPP_FILES := $(shell find $(LOCAL_PATH)/../../Classes -name *.cpp)
LOCAL_SRC_FILES := hellocpp/main.cpp
LOCAL_SRC_FILES += $(CPP_FILES:$(LOCAL_PATH)/%=%)
LOCAL_C_INCLUDES := $(shell find $(LOCAL_PATH)/../../Classes -type d)

cocos2d extension に対応

LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
$(call import-module,extensions)

Android UXへの対応

..のでAndroidManifest.xmlを編集

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="net.keidroid.hello"
      android:versionCode="1"
      android:versionName="1.0">

    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="15" /> ////こことか
    <uses-feature android:glEsVersion="0x00020000" />
    <application android:label="@string/app_name"
                 android:icon="@drawable/icon">
        <activity android:name="org.cocos2dx.cpp.AppActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait" ////こことか
                  android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
                  android:configChanges="orientation">
(以下略)

..(´∀`)

でやっと実機で思い通りの動作が可能になりました。

感想

cocos2d-xでの開発時、iOSで走って最後にAndroid対応しようとすると、
XCodeが便利すぎてつまる..
include指定もXCodeのグループしていではなくフォルダ指定になったり。
Android対応ははやめにするのが吉というのを思い知った