はじめに
重要:ここで使っている「Experimental Plugin」は2017年10月に出たversion 0.11.0より後ではサポートされなくなりました。よってこのページの「gradle関連の修正」の章に書いた方法も、使えなくなりました。この章の代わりにcocos2d-x/ver2系CMakeを使ってAndroid Studioに移行するを参考にしてください。他の章はおそらく2018年現在、まだある程度正しいと思います。
cocos2d-xがver3になってからかなり経ちますが、2から3への移行は大変なため、まだまだ以前作った物をver2で管理しています。さらにeclipseでのAndroid開発の公式サポートが終わり、openSSLなどの更新の催促、広告SDKの更新などもあり、否が応でもeclipseで開発していたcocos2d-x ver2系のAndroidプロジェクトをAndroid Studioに移さなくてはいけなくなってきました。
2016年の夏にその作業を行ったので、その時の知見をまとめます。
注意
今後cocos2dx ver2系で新たにアプリを作る予定はなく、さらにver3も最近のUnityなどの勢いを見るに使うかどうか微妙なため、現在ではcocos2dx ver2系に深く関わるメリットはあまり無いと思っています。そのような状況から今回の移行は「とりあえずメンテナンスができる」程度をめどにしています。
そのため、もっと良い方法があるかも知れませんので、よりきちんとした移行がしたい場合は他の媒体などを参考にしてください。
バックアップ
eclipseのプロジェクトをAndroid Studioでインポートすると、そのプロジェクトはeclipseでは開けなくなります。 そのため、万一の時のために作業のはじめには必ずもとのeclipseのプロジェクトをどこか別の場所にバックアップしておいてください。
eclipseで開いて確認する
Android Studioにインポートするには、もとのeclipseのプロジェクトにライブラリ依存性のエラーをなくさなければなりません。まずeclipseで移行するプロジェクトを開き、「Project->Properties」を選択して、左の一覧から「Android」を選択します。右下の「Library」の中にエラーがあるとインポートできないので、そのライブラリはメモして右の「Remove」ボタンで取り除いておきましょう。
メモしたライブラリは後でAndroid Studioでインポートしてから手動で加えます。
今までeclipseで開発していたのだからエラーは無いはず、と思われるかも知れませんが、Android SDKのアップデートなどでディレクトリが変わったり無くなったりすることもあり、意外にエラーが出ていることがあるので注意が必要です。
Android Studioからインポート
Android Studioのメニュー「File->New->Import Project」を選択し、eclipseのプロジェクトディレクトリを選択します。
インポート先のディレクトリも先ほどのディレクトリと同じにして上書きします。そのため、前述のようにかならずバックアップを取っておいて下さい。
これでbuild_native.shなどがそのまま残るため、これを使ってコンパイルやリソースのコピーができるようになります。 ただし、Application.mkやassetsなどのフォルダがインポート前と後で2重に存在しているので、build_native.shが参照しているのが古いeclipseのものであることに注意が必要です。特にApplication.mkとAndroid.mkはAndroid Studioから編集できる「app/src/main/jni」以下の物ではなく、「jni」以下のものを編集するようにしてください。
このままbuild_native.shを実行すると以下のようなエラーが出ます。
Android NDK: Check that /YOUR_PATH/libs/cocos2dx/platform/third_party/android/prebuilt/libjpeg/libs/arm64-v8a/libjpeg.a exists or that its path is correct /YOUR_PATH/ndk-bundle/build/core/prebuilt-library.mk:45: *** Android NDK: Aborting . Stop.
これは最新のNDKは「arm64-v8a」というアーキテクチャでコンパイルしようとするのですが、cocos2d-x ver2.2ではそのための設定がないのでエラーになっています。
古いアーキテクチャでコンパイルするように指定するために、jni/Application.mkの中に次の一行を加えます。
APP_ABI := armeabi
前述のようにAndroid Studioから修正できるApplication.mkとは違うのでファイル間違いに注意してください。かならずエディタなどからこのパスのものを修正してください。
このAPP_ABIを変えることによっていろいろなアーキテクチャに対応したり、複数のアーキテクチャのコンパイルも同時にできるようになりますが、cocos2dx ver2のころに作った物ならおそらくarmeabiで問題ないと思います。
これでbuild_native.shは動くのですが、出力されるlibgame.soや、コピーされるassetsのパスをAndroid Studioで利用する場所に変える必要があり、そのためにbuild_native.shの中を書き換えます。
まずbuild_native.shの中の「assets」を「app/src/main/assets」に置換します。appの部分はプロジェクトによって異なることがあります。確認するにはAndroid Studioでassetsフォルダを右クリックして「Copy Path」を選べばクリップボードにパスがコピーされるので、そこから分かります。
次に出力されたlibgame.soをAndroid Studioが読み込む場所に移動させるため、最後に次の一行を加えます。
cp $APP_ANDROID_ROOT/libs/armeabi/libgame.so $APP_ANDROID_ROOT/app/src/main/jniLibs/armeabi/libgame.so
(長いので折り返されていますが、一行です) こちらもappの部分はプロジェクトによって変わることがあります。
これでコンパイルされ、リソースのコピーも行われるようになりました。
gradle関連の修正
重要:ここで使っている「Experimental Plugin」は2017年10月に出たversion 0.11.0より後ではサポートされなくなりました。よってここに書いた方法も、使えなくなりました。CMakeを使うと簡単に移行できるので、以下の記事でそれを解説しています
cocos2d-x/ver2系CMakeを使ってAndroid Studioに移行する
CMakeを使う場合は、上の記事を参考にしてこの章は飛ばしてください。
Android Studioにインポートすると以下のようなエラーが出ます。
Error:(12, 0) NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin Set "android.useDeprecatedNdk=true" in gradle.properties to continue using the current NDK integration
これはNDK関連のプラグインが古いので、新しい実験的なのを試してみては、というメッセージです。なので、そのプラグインを使います。
こちら(Experimental Plugin User Guide)を参考にしてGradle関係のファイルを更新します。
まず、./gradle/wrapper/gradle-wrapper.propertiesを変更します。 最後のdistributionUrlを最新の物とします。しかし、これはAndroid Studioにインポートしたときに、エラーメッセージで最新版への更新を促され、それをクリックするとすでに変更されています。まだの場合は最新のものに変えてください。2016年8月現在では2.14.1が最新なので以下のようになります。
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
次に実験的なツールを使うためにプロジェクト直下のbuild.gradleを変更します。
dependencies { classpath 'com.android.tools.build:gradle:2.1.3' }
となっているところを
dependencies { classpath "com.android.tools.build:gradle-experimental:0.7.3" }
と変更します。 このとき「0.7.3」はgradleのバージョンによってことなり、Experimental Plugin User Guideに以下のような一覧表があるのでそれを見てあわせます。
Plugin Version | Gradle Version |
0.1.0 | 2.5 |
0.2.0 | 2.5 |
0.3.0-alpha3 | 2.6 |
0.4.0 | 2.8 |
0.6.0-alpha1 | 2.8 |
0.6.0-alpha5 | 2.10 |
0.7.0-alpha1 | 2.10 |
0.7.0 | 2.10 |
0.7.3 | 2.14.1 |
たとえば「2.14.1」に対しては「0.7.3」なのでそれを指定します。
さらに/app/build.gradleも「Experimental Plugin User Guide」を参考に修正します。 たくさん書いてありますが、このうち実際に必要なのはbuildTypesぐらいなので、例えば以下のようになります。
apply plugin: "com.android.model.application" model { android { compileSdkVersion 24 buildToolsVersion "24.0.0" defaultConfig { applicationId "jp.njf.MyGame" minSdkVersion.apiLevel 10 targetSdkVersion.apiLevel 22 ndk { moduleName "game_shared" } } buildTypes { release { minifyEnabled false proguardFiles.add(file("proguard-rules.pro")) } } } } (以下dependenciesなど)
一行目の「apply plugin」や「minSdkVersion」「targetSdkVersion」の後ろの「apiLevel」の変更を忘れやすいので要注意です。
また、モジュールのgradleファイルの変更も必要です。 例えば、Google Play Serviceのランキングなどを使う時に必要な「BaseGameUtils」モジュールのgradleファイルは以下のようになります。
apply plugin: 'com.android.model.library' buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.1' } } dependencies { compile 'com.google.android.gms:play-services-plus:9.+' compile 'com.google.android.gms:play-services-ads:9.+' compile 'com.google.android.gms:play-services-games:9.+' compile 'com.android.support:recyclerview-v7:24.+' compile 'com.android.support:appcompat-v7:24.+' } model { android { compileSdkVersion 24 buildToolsVersion "24.0.0" } }
最初の「apply plugin」が変更され、他に「android」が「model」の中になります。
Manifestファイルからsdkのバージョンを取り除く
いつ頃からか分かりませんが、Manifestファイルからsdkのバージョンについての記述(min,compile,targetとか)を取り除かなければエラーになるようになりました。 エラーメッセージをクリックすれば取り除いてくれることもあれば、そうでないものもあります。 手で消した方が早いでしょう。
ライブラリなどの調整
インポートの時に参照がうまくいっているとモジュールとして取り込まれますが、ライブラリの構成によっては、Cocos2dxActivityなどが見つからないとエラーになることがあります。この場合、最も簡単な解決はもとのeclipseにあるlibcocos2dxプロジェクトのbinの中にあるlibcocos2dx.jarをコピーしてAndroid Studioのlibsに加え、右クリックで「Add as Library」を選択、ライブラリとして取り込むことです。
このとき、後述のCocos2dxBitmapでのエラーを避けるため、リリースするAPIのバージョンは21以下にするのがおすすめです。
規約の変更や広告SDKなど外部ライブラリの都合などにより、APIレベルを低くしてリリースするのが難しくなってきているので、ソースをプロジェクト内にコピーしたり、モジュールとして取り込むのをおすすめします。
一方、jarファイルの方が一つjarを作るプロジェクトを作っておくと、そのjarを使い回せるのでいっせいに変更するのはそちらの方が楽です。またコンパイル時間も短くなります。
どちらでも好きな方を選択してください。
あとは他の必要なライブラリを取り込んであれば、ひとまずビルド可能となります。
Google Play Servicesのゲームサービスで使うBaseGameUtilsのエラー
BaseGameUtilsをインポートして使おうとすると以下のエラーが出ます。
uses-sdk:minSdkVersion 1 cannot be smaller than version 9 declared in library
BaseGameUtilsの中のAndroidManifest.xmlにuses-sdkがないために起こるので、ゲーム本体のAndroidManifest.xmlのuses-sdk句をコピーしてBaseGameUtilsのものに貼り付けると解決します。
現在ではManifestにSDKのバージョンを入れること自体が推奨されていないので、マニフェストからSDKのバージョンを入れてgradleファイルのSDKを上げればOKです。(2018.10.4追記)
Cocos2dxBitmapクラスのFloatMathでエラー
API level 22よりdeprecatedになったので、FloatMathをMathに置きかえてください。またはAPI 21以下でリリースしてください。 外部ライブラリのなどの都合により、低いAPI levelではリリースしづらくなってきているので、書きかえる方が無難です。(2018.10.4追記)。
HttpClientのエラー
HttpClientはFroyo以降では使えなくなるので、使っていた場合はHttpURLConnectionに移行する必要があります。
詳しくはAndroid/HttpClientからHttpURLConnectionへ移行するを参照のこと。
「getdtablesize」に関するエラー
Android NDKのバージョンを下げるとうまくいきます。詳しくは以下を参考にして下さい。 cocos2d-x/ver2系のプロジェクトで「getdtablesize」に関するエラーが出た場合
BaseGameUtilsのエラーその2
古いBaseGameUtilsを使っていると、Google Play Serviceを新しくしたときにエラーとなります。BaseGameUtils関連のjavaファイルとManifest、resフォルダなどを新しい物に入れ替えるとうまくいきます。
android.permission.READ_PHONE_STATEのパーミッションが付け加わる
android.permission.READ_PHONE_STATEのパーミッションがあるから、プライバシーポリシー追加しないといけない、とGoogle Playへアップロード時に言われることがあります。
これは、gradleファイルでminSdkVersionやtargetSdkVersionを指定しないと、デフォルトで1が適用されるため、古いAndroid端末での互換性を保つため勝手にパーミッションが付け加わるためらしいです。
よって、このエラーが発生したときは、全てのgradleファイルにSDKのバージョンが正しく定義されているかをチェックしてください。ライブラリのどれかで入れ忘れている可能性があります。
Google Play Serviceについての注意
Google Play Serviceについては古いバージョンにくらべてメソッド数が多くなったようで、全て取り込むとメソッドの総数が65,535でなければならないという制限にひっかかってMulti-dex対応というのが必要となる事があります。広告の場合は「ads」のみを取り込む、といったようにこちらを参考に必要な機能に対応するものだけを使うようにした方が良いでしょう。
ゲームではadmobを使っていれば
compile 'com.google.android.gms:play-services-ads:9.+'
ゲームサービスを使っている場合、
compile 'com.google.android.gms:play-services-games:9.+' compile 'com.google.android.gms:play-services-plus:9.+'
以上の3つぐらいで問題ないでしょう。バージョンは「9.+」としましたが、適宜必要なバージョンに読み替えてください。
他にメソッドが大幅に増えたライブラリがなければ、cocos2dx ver2の移行の時に起こるMulti-dex問題はほとんどの場合これで解決します。
ぺージ情報 | |
---|---|
ぺージ名 : | cocos2d-x ver2系のプロジェクトをAndroid Studioに移行する |
ページ別名 : | 未設定 |
ページ作成 : | njf |
閲覧可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |
編集可 | |
グループ : | すべての訪問者 |
ユーザー : | すべての訪問者 |