Closed8

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ディレクトリ
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ライブラリを紐づけます。
(ディレクトリの位置は各自自由に指定してください)

CMake.txt
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 <- エミュレータ

このスクラップは4日前にクローズされました