Cocos2d-x v4移行 Android編

前回に引き続きCocos2d-xのv4への移行を行なっていきます


### [4.Androidのビルド](#Migration-4)


Androidは3.17でCMakeが導入されているので3.17から
することは64bit対応とAndroidX対応程度ですが
今回はCMakeに習熟していない方のためにCMakeList.txtを
再起的参照でソースを読み込むように変更したいと思います

それ以前のバージョンから移行する場合にはCMake対応する必要があります
CMakeList.txt,build.gradleをそれぞれv4から取得してきて
dependanciesを移せば移行できると思います

#### [確認環境](#Migration-4.0)
あくまで動作確認環境なので
必須のものもそうでないものも混ざっています


- Android Studio 4.1.2
- Android SDK 9.0 Pie (API Level 28)
- Android SDK Build-tools 28.0.3
- NDK 21.1.6352462
- CMake 3.18.1
- Android SDK Platform tools 28.0.1


#### [4.1 build.gradleの修正](#Migration-4.1)

[11_gradel]

proj.android/build.gradleを修正していきます
gradleツールのバージョンをあげます
ここではbuildscript > dependanciesの
com.android.tools.build:gradleを3.1.0から4.1.1
に修正します

<pre>
    classpath 'com.android.tools.build:gradle:3.1.0'
</pre>

->

<pre>
    classpath 'com.android.tools.build:gradle:4.1.1'
</pre>

また、画像のようにrepositoriesにgoogle()がない場合は
追加してください


#### [4.2 gradle-wrapper.propertiesの修正](#Migration-4.2)

proj.android/gradle/gradle-wrapper.propertiesを修正します
gradleのバージョンをあげます

<pre>
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip
</pre>

<br>

#### [4.3 CMakeバージョンの指定](#Migration-4.3)

<br>

前回iOS対応でCMakeバージョンを3.15以上に指定しているので
AndroidStudioのCMakeのバージョンと一致しない場合があります
その場合はCMakeのバージョンを指定します


proj.android/app/build.gradleを修正します

android > externalNativeBuild > cmake
にバージョンを指定します
下記のように修正します

<pre>
    externalNativeBuild {
        if (PROP_BUILD_TYPE == 'ndk-build') {
            ndkBuild {
                path "jni/Android.mk"
            }
        }
        else if (PROP_BUILD_TYPE == 'cmake') {
            cmake {
                path "../../CMakeLists.txt"
                version "3.18.1"
            }
        }
    }
</pre>

<br>

#### [4.4 64bit対応](#Migration-4.4)

proj.android/gradle.propertiesを修正します
PROP_APP_ABIにarm64-v8aを追加します

下記のようになるはずです

<pre>
PROP_APP_ABI=armeabi-v7a:arm64-v8a
</pre>


#### [4.5 AndroidX対応](#Migration-4.5)

これはAndroidStudioの機能でAndroidX対応がありますので実行します
Refactor -> Migrate to AndroidX...

![Screen Shot 2021-10-02 at 19.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2004493/02e8a4ca-54a7-f21d-f478-2870558d3f61.png)



#### [4.6 SimpleAudioEngineが必要な場合](#Migration-4.6)

CMakeListsltxtのtarget_include_directoriesにpathを追加します

`${COCOS2DX_ROOT_PATH}/cocos/editor-support/cocostudio`

target_include_directoriesは次のようになります


<pre>
    target_include_directories(${APP_NAME}
        PRIVATE Classes
        PRIVATE ${COCOS2DX_ROOT_PATH}/cocos/audio/include/
        PRIVATE ${COCOS2DX_ROOT_PATH}/cocos/editor-support/cocostudio)
</pre>

#### [4.7 CMakeのソース再帰取得](#Migration-4.7)

ファイル指定している部分を再帰的に取得するように修正します

CMakeLists.txtの該当箇所を

<pre>
list(APPEND GAME_SOURCE
     Classes/AppDelegate.cpp
     Classes/HelloWorldScene.cpp
     )
list(APPEND GAME_HEADER
     Classes/AppDelegate.h
     Classes/HelloWorldScene.h
     )
</pre>

次のように変更します

<pre>
# get source files recursive
file(GLOB_RECURSE GAME_SOURCE Classes/*.cpp Classes/*.c)

list(LENGTH GAME_SOURCE GAME_SOURCE_count)
message(STATUS "[INFO] Found ${GAME_SOURCE_count} cpp files.")

# get header files recursive
file(GLOB_RECURSE GAME_HEADER Classes/*.h Classes/*.hpp)

list(LENGTH GAME_HEADER GAME_HEADER_count)
message(STATUS "[INFO] Found ${GAME_HEADER_count} header files.")

# get headr dir
MACRO(HEADER_DIRECTORIES return_list)
    FILE(GLOB_RECURSE new_list Classes/*.h Classes/*.hpp)
    SET(dir_list "")
    FOREACH(file_path ${new_list})
        GET_FILENAME_COMPONENT(dir_path ${file_path} PATH)
        SET(dir_list ${dir_list} ${dir_path})
    ENDFOREACH()
    LIST(REMOVE_DUPLICATES dir_list)
    SET(${return_list} ${dir_list})
ENDMACRO()

HEADER_DIRECTORIES(header_dir_list)

list(LENGTH header_dir_list header_dir_list_count)
message(STATUS "[INFO] Found ${header_dir_list_count} header directories.")

</pre>

header_dir_listはヘッダファイルのパスをリスト化したものです
これもtarget_include_directoriesしましょう

<pre>
target_include_directories(${APP_NAME}
        PRIVATE Classes
        PRIVATE ${COCOS2DX_ROOT_PATH}/cocos/audio/include/
        PRIVATE ${COCOS2DX_ROOT_PATH}/cocos/editor-support/cocostudio
        PRIVATE ${header_dir_list}
)
</pre>


プラットフォームにおいてファイルを除外する必要がある場合があります

次のように指定して除外します
絶対パスでないとちゃんと削除してくれないので取得して
GAME_SOURCEから削除しています

<pre>
# file to remove
get_filename_component(full_path_test_cpp ${CMAKE_CURRENT_SOURCE_DIR}/Classes/test.cpp ABSOLUTE)
list(REMOVE_ITEM GAME_SOURCE "${full_path_test_cpp}")
</pre>

#### [4.7 Compile](#Migration-4.7)
Android Studioでビルドしてみましょう
ビルドが通るはずです

#### [4.8 参考](#Migaraion-4.8)
https://github.com/tlsd/cocos2dx-cpp-template-migration


[前の記事 Cocos2d-x v4移行 iOS編](https://qiita.com/tlsd/items/77c474a8611b64355c56)