AndroidStudio 1.3時代のCocos2d-xセットアップ (cpp, js)

趣味でゲームアプリ開発をやろうしてcocos2d-xに手を出す。不安定覚悟で最新っぽい環境を構築してみたのでメモ。

(9/29追記：cocos2d-jsとして使う場合もほぼおなじで大丈夫なのが確認できたので追記しました）

主なポイント

- ADT(Eclipse)ではなくAndroidStudio
- エミュレータにはGenymotion
- Androidビルド時に `INSTALL_FAILED_NO_MATCHING_ABIS` が出る対策
- Xcode7 (特に何もせずそのままいけた）
- できるだけhomebrew
- Antのインストールはもはや不要。gradle！
- cocos2d-htmlはcocos2d-jsとして同じパッケージに統合され、C++での開発もJavaScriptでの開発もこのセットアップでOK
- 実機での動作は未確認


# TL; DR

Cocos2dx開発環境構築 〜 シミュレータでアプリ起動 手順まとめ。

Setup

```shell-session
brew update
brew install android-sdk
brew install android-ndk
brew cask install java
brew cask install android-studio
  Android SDK Managerで
  - Tools/Android SDK Build-tools 22.0.1
  - Android 5.1.1(API 22)/SDK Platform 22
  をインストール
brew cask install virtualbox
brew cask install genymotion
  Nexus6のイメージを取得、起動しておく

公式からダウンロードして解答したcocos2d-x-3.8.1
mv ~/Downloads/cocos2d-x-3.8.1 /usr/local/opt/cocos2d-x
cd /usr/local/opt/cocos2d-x
./setup.py
  ----------
  Please enter the path of ANT_ROOT (or press Enter to skip):  ==>[Enter]
  ----------
mv cocos2d-x cocos2d-x-3.8.1
ln -s cocos2d-x-3.8.1 cocos2d-x
```

Create Project (C++で書く人)

```shell-session
cocos new MyGame -l cpp
```

Create Project (JavaScriptで書く人)

```shell-session
cocos new MyGame -l js
```

JavaScript開発(`-l js`)の場合、一箇所修正が必要な模様

```java(frameworks/runtime-src/proj.android-studio/app/src/org/cocos2dx/javascript/AppActivity.java)
public class AppActivity extends Cocos2dxActivity {

    @Override
    public Cocos2dxGLSurfaceView onCreateView() {
        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
        // TestCpp should create stencil buffer
//
// 修正
//        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
        glSurfaceView.setEGLConfigChooser(8, 8, 8, 0, 16, 8);
        return glSurfaceView;
    }
}
```

Run for Android

```shell-session
cd MyGame
cocos run -p android --android-studio --app-abi x86
```

Run for iOS

```shell-session
cd MyGame
cocos run -p ios
```

Run for iOS (`-l js` で作ったプロジェクトのみ可)

```shell-session
cd MyGame
cocos run -p ios
```


# Android Studio対応状況

[[FINAL!] All in one Cocos2d-x&JS v3.7 is released - cocos2d-x - Cocos2d-x Forum](http://discuss.cocos2d-x.org/t/final-all-in-one-cocos2d-x-js-v3-7-is-released/22185)

[Get your hands on Android Studio 1.3 | Android Developers Blog](http://android-developers.blogspot.mx/2015/07/get-your-hands-on-android-studio-13.html)

Cocos2dx側でAndroid Studio用のプロジェクトファイルは生成してくれるようになっているし、
Android StudioもC++周りの機能が。（Previewバージョンだけど)

とはいえCocos界隈でAndroid Studioへの移行が進んでいるのかは謎。

でも人柱覚悟でAndroidStudioでいってみる。

# Prerequisite

確認した環境は

- Mac OSX Yosemite
- Cocos2d-x 3.8.1
- Xcode7
- Android Studio 1.3
- JDK 1.8
- Android SDK 24.3.4
- Android NDK r10e

あらかじめ入ってる前提にしたもの

- Homebrew
- Homebew Cask
- Xcode

# cocos2d-x の配置場所

再掲

```shell-session
公式からダウンロードして解答したcocos2d-x-3.8.1
mv ~/Downloads/cocos2d-x-3.8.1 /usr/local/opt/cocos2d-x
cd /usr/local/opt/cocos2d-x
./setup.py
  ----------
  Please enter the path of ANT_ROOT (or press Enter to skip):  ==>[Enter]
  ----------
mv cocos2d-x cocos2d-x-3.8.1
ln -s cocos2d-x-3.8.1 cocos2d-x
```

よくホーム直下にcocosを配置、って書いてあるけど、もうちょっとそれっぽいところに配置してみたつもり。

まず `/usr/local/opt/cocos2d-x` に配置した状態で `setup.py` を実行して、

```
export COCOS_CONSOLE_ROOT=/usr/local/opt/cocos2d-x/tools/cocos2d-console/bin
...
```

になるように .bashrc/.zshrc に設定を書き出させ、
その後、実ファイルを `cocos2d-x-3.8.1` に移動して、`cocos2d-x` にシンボリックリンクを張っておく。

これで、もしcocosのバージョンが上がったら `/usr/local/opt/cocos2d-x-X.X.X` に配置して、シンボリックリンクの向き先を変えば幸せになれる計画。

cocos2d-xがhomebrew fomulaになったらこうなりそう・・というイメージで配置してみた。
誰かfomula作ってくれないかな・・・。

# Troubleshooting

## ANT_ROOT not defined. Please define it in your environment.

AndroidStudioではなく ADT用のプロジェクトでビルドしようとしている

`--android-studio` オプションを指定してAndroidStudio用プロジェクトをビルド


## Can't connect to activity manager; is the system running?

```
Error type 2
android.util.AndroidException: Can't connect to activity manager; is the system running?
	at com.android.commands.am.Am.onRun(Am.java:299)
	at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
	at com.android.commands.am.Am.main(Am.java:97)
	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)
```

デバイスを起動させるのを忘れて `cocos run` してしまい、後からデバイスを起動するとこうなる模様

デバイスを起動させた状態でもうちど `cocos run -p android --android-studio --app-abi x86` でOKなはず

## Failure [INSTALL_FAILED_NO_MATCHING_ABIS]

ネイティブコードのビルドターゲットがおかしい。

デフォルトでビルドするとターゲットアーキテクチャはARMになるらしい。でもGenymotionエミュレータのアーキテクチャはx86なので動かないよ状態。

`--app-abi x86` オプションの指定を忘れるとこうなる。

## java.lang.IllegalArgumentException: No config chosen

JavaScriptでの開発時、生成されたプロジェクトそのままで起動しようとすると、アプリ起動直後、下記のエラーでクラッシュする
(cocosコンソールからでもAndroidStudioからでも)

```
09-29 09:19:24.288    2428-2448/org.cocos2dx.MyGame E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 199
    Process: org.cocos2dx.MyGame, PID: 2428
    java.lang.IllegalArgumentException: No config chosen
            at android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:869)
            at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1023)
            at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1400)
            at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)
```

対応方法（再掲）

```java(frameworks/runtime-src/proj.android-studio/app/src/org/cocos2dx/javascript/AppActivity.java)
public class AppActivity extends Cocos2dxActivity {

    @Override
    public Cocos2dxGLSurfaceView onCreateView() {
        Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
        // TestCpp should create stencil buffer
//
// 修正
//        glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
        glSurfaceView.setEGLConfigChooser(8, 8, 8, 0, 16, 8);
        return glSurfaceView;
    }
}
```

デバッガで追うとR:5bit, G:6bit, B:5bit なEGLConfigが存在しないのでエラー・・・という感じになっているようなんですが、AndroidのOpenGL周りはまだよくわからず。
なんでCocos2d-JSが5, 6, 5 で生成するのか・・・