AndroidStudio&cmakeでcocos2d xをビルドする - nekoharuyuki/PuzzleRPG-cocos2d GitHub Wiki
cocos2d-xのv3.17.1がリリースされました。 現在作ってるゲームのcocos2d-xのバージョンをこの3.17.1にしようと、プロジェクトを作り直しAndroid Studioでビルドしたところ、エラーが出ました。
リリースノートを見ると
Android use CMake as default PROP_BUILD_TYPE value
とのことで、Androidのビルドに使われるツールをデフォルトでCMakeに設定されるようになったようです。
公式ドキュメントに書かれていますが、プロジェクトにあるproj.android/app/gradle.propertiesというファイルを見ると以下のように書かれています。
gradle.properties
# android native code build type
# none, native code will never be compiled.
# cmake, native code will be compiled by CMakeLists.txt
# ndk-build, native code will be compiled by Android.mk
PROP_BUILD_TYPE=cmake
ここのPROP_BUILD_TYPEの値をndk-buildにすれば今まで通りのビルドに戻せそうです。
方法
gradle.propertiesのコメントから察するに、Android.mkに書いていた内容をCMakeLists.txtに書けばよさそうです。
Android.mkではコンパイルするソースコードを列挙していましたので、CMakeLists.txtでもそのような記述ができるか探してみた結果、以下のような記述がありました。(CMakeLists.txtはプロジェクトフォルダのルートにあります)(50行付近に書かれています)
CMakeLists.txt
# add cross-platforms source files and header files
list(APPEND GAME_SOURCE
Classes/AppDelegate.cpp
Classes/HelloWorldScene.cpp
)
list(APPEND GAME_HEADER
Classes/AppDelegate.h
Classes/HelloWorldScene.h
)
この、GAME_SOURCEとGAME_HEADERという変数にソースファイルとヘッダーファイルを追加していけばよさそうです。
本来ならば全てのファイルを手動で追加していくのがいいのでしょうけど、それは骨が折れるのでCMakeLists.txtでワイルドカードのようなものが使えないかと調べていたら次のような書き方ができました。
CMakeLists.txt
# add cross-platforms source files and header files
# list(APPEND GAME_SOURCE
# Classes/AppDelegate.cpp
# Classes/HelloWorldScene.cpp
# )
file(GLOB_RECURSE GAME_SOURCE RELATIVE ${CMAKE_SOURCE_DIR} CONFIGURE_DEPENDS "Classes/*.cpp")
# list(APPEND GAME_HEADER
# Classes/AppDelegate.h
# Classes/HelloWorldScene.h
# )
file(GLOB_RECURSE GAME_HEADER RELATIVE ${CMAKE_SOURCE_DIR} CONFIGURE_DEPENDS "Classes/*.h")
GLOBは指定されたパターンにマッチするファイルを探索する機能で、GLOB_RECURSEでサブディレクトリも含めて探索します。 RELATIVEで${CMAKE_SOURCE_DIR}からの相対パスとして取得します。 CONFIGURE_DEPENDSはファイルが変更されたかどうかを取得してビルドシステムを再生成するもののようです。(新しい機能で情報が少なくよくわかっていません…) CMakeのドキュメントには、CONFIGURE_DEPENDSフラグは正しく動作しない場合があると書かれていましたが、Android Studioでは確認できる限りでは有効となっているようです。
ともあれ、上記のようにCMakeLists.txtを変更したところ無事に以前と同じようにAndroid Studioでビルドができました。