Cocos2d-x 3.17.1からビルドがcmakeに変更された件に対応する、ほかトラブル対応

Cocos2d-x 3.17.1 の Androidのプロジェクトは、デフォルトのビルドシステムが「ndk-bild」から「cmake」に変更されています。それと、急に色々エラーが出たのでそれらの対応方法です。

//
// ~\proj.android\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 ★★★ここ!

従来は、自分でC++のファイル(.c, .cpp, .h, .hpp)を追加したら「Android.mk(~\proj.android\jni\)」を編集してコンパイラにファイルの場所を指定していましたが、これが効きません。

従って、Classes以下にファイルを追加してAndroid.mkにファイルを追加したけどファイルが見つかりませんとエラーが発生します。

この件の回避方法ですが、一番簡単なのは上記の gradle.properties の、「cmake」となっている箇所を「ndk-build」に戻す事です。今まで通り(ネットの検索でも多くみられる方法)に戻すことができます。

ですが、CMakeの方が推奨されていて今後ndk-buildは縮小の方向のように見える議論もあるのでcmakeでビルドする方法を合わせて紹介します。

############# Commentout #############
### list(APPEND GAME_SOURCE
#      Classes/AppDelegate.cpp
#      Classes/HelloWorldScene.cpp
#      )
### list(APPEND GAME_HEADER
#      Classes/AppDelegate.h
#      Classes/HelloWorldScene.h
#      )
############# Commentout #############
file(GLOB_RECURSE GAME_SOURCE RELATIVE ${CMAKE_SOURCE_DIR} "Classes/*.c")
file(GLOB_RECURSE GAME_SOURCE RELATIVE ${CMAKE_SOURCE_DIR} "Classes/*.cpp")
file(GLOB_RECURSE GAME_HEADER RELATIVE ${CMAKE_SOURCE_DIR} "Classes/*.h")
file(GLOB_RECURSE GAME_HEADER RELATIVE ${CMAKE_SOURCE_DIR} "Classes/*.hpp")
  • GLOB_RECURSEがサブディレクトリの検索
  • RELATIVEはCMakeList.txtからの相対パス指定
  • CMAKE_SOURCE_DIRは既定の変数

書いてる途中で気が付きましたがここに丸ごと同じ内容が乗っていたのでこっちの方がいいですね。

// 上記のQiitaから引用
# 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")
  • CONFIGURE_DEPENDSはファイルの更新があったら(マジかよ…

あとインクルードディレクトリを設定している人は以下の記述を追記します。

set(MY_INCLUDE_DIR
   ${PROJECT_SOURCE_DIR}/Classes/_include
   )
include_directories("${MY_INCLUDE_DIR}")

自分の既存プロジェクトはこれでコンパイルが通りました。(VC++とちがってめちゃクソ警告が出ましたが…

3.17.1で出たその他のエラーなど

Ninjaが無いと言われる

以下のようなエラーが発生

CMake Error: CMake was unable to find a build program corresponding to "Ninja".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.

解決方法は、以下の通り

(1) 環境変数「Path」の末尾に「ninja.exe」があるフォルダパスを追加

PATH=****;C:\${AndroidSDKフォルダ}\cmake\3.10.2.4988404\bin

(2) AndroidStudioを再起動

AndroidSDKの位置は、AndroidStudioの「設定」 → 「外観 & 振る舞い」 → 「システム設定」 → 「Android SDK」→【Android SDK ローケーション】にあります。(UIを日本語化してるので項目の名称は通常英語ですが…)

赤い警告メッセージが出る

以下メッセージは無視でOK。Gradleを4.10にアプデしちゃうと出るようになる。

WARNING: API 'variant.getMergeAssets()' is obsolete and has been replaced with 'variant.getMergeAssetsProvider()'.
It will be removed at the end of 2019.
For more information, see https://d.android.com/r/tools/task-configuration-avoidance.
To determine what is calling variant.getMergeAssets(), use -Pandroid.debug.obsoleteApi=true on the command line to display a stack trace.
Affected Modules: Sample.3.17.1

シンボルが見つからないと怒られる

以下エラーが出る場合AndroidStudioのg「ファイル」>「プロジェクトの構造」のモジュールからSDKをビルドするバージョンを「API25」より大きいものに設定する。(gradle.propertiesには28とあるのでそのほうが良いかも)

~\Cocos2dxHelper.java:765: エラー: シンボルを見つけられませ
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        シンボル:   変数 M
        場所: クラス VERSION_CODES

~\Cocos2dxHelper.java:766: エラー: シンボルを見つけられません
    if (sActivity.getResources().getConfiguration().isScreenRound()) {
        シンボル:   メソッド isScreenRound()
        場所: クラス Configuration

~\Cocos2dxActivity.java:378: エラー: シンボルを見つけられません
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
        シンボル:   変数 KITKAT_WATCH
        場所: クラス VERSION_CODES

~\Cocos2dxActivity.java:379: エラー: シンボルを見つけられません
    return !powerManager.isInteractive();

なんか環境が変わると他にも色々エラーが出そうだけど、バージョンがあってさえいればこれくらいで済むと思います?

またしばらくしたら変なことになるんだろうなぁ・・・