Edited at

cocos2d-xプロジェクトがAndroid Studioビルドできない時の対処

More than 3 years have passed since last update.

会社に移換されたcocos2d-xのプロジェクトから

apkを抽出することになり、

Android Studioを使うことになった

いや素直にeclipseを使ってビルドすればよかったんだろうが、

何せ世の中がAndroid Studioに流れているので

これは乗り換える時期だと考えた結果である

まあでもしかし、こいつ...

使えん...

Android Studioなんてapkの抽出ができて

AVD Managerの役割をちゃんと果たせばいいと

考えていたのだが、

そもそもcocos2dのandroid-studioプロジェクトを

コンパイルすることができないというw

しかしそれでは結局shellでやるか

eclipseでやるようになって今までと

なんら変わらないようになってしまうので

コンパイル : cocosコマンド

実行 : Android Studio

でやっていくことにした

ということで以下cocos2dのプロジェクト立ち上げから

Android用にビルドするまでの手順


環境


  • mac

  • 実機(DIGNO C 404kc Android 4.4.4)


1. Android Studioをインストール

事前にjavaはインストールしておくこと

$ java -version

以下のページからダウンロード

https://developer.android.com/studio

Android StudioをApplicationsにコピーして実行

なんか色々聞かれるが

全部デフォルトのまま進めば問題ないと思う

これはAndroid Studioを使ってみて

ちょっとだけ便利だと思ったことなのだが

Android Studioを始めて起動をすると

Androidフォルダを自動で作成してくれて

sdkを自動で取得してくれるのだ

eclipseはいちいち自分でフォルダを作って

sdkをとってきて、

antをとってきて、

ndkをとってきて...

という作業をやっていたので、

それが少しでも短縮されると思うと

ちょっと嬉しい

(とはいえndkはとってこないといけないのだが...)


2. NDKをダウンロードする

ここがちょっと難関なのだが

ndkは新しいバージョンのものだと

cocos2dxのプロジェクトはコンパイルできない

ということでndkのr10cを

取得したいわけだが、

以下の公式サイトでは最新のバージョンのものしか

ダウンロードできないのだ

https://developer.android.com/ndk/index.html

はっきり言って嫌がらせとしか

思えないが、

uriを変更することで古いバージョンのndkも

取得することができる

以下がr10cをダウンロードするuri

http://dl.google.com/android/ndk/android-ndk-r10c-darwin-x86_64.bin

ndkをダウンロードしたら

先ほどAndroid Studioが作ってくれた

Androidフォルダへndkという名前に変更して配置する

# 実行権限を付与

$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
# binファイルを解凍
$ ./android-ndk-r10c-darwin-x86_64.bin
# Androidフォルダ直下に配置
$ sudo mv android-ndk-r10c ~/Library/Android/ndk


3. ANTをダウンロードする

cocosコマンドでコンパイルするので

antが必要になってくる

(正直ここは必要かどうか要検証かも)

以下のページからダウンロード

http://ant.apache.org/bindownload.cgi

antをダウンロードしたらndkと同様

Androidフォルダへantという名前に変更して配置する

# 解凍

$ tar xvf apache-ant-1.9.7-bin.tar.gz
# Androidフォルダ直下に配置
$ sudo mv apache-ant-1.9.7 ~/Library/Android/ant


4. cocos2d-xをインストール

以下のページからダウンロード

http://jp.cocos.com/products/download/

過去のバージョンは以下から

http://cocos2d-x.org/download/version#Cocos2d-x

ちなみに自分は最新バージョンが

IPv6のみの対応に変更になっていること

(Appleのあの件か...)

それから安定を求めて

v3.10をあえてダウンロードした

こちらも解凍して

今度はホームディレクトリに配置する

# 解凍

$ unzip cocos2d-x-3.10.zip
# ホームディレクトリに配置
$ mv cocos2d-x-3.10.zip ~/cocos2d-x

配置後はcocos2d-xをセットアップする

$ ~/cocos2d-x/setup.py

ここでndkやらのパスを聞いてくる

注意するのはantはbinフォルダまで

指定すること

ちなみに自分は以下のような構成になった

NDK_ROOT : /Users/tanishi/Library/Android/ndk

ANDROID_SDK_ROOT : /Users/tanishi/Library/Android/sdk

ANT_ROOT : /Users/tanishi/Library/Android/ant/bin

これでログインシェルのプロフィールに

環境変数が追加されて

cocosコマンドが使えるようになっているはず

自分はzshなので

$ source ~/.zshrc

まあでもだいたいbashのはずなので

$ source ~/.bash_profile

でプロフィールの更新を適用する

最後にcocosコマンドを入力して仕上げ

$ cocos

コマンド一覧がズラーと出てきたら成功


5. プロジェクトを作成

cocosコマンドを使用して

プロジェクトを作成する

cocosのプロジェクトの言語は

c++,lua,javascript

の3つから選択することができる

今回はluaで作成することにした

$ cocos new -l lua -d ~/Desktop

特にプロジェクトの名前を指定していないので

MyLuaGameというプロジェクトフォルダがDesktopに作られる

ちなみに-l luaの部分を

-l cppでc++に

-l jsでjavascriptにすることができる

-dはプロジェクトを作成するディレクトリを

指定するためのオプション


6. Android用にコンパイル

ここでAndroid Studioでプロジェクトを開いてビルド!

と行きたいところだが

そうは問屋が卸してはくれない

先ほども記述した通り、

Android Studioではcocos2dプロジェクトを

コンパイルしてapkを抽出することができない

無理にビルドボタンを押そうものなら

凄まじい数のエラーが襲ってくる

なのでここはcocosコマンドを使用して

コンパイルする

$ cocos compile -s ~/Desktop/MyLuaGame -p android --android-studio

これでndkのバージョンが問題なければ

apkを抽出してくれるはず

(もちろん時間がめっちゃかかる)


7. 実機にapkをインストール

ちなみに今回は実機があるためエミュレータを使用しない

(PCのスペックが低すぎて、エミュレータを立ち上げようとした瞬間

PCが落ちたなんて口が裂けても言えない...)

まずはAndroid Studioを立ち上げて

Open an existing Android Studio project

からプロジェクト内のandroid-studioフォルダを選択

選択をするとAndroid Studioが

なんか色々やり始めるので待つ

しばらく待つと

Android Studioが立ち上がる

んで最初に

おめえのプロジェクトのGradleのプラグイン

バージョン低いぜ?

とupdateを勧めてくるので

Remind me laterで無視する

またしばらく待つと

今度は実行ボタンが緑色になり

実行可能な状態になるので実行

Androidにアプリがinstallされて

実行されれば成功


注意点

ちなみに今回は新規の状態でビルドしたから

あんまし関係ないけど、

たいていの場合はこう簡単にビルドが通ってくれない。

というのもndkがSTLに若干対応していないせいで

C++の一部標準ライブラリが使用できないためである

この場合、Android.mkを変更して

使用できないライブラリを使用できるようにするか

別途代わりを用意するかになる

ちなみに使用できないのは、

std::stringの型変換ライブラリだった

std::to_string

std::stoi

std::stof

以上は少なくとも確認できたが、

以下の方法で代わりを立てることができた

    template<class T> std::string toString(T value)

{
std::ostringstream oss;
oss << value;
return oss.str();
}

long stoi(const std::string& str, char **endp = nullptr, int base = 10)
{
return strtol(str.c_str(), endp, base);
}

float stof(const std::string& str)
{

自分は面倒なので、

こいつらをStringUtil的なクラスに

staticメソッドとして入れておいたけど

あんまりお勧めする方法ではないな

他にもなんか注意することがあったけど

思い出したら追記しよう