ページへ戻る

− Links

 印刷 

cocos2d-x ver2系のプロジェクトをAndroid Studioに移行する のバックアップソース(No.8) :: NJF Wiki

xpwiki:cocos2d-x ver2系のプロジェクトをAndroid Studioに移行する のバックアップソース(No.8)

« Prev[5]  Next »[6]
*はじめに [#z941726c]

cocos2d-xがver3になってからかなり経ちますが、2から3への移行は大変なため、まだまだ以前作った物をver2で管理しています。さらにeclipseでのAndroid開発の公式サポートが終わり、openSSLなどの更新の催促、広告SDKの更新などもあり、否が応でもeclipseで開発していたcocos2d-x ver2系のAndroidプロジェクトをAndroid Studioに移さなくてはいけなくなってきました。

2016年の夏にその作業を行ったので、その時の知見をまとめます。

**注意 [#tacc4561]
今後cocos2dx ver2系で新たにアプリを作る予定はなく、さらにver3も最近のUnityなどの勢いを見るに使うかどうか微妙なため、現在ではcocos2dx ver2系に深く関わるメリットはあまり無いと思っています。そのような状況から今回の移行は「とりあえずメンテナンスができる」程度をめどにしています。

そのため、もっと良い方法があるかも知れませんので、よりきちんとした移行がしたい場合は他の媒体などを参考にしてください。

*eclipseのプロジェクトをインポートする [#g6779bb0]

**バックアップ [#v39be107]

eclipseのプロジェクトをAndroid Studioでインポートすると、そのプロジェクトはeclipseでは開けなくなります。
そのため、万一の時のために作業のはじめには必ずもとのeclipseのプロジェクトをどこか別の場所にバックアップしておいてください。

**eclipseで開いて確認する [#u71714fd]

Android Studioにインポートするには、もとのeclipseのプロジェクトにライブラリ依存性のエラーをなくさなければなりません。まずeclipseで移行するプロジェクトを開き、「Project->Properties」を選択して、左の一覧から「Android」を選択します。右下の「Library」の中にエラーがあるとインポートできないので、そのライブラリはメモして右の「Remove」ボタンで取り除いておきましょう。

メモしたライブラリは後でAndroid Studioでインポートしてから手動で加えます。

今までeclipseで開発していたのだからエラーは無いはず、と思われるかも知れませんが、Android SDKのアップデートなどでディレクトリが変わったり無くなったりすることもあり、意外にエラーが出ていることがあるので注意が必要です。

**Android Studioからインポート [#z8ff64d5]

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ではそのための設定がないのでエラーになっています。

古いアーキテクチャでコンパイルするように指定するために、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関連の修正 [#n09f94ff]


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:http://tools.android.com/tech-docs/new-build-system/gradle-experimental]])を参考にして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:http://tools.android.com/tech-docs/new-build-system/gradle-experimental]]に以下のような一覧表があるのでそれを見てあわせます。

|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:http://tools.android.com/tech-docs/new-build-system/gradle-experimental]]」を参考に修正します。
たくさん書いてありますが、このうち実際に必要なのは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」の変更を忘れやすいので要注意です。

また、モジュールの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.2.0'
 }
 model {
     android {
         compileSdkVersion 24
         buildToolsVersion "24.0.0"
     }
 }

最初の「apply plugin」が変更され、他に「android」が「model」の中になります。

*ライブラリなどの調整 [#n16a4238]

インポートの時に参照がうまくいっているとモジュールとして取り込まれますが、ライブラリの構成によっては、Cocos2dxActivityなどが見つからないとエラーになることがあります。この場合、最も簡単な解決はもとのeclipseにあるlibcocos2dxプロジェクトのbinの中にあるlibcocos2dx.jarをコピーしてAndroid Studioのlibsに加え、右クリックで「Add as Library」を選択、ライブラリとして取り込むことです。

このとき、後述のCocos2dxBitmapでのエラーを避けるため、リリースするAPIのバージョンは21以下にするのがおすすめです。

他にはソースをプロジェクト内にコピーしたり、モジュールとして取り込む方法もあります。こちらの方が個々の修正はしやすくなります。

一方、jarファイルの方が一つjarを作るプロジェクトを作っておくと、そのjarを使い回せるのでいっせいに変更するのはそちらの方が楽です。またコンパイル時間も短くなります。

どちらでも好きな方を選択してください。

あとは他の必要なライブラリを取り込んであれば、ひとまずビルド可能となります。

*移行時によくあるエラー [#fd9d1ff2]
移行時によく起こるエラーとして以下の物があります。

***Cocos2dxBitmapクラスのFloatMathでエラー [#n019b611]
API level 22よりdeprecatedになったので、FloatMathをMathに置きかえてください。またはAPI 21以下でリリースしてください。

***HttpClientのエラー [#k5f1e689]

HttpClientはFroyo以降では使えなくなるので、使っていた場合はHttpURLConnectionに移行する必要があります。

詳しくは[[Android/HttpClientからHttpURLConnectionへ移行する]]を参照のこと。

***dex関連のエラー [#v4444b77]

Google Play Serviceの機能が増えたので、これをそのまま取り込んでしまうと起こることがあります。解決法は次の章を参照のこと。

*Google Play Serviceについての注意 [#ye37b112]
Google Play Serviceについては古いバージョンにくらべてメソッド数が多くなったようで、全て取り込むとメソッドの総数が65,535でなければならないという制限にひっかかってMulti-dex対応というのが必要となる事があります。広告の場合は「ads」のみを取り込む、といったように[[こちら:https://developers.google.com/android/guides/setup#split]]を参考に必要な機能に対応するものだけを使うようにした方が良いでしょう。

ゲームでは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問題はほとんどの場合これで解決します。

« Prev[5]  Next »[6]