#author("2016-11-22T16:41:06+00:00","","")
My <a href="http://thduby.com">prbelom</a> was a wall until I read this, then I smashed it.
#author("2017-02-06T14:04:57+00:00","","")
* 目的 [#d7d80ddb]

***コンパイルが通らない [#x4235a4f]
mkファイルにコンパイル対象のソースを追記する。間違っていると当然コンパイルは通らない。HelloWorld.cppの場所を変えたのが原因だった

proj.android/jni/Android.mk
 LOCAL_SRC_FILES := hellocpp/main.cpp \
                    ../../Classes/AppDelegate.cpp \
 #                   ../../Classes/HelloWorldScene.cpp




-2Dライブラリでゲームを作れる環境を再構築したい
-独自ライブラリを最新Android環境で動かす
-実機のジャイロを使いたい
-どの開発環境を選ぶべきか決定したい
-サンプルにCで書かれたVISORISORを使う、これをAndroidで動かす最短の方法はどれか?

***VISORISERを動かすのにもっとも手数が少ない方法はどれか? [#t00994de]
VISORISERには「Cバージョン」と「C#バージョン」がある

-確認バージョン
--2016.05.08
--Android Studio 2.1
--この時点での最新SDKバージョン::Marshmallow

***Android Studioを使ってイチからライブラリを再構築する? [#j07a6a82]
-Cocos2Dを使ってライブラリのラッパーを作って動かす?

*Android Studio [#v6a42856]

 従来EclipseとADT(Android Developer Tools)により実現されていた開発環境を、
 Android Studioで実現できる様になった。 2016年5月現在、最新バージョンは2.1と
 なっている。2015年末をもってEclipseとADTのサポートが打ち切られ、
 Android開発環境はAndroid Studioに完全移行された。

ということで、Eclipseの開発環境は去年でサポートがおわってる。

**とりあえずSDKを入れてみる [#y1e1eff9]
***参考ページ [#wd93e5df]
[[https://blog.codecamp.jp/androidstudio_setup]]
***JAVAのSDKが入ってない場合 [#u4efbbfc]
-この通りに進まない
--JavaのSDKのダウンロード
--インストール
--Android StudioでSDKのパスを指定する


***「Blank Activity」を選択する [#p001e1df]
-現バージョンではこの雛形がないので「Basic Activity」を選択する


**実機でデバッグする [#f5751c0e]
[[https://blog.codecamp.jp/android_test]]

-実機バージョン(2世代遅れ)
--Android 4.4(KitKat/2013.10) < Lollopop(2014/11) < Mashmallow(2015/10)

***「Android USB Driver」の確認画面 [#f566f89e]
-Tool >Android > SDK Manager
-Android SDK > SDK Tools(タブ) で確認できる仕様に変更になっている

***スクリプトを変更して実機で反映されるかテストする [#s1b624a1]
-RelativeLayout > TextView - "文字列"
-ここの文字列を変更して、Run > Run 'App'

--とりあえず「Android Studio」を使って実機で動かせた

**NDKを使ってC言語を使う [#z97d193b]
-C言語「VISORISER」を動かすためにNDKを用意する
[[http://qiita.com/m1takahashi/items/3a3c9d2845e9b57aeda3]]

-Android NDKのダウンロード
-AndroidStudioを起動
-左メニュー(Project)の『app』を<<右クリック>>、『SDK Location』を選択します。
-"Android SDK Location:"の下にある『Download Android NDK』をクリックします。
-20分ほどで完了します。

**gradleの設定 [#wa339c62]
-新しいmakeファイル的なものらしい。これを設定する必要がある。
-DLL的にCを使用する設定を行う必要がある。全体的にまだテストケースっぽい
-こっちの環境で作りなおすのは安定感がない。常に追いかけなくてはならない可能性がでてくる

-ライブラリの移植、OpenGLライブラリの移植に時間がかかりそう
--いったんパスして他の方法を探ってみる

*Unityで動かしてみる [#e8c7452e]
-C#になってしまう点をどうするか。。
-すべての資源を作りなおすデメリットが有る、作りなおすのは面倒である
-WindowsStore / appStore / Google Play での使用を前提にできる

***「[[アプリをビルドしてandroid実機上でテストする >https://unity3d.sakura.ne.jp/unity/android-build.html]] 」でパス設定が出来ない [#k47760bb]

-[[Unity5.3でAndroid SDKのパス設定項目が表示されない件についての対処>http://qiita.com/shunpeater/items/5043adb8075d0c7557a7]]

--ドハマリ、ピッタリの解決法が出てきた、まさにこれ。再インストールなのか。。。

***NDKのインストールパスが設定出来ない [#d6e22f00]
-Android Studio のProject Structure から各種SDKのパスが確認可能
--SDK,JDKはパス設定できたもののNDKだけエラーがでる
---D:\Users\ragi\AppData\Local\Android\sdk\ndk-bundle

-IL2CPPを使わないのであれば空欄でもいいらしい
--ILをCPPに変換する機能らしいが詳細不明

***apkができない [#k1abd3f9]
-buildセッティングでPlayerセッティングを行う必要がある
--Other Setteing >Bundle Identifer >"com.パブリッシャ名.アプリ名"を設定する

***実機に転送されない [#vb0a50f7]
-USBケーブルが抜けていた
-Android Studioで実機の設定ができていれば、その転送先にAPKが送られてデバッグできる
**出来た [#m1c3a2c0]
-とりあえず最も早く実現できたAndroid環境はコレ
-C#で記述する必要があるのが悩みどころ
--ライブラリを1から作りなおすか?GLが動く環境を再構築するか?


*Cocos2DXを使ってみる [#a14b8bcd]
-C言語環境を作るにはとりあえず手っ取り早いハズ
-すべての資源を再利用できるメリットはあるが、再利用する価値のあるものがあるか?
-WindowsStore / appStore / Google Play での使用を前提にできるか?
-現状でコマンドプロンプトベースでのコンパイル、デバッグとなるよう

***CocosとかAndroid StudioとかPythonとか [#m3f88d79]
-[[[Cocos2d-x] Cocos2d-x 3.7 で Android Studio を使う>http://studio.cretia.net/blog/462]] [#i9bf6f79]

-[[Cocos2d-x 3.4 Windows開発環境のセットアップ>http://studio.cretia.net/blog/185]]
--Cocos2Dのインストールにはpythonが必要になるのでインストールする

 cocos new プロジェクト名 -p net.suplex.プロジェクト名 -l cpp -d プロジェクト作成フォルダ

***NDKが無いと言われる [#j73199cb]

***コマンドラインでのビルド [#n57e8b21]
 cocos run -s D:\dev\cocosPrj\sample3 -p android --android-studio


***エミュレータで確認する場合はAVDの設定を行う。 [#m6000aba]
-arm系にすること、とはいえAVD ManagerではCPUの選択ができない
-Nexus5とかを選んでおけばとりあえずarm系になるっぽい

***java.exeが無いと言われる [#r82ce851]
-JAVAをインストールしてるのに環境変数がないっぽい
--[[Cocos2d-xをEclipseを使わずにビルド&実行する>http://qiita.com/sannenzaka/items/30cd580b0f215f6caff2]]

-JAVA_HOME」 にJDKのパスを追加する。例)C:\Program Files\Java\jdk1.7.0_51
--「PC(マイコンピューター)」を右クリック、プロパティ > システムの詳細設定 > 環境変数 > システム環境変 > 新規 で設定する

**Unfortunately,libcocos2dx has stopped.とでて実行できない [#z6350fbb]
-コマンドラインで実行するようにしていたのをコンパイルのみにしてみるとエラーが確認できた

-cocos &color(red){compile}; -s D:\dev\cocosPrj\sample3 -p android --android-studio

***NDK_ROOT not defined. Please define it in your environment. [#oc23b9b7]
-さっきのNDKの指定に失敗してる件だね
-Android Studio のProject Structureから確認してみると空欄になってた
--D:\Users\ragi\AppData\Local\Android\sdk\ndk-bundle
--NDK_ROOTにインストールパスを手動で加えてみたけ
---NDKのバージョン確認用のRELEASE.TXTが無い、と言われる
---インストールに失敗してるのかな???と思ったけれども何度やってもRELEASE.txtが現れない


 これでもダメな場合は、Android NDKを r10系ではなく、r9dにするとうまくいくという情
 報があるので、差し替えに問題なければそれを試してみる。

-&color(red){Win(64bit) : https://dl.google.com/android/ndk/android-ndk-r9d-windows-x86_64.zip};
-[[Win(32bit) >https://dl.google.com/android/ndk/android-ndk-r9d-windows-x86.zip]]
-[[Mac(64bit) >http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86_64.tar.bz2]]

--上記の情報を元に古いNDKバージョン(r9系)をダウンロード、展開してndk_bundleフォルダに上書きすると・・・

--- コンパイルが通った!「Build Successful」とでた。
--Androidエミュレーターではどうしても実行できないが、実機に転送したらあっさり実行できた
--どうやらライブラリパスだとか設定とかの整合は取れているらしい

**Androidエミュレーターの設定 [#yf86a42e]
-CPUの種類がいけてないらしい
-CPUの種類をARM系にする必要があるらしい。Nexus5とかにしとけば適当にARMになってるんだろうと思ってたけど設定をみたらx86になっていた

-で、x86からARMに変更する方法がない、そもそもCPUが選べない。どうすればいいのか?

--Android Studioの File > Setting > Android SDK > SDK Platformsを選択
---Show Package Detailsで追加したいAndroidOSバージョンの詳細を表示させる
---そこで、ARMのSystem ImageをInstallする設定にする(チェックを入れる)
--Applyするとインストールされる
#ref(./ARM.PNG,25%);

-Tool > Android > AVD Managerを選択して、ARM仕様のカスタムAndroidマシーンなんかを造っちゃう

--しかしめちゃくちゃ遅いな、これは

-AVDでは、「ハードウェア」と「テスト機」の2つを作るイメージ
--なので、ハードウェアに入れるOSを選択したくてもできない
-造ったハードにどんなOSをいれた「テスト機」を作るのか?自分で決められる

**ソース改変(Hello World > A Happy New Yearに修正) [#ie77673a]
--Classes/HelloWorldScene.cppを修正する
 auto label = Label::createWithTTF("A happy New Year", "fonts/Marker Felt.ttf", 24);

-コンパイルはAndroid Studioではやっぱりできない
-コマンドライン上から
 cocos run -s D:\dev\cocosPrj\sample3 -p android --android-studio

-これだけの修正でも20秒位かかる
*** Breakポイントは張れるのか? [#g4530a3b]




**疑問 [#of21e102]
***なぜ実機のARMシステムだとcocos2Dが動いたのか? [#e63fe953]
-そしてなぜx86システム(のエミュレーター)では動かないのか?
 Error while waiting for device: Timed out after 300seconds waiting
 for emulator to come online.

-Nexus5ベース、KitkatのARM、起動失敗
-Nexus5ベース、Kitkatのx86、起動成功、実行失敗
-Nexus5ベース、MashMallowのx86起動成功
-Nexus5ベース、MashMallowのARM、インストールされてなかった

カーネルファイルがない?
[[http://shared-blog.kddi-web.com/webinfo/31]]

-システムに保存されてるカーネルイメージを仮想マシーンフォルダにコピーしたら動くようになった
|システムフォルダ|AppData\Local\Android\sdk\system-images\android-19\default\armeabi-v7a|
|仮想VMフォルダ|android\avd\Nexus_5X_API_19.avd|

-ユーザーフォルダをカスタマイズした時に不具合が出るらしい
--OS再インストールになった時に各種ファイルが消えたら嫌なので変えた

***コンパイルから転送まで [#bc3dda61]
-Windowsから実機へ、コンパイル15秒、転送5秒、合計20秒
-And
-Windowsからエミュレーター起動へ、コンパイル15秒、転送150秒、合計170秒

***ARMEABI [#bdbe3ba5]
-AMAEBIって読んでたよ、ARMのABIシステム
-[[ARMで使われる二つのABI>http://www.oidon.net/linux/arm-eabi-oabi]]
--E(Enbedded)ABI / O(Old)ABI
---新しいABIと古いABIの違いだった
-じゃあABI(Application Binary Interface)ってなによ?
--ARMのアーキテクチャ、つまりあたらしい構造になったARMと、旧世代ARMという理解でいいっぽい

***此処から先はcocos2Dとの戦いになる [#w174d01d]