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


会社に移換された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にコピーして実行

なんか色々聞かれるが
全部デフォルトのまま進めば問題ないと思う

![スクリーンショット 2016-07-31 21.49.55.png](https://qiita-image-store.s3.amazonaws.com/0/132627/c34b0df7-95ac-8fe1-8e6a-56752bb44b09.png "スクリーンショット 2016-07-31 21.49.55.png")

![スクリーンショット 2016-07-31 21.50.24.png](https://qiita-image-store.s3.amazonaws.com/0/132627/c5f5eed9-9cdb-398a-ddbb-d3069e1c4249.png "スクリーンショット 2016-07-31 21.50.24.png")

![スクリーンショット 2016-07-31 21.50.45.png](https://qiita-image-store.s3.amazonaws.com/0/132627/ba0efa08-fe65-d718-f095-dca0b927de58.png "スクリーンショット 2016-07-31 21.50.45.png")

これは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

![スクリーンショット 2016-07-31 22.25.42.png](https://qiita-image-store.s3.amazonaws.com/0/132627/4b97b256-a495-7d66-7200-a90e64f87101.png "スクリーンショット 2016-07-31 22.25.42.png")

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をあえてダウンロードした

![スクリーンショット 2016-07-31 22.55.15.png](https://qiita-image-store.s3.amazonaws.com/0/132627/f9abf6e4-983e-8f4e-e665-4004c3584670.png "スクリーンショット 2016-07-31 22.55.15.png")


こちらも解凍して
今度はホームディレクトリに配置する

```
# 解凍
$ 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
の３つから選択することができる

今回は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フォルダを選択

![スクリーンショット 2016-07-31 23.34.24.png](https://qiita-image-store.s3.amazonaws.com/0/132627/20bc980a-4a14-222a-a184-64d1d13397b4.png "スクリーンショット 2016-07-31 23.34.24.png")

![スクリーンショット 2016-07-31 23.42.51.png](https://qiita-image-store.s3.amazonaws.com/0/132627/c0b6f9eb-d5bd-b3bd-5183-8b9bf0d087fc.png "スクリーンショット 2016-07-31 23.42.51.png")

選択をするとAndroid Studioが
なんか色々やり始めるので待つ

しばらく待つと
Android Studioが立ち上がる

んで最初に

おめえのプロジェクトのGradleのプラグイン
バージョン低いぜ?

とupdateを勧めてくるので
Remind me laterで無視する

またしばらく待つと
今度は実行ボタンが緑色になり
実行可能な状態になるので実行

![スクリーンショット 2016-07-31 23.53.32.png](https://qiita-image-store.s3.amazonaws.com/0/132627/0410dd65-0d69-1ecb-a0e5-13596c71f14a.png "スクリーンショット 2016-07-31 23.53.32.png")

![スクリーンショット 2016-07-31 23.53.53.png](https://qiita-image-store.s3.amazonaws.com/0/132627/de48f8d0-cb18-679a-ae18-55493e828c70.png "スクリーンショット 2016-07-31 23.53.53.png")

Androidにアプリがinstallされて
実行されれば成功

# 注意点

ちなみに今回は新規の状態でビルドしたから
あんまし関係ないけど、

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

というのもndkがSTLに若干対応していないせいで
C++の一部標準ライブラリが使用できないためである

この場合、Android.mkを変更して
使用できないライブラリを使用できるようにするか

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

ちなみに使用できないのは、
std::stringの型変換ライブラリだった

std::to_string
std::stoi
std::stof

以上は少なくとも確認できたが、
以下の方法で代わりを立てることができた

```cpp
	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メソッドとして入れておいたけど
あんまりお勧めする方法ではないな

他にもなんか注意することがあったけど
思い出したら追記しよう