yukinobe’s blog

アプリ開発、パソコン、スマホ等の技術的な雑記

Cocos-2dx V.2 の64ビット化

Google Play では2021/8から、64ビット化されていないアプリは排除されることになっています。

 

“Google Play”のアプリは64bit対応が必須へ ~Googleが移行のロードマップを公開 - 窓の杜

 

今さらCocos-2dxをいじるとかいう徒労はしたくないのが本音ですが、やらないとストアから排除されてしまうので、仕方なく重い腰を上げました。

案の定、かなりの時間を食われて、もう64ビット化は諦めようと何度も思ったのですが、何とか移行に成功したのでその過程を記録に残します。

2021年の今どきにCocos-2dx v2の新規記事ですよ?これはとても貴重ですからね。

 

環境

macOs Catalina 10.15.6

Android Studio 3.4

Cocos-2dx V.2.2.6

 

EclipseAndroid Studio

Cocos-2dxの64ビット化と直接関係はないのですが、そもそもがEclipseで開発していたので、まずはこれをAndroid Studioに移行しました。基本的にはAndroid Studioのインポート機能を使って、 出てくるエラーを潰していったらビルドに成功しました。

出たエラーは以下の通り。
 
・Build.Gradle の以下の設定をtargetSdkVersionに合わせて28にした(これはのちにストアの要求に合わせて29に上げたはず)
compileSdkVersion 28
 
・なんとAndroidはメソッドが65535を越えるとビルドに失敗するらしい。ダサい。Build.Gradleに以下の設定を追加。
 minSdkVersionが20以下ならmultiplexサポートライブラリの追加も必要らしい。

 

    compileSdkVersion 28
    buildToolsVersion "28.0.3"
 
    defaultConfig {
  〜〜〜
        multiDexEnabled true
〜〜〜
dependencies {
 〜〜〜
   compile 'com.android.support:multidex:1.0.3'
}

 

●Cocos-2dx 64ビット化

EclipseではNDKはr11cを使っていたのですがエラーが出て、どうもr10c にしないといけない模様。この辺、関連ページをEvernoteに保存していたはずなのですが、見当たらず。。

まあ、それでNDK r10cをダウンロードしてこようとしたら、なんと10c~10eだけは拡張子binファイルという、何やら古いMacのパッケージ形式らしく、なんと完全64ビット化されたCatalinaでは解凍ができない。

うちにある新旧Mac(Mini2014, 2018)はどちらもCatalinaにバージョンアップ済み。解凍できない!ってことで、Mini2014をタイムマシンを使って一晩かけてHigh Sierraに戻して解凍。

NDK r10c にしたら今度は以下のエラー。

Parameter specified as non-null is null: method com.android.build.gradle.internal.cxx.configure.JsonGenerationVariantConfiguration., parameter ndkVersion

 

調べたら、r11以降のNDKのルートディレクトリにあるsource.propertiesファイルを同じくr10のルートにコピればいいらしい。中身は特に書き換えなくても大丈夫でした。

 

gradle - Android Studio 3.2.1 - NDK r10e sync fail? - Stack Overflow

 

自分の場合はAdMobのRewardのエラーも出ていたのだけれど、これはGoogle Mobile Adsのモジュールの問題はソースとバージョンがうまく合っていなかった模様。
File→File→Project Structure… のDependenciesからplay-services-adsのバージョンをいろいろ試して、12にしたところうまくいきました。

 

cocosの64ビットライブラリのコピーは基本的に以下のサイトを参考にその通りにしました。

 

coffeee.hatenablog.com

 

個人的に引っかかったのは、gradle.propertiesでPROP_APP_ABI=armeabi-v7a:arm64-v8aとすれば問題ないはずなのに、なぜかMIPSやら余計なものまでリンクしようとする動作。

原因はGradleファイルでabiFiltersの2行がコメントアウトされていたから。なんで?

ndk {
    moduleName "cocos2dcpp_shared"
    //abiFilters = []
    //abiFilters.addAll(PROP_APP_ABI.split(':').collect{it as String})
}
 

あと、非常に悩まされたのがopenssl/ssl.hファイルが無いと言われるエラー。

 

cocos2d-x-2.2.6/external/libwebsockets/android/include/libwebsockets.h:247:25: fatal error: openssl/ssl.h: No such file or directory

 

ちゃんとopensslフォルダもv3からexternalフォルダにコピってきたし、ssl.hファイルだってあるのに。

libwebsockets.hからの参照でエラーになってるから、websocketsのビルドに問題があると思っていろいろ調べて試したけど、結局のところそのさらに上の呼び元のextentions/networkフォルダのcppファイルとhファイルをすべてv3→v2でコピーしたらビルドが通りました(ここすごい時間かかったよー)。

 

少なくとも丸4,5日くらいは潰したと思いますが、なんとかCocos-2dx V2の64ビット化に成功しました。もう、願わくばこれ以上の修正を要求するようなことは勘弁してください、ストア様…