Box2Dから.aライブラリをビルドする手順

DxLibクラスタです。
超絶有名ライブラリであるBox2Dを使いたくなったので、
導入までの作業を備忘録します。
ここではAndroidへの導入手順になりますが、
ライブラリ化の作業さえ解れば、他でも応用効くかと思います。
先ずは公式サイトからプロジェクトをダウンロード。
公式サイト: https://box2d.org/
Box2D: https://github.com/erincatto/box2d

Androidでは、4種類のアーキテクチャに対応したライブラリが必要です。
お経を唱える様に4回作ります。
armeabi-v7a <- 古いスマホ向け
arm64-v8a <- 新しいスマホ向け
x86 / x86_64 <-エミュレーター向け

先ずは、Android NDKのパスを確認しておきます。
パスは、Android -> Tools -> SDKManagerとか探ればきっと出てきます。
次に、元のプロジェクトディレクトリにある、"include"ディレクトリも取っておきます。
ライブラリで利用するヘッダーファイル達です。
include <- 元のGitHubプロジェクトから
box2d
base.h
box2d.h
collision.h
id.h
math_function.h
types.h

お楽しみのお経タイムです。(armeabi-v7a, arm64-v8a, x86, x86_64の4回唱えます)
ダウンロードしたGitHubプロジェクトに入り、
出力先のディレクトリを作ります。
$mkdir armeabi-v7a
そのまま出力先ディレクトリに移動し必殺技...!!
($YOUR_NDK_PATHは、あなたのAndroidNDKへのパスです)
$cmake ../ \
-DCMAKE_TOOLCHAIN_FILE=$YOUR_NDK_PATH/cmake/android.toolchain.cmake \
-DANDROID_ABI=armeabi-v7a \
-DANDROID_PLATFORM=android-21 \
-DBUILD_SHARED_LIBS=OFF \
-DGLFW_BUILD_WAYLAND=OFF \
-DGLFW_BUILD_X11=OFF \
-DBOX2D_UNIT_TESTS=OFF \
-DBOX2D_SAMPLES=OFF
からの、決め技!!
$cmake --build . --config Release
するとどうでしょう、srcフォルダの中に、"libbox2d.a"ファイルが完成します。
以降、"armeabi-v7a "の部分を、
arm64-v8a, x86, x86_64に置き換え、残り3回作成します。

4つのlibbox2d.aファイルが完成したら、
それぞれ、次の様にフォルダにまとめておきます。
box2d
build
arm64-v8a
libbox2d.a
armeabi-v7a
libbox2d.a
x86
libbox2d.a
x86_64
libbox2d.a
include <- 元のGitHubプロジェクトから
box2d
base.h
box2d.h
collision.h
id.h
math_function.h
types.h

AndroidプロジェクトのCMake.txtファイルに、Box2dライブラリを紐づけます。
(ディレクトリの位置は各自自由に指定してください)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../box2d/include
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../box2d/build/${ANDROID_ABI}
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../DxLib/3.24f/${ANDROID_ABI}
...
${CMAKE_CURRENT_SOURCE_DIR}/utility)
link_directories(
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../box2d/build/${ANDROID_ABI}
${CMAKE_CURRENT_SOURCE_DIR}/../../../../../DxLib/3.24f/${ANDROID_ABI}
)
add_library(${CMAKE_PROJECT_NAME} SHARED
# List C/C++ source files with relative paths to this CMakeLists.txt.
native-lib.cpp
# DxLib
core/BtnBase.cpp
...
utility/Vec2.cpp)
# Specifies libraries CMake should link to your target library. You
# can link libraries from various origins, such as libraries defined in this
# build script, prebuilt third-party libraries, or Android system libraries.
target_link_libraries(${CMAKE_PROJECT_NAME}
# List libraries link to the target library
android
log
# Box2D
box2d
# DxLib
GLESv1_CM
...
opus)

リンクと動作確認は次のコードでどうぞ。
// Include
#include "box2d/box2d.h" // <- リンクが失敗してる時はここで無念...
#include "box2d/collision.h"
#include "box2d/math_functions.h"
// Gravity
b2WorldDef worldDef = b2DefaultWorldDef();
worldDef.gravity = (b2Vec2) {0.0f, -10.0f};
// World
const b2WorldId worldId = b2CreateWorld(&worldDef);
const string result = b2World_IsValid(worldId) ? "Success!!" : "Failed...";
LOGD("Main", "Hello, Box2D: %s", result.c_str());

4つのライブラリの動作確認はきっと大変なので、"arm64-v8a"だけで良いのでは...!?
arm64-v8a <- 最新端末(これだけでも十分)
armeabi-v7a <- 古い端末
x86, x86_64 <- エミュレータ