2019年8月1日からGoogle Playで公開するアプリが64bit化必須になったことで、アプリ開発の仕事でAndroidアプリの64bit化を行う機会が増えました。
先日、cocos2d-xで作られたアプリのAndroid版を64bit化する事があったので、今後のためにメモとして残しておきたいと思います。
cocos2d-xのバージョンは3.16です。
【cocos2d-x】Android版の64bit化対応方法
上記の記事が大変参考になりました。
変更する箇所は2箇所です。
1.下記の場所にあるgradle.propertiesの「PROP_APP_ABI」を修正
ProjectFile>proj.android-studio >gradle.properties
PROP_APP_ABI=armeabi-v7a:arm64-v8a
2.下記の場所にあるApplication.mkの「APP_ABI」を修正
ProjectFile> proj.android-studio> app> jni> Application.mk
APP_ABI := armeabi-v7a arm64-v8a
上記で紹介した記事ではこちらの2箇所を修正すればOKでした。
試しにやってみたところ、以下のようなエラーが出てビルドエラーになりました。
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUDoStopSystemEventHandlerTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUEventHandler.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUEventHandlerManager.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUEventHandlerTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUObserverManager.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnClearObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnClearObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnCollisionObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnCollisionObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnCountObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnCountObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnEmissionObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnEmissionObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnEventFlagObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnEventFlagObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnExpireObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnExpireObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnPositionObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnPositionObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnQuotaObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnQuotaObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnRandomObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnRandomObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnTimeObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnTimeObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnVelocityObserver.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUOnVelocityObserverTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUBehaviour.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUBehaviourManager.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUBehaviourTranslator.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUSlaveBehaviour.cpp
[arm64-v8a] Compile++ : cocos_extension_static <= CCPUSlaveBehaviourTranslator.cpp
[arm64-v8a] Compile++ : audioengine_static <= AudioEngine-inl.cpp
[arm64-v8a] Compile++ : audioengine_static <= AudioEngine.cpp
[arm64-v8a] Compile : audioengine_static <= format.c
[arm64-v8a] Compile++ : audioengine_static <= minifloat.cpp
[arm64-v8a] Compile : audioengine_static <= primitives.c
[arm64-v8a] Compile++ : audioengine_static <= Utils.cpp
[arm64-v8a] Compile++ : audioengine_static <= mp3reader.cpp
/app_Android/cocos2d/cocos/audio/android/mp3reader.cpp: In function 'bool resync(mp3_callbacks*, void*, uint32_t, off64_t*, uint32_t*)':
/app_Android/cocos2d/cocos/audio/android/mp3reader.cpp:229:43: error: 'memcmp' was not declared in this scope
if (memcmp("ID3", id3header, 3)) {
^
/app_Android/cocos2d/cocos/audio/android/mp3reader.cpp:274:48: error: 'memcpy' was not declared in this scope
memcpy(buf, tmp, remainingBytes);
^
make: *** [/app_Android/proj.android-studio/app/build/intermediates/ndkBuild/release/obj/local/arm64-v8a/objs/audioengine_static/mp3reader.o] Error 1
make: *** Waiting for unfinished jobs....
上記のエラー内容や、エラー発生場所から、cocos2d-xライブラリのビルド中のエラーっぽいです。
色々調べたところ、上記のようなエラーが出る場合は、
#include <cstring>
を読み込ませればOKらしいです。
何回か上記に似たエラーが出ましたが、cstringを読み込ませれば解消されるエラーでした。
一通りのビルドが通り、無事apkが作成できたので、
先日知った64bit対応済みアプリか確認する方法で、64bit対応できている事が確認できました。
関連:
cocos2d-xのビルドってかなり時間がかかるので、ビルドエラーが出ないかヒヤヒヤします....
なにはともあれとりあえず64bit化対応ができてよかったです。
もしこの記事がこれからcocos2d-xアプリの64bit化対応を行う人の参考になれば嬉しいです。
関連:
【Unity】Android版の64bit対応でやるべきこと - テクノモンキーのアプリ開発日記
【Unity】Androidの64bit対応版アプリをアップロードしても32bitアプリとして認識される場合の対処法 - テクノモンキーのアプリ開発日記