Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в отличие от v2, которая написана на C++, но v2 была близка с Си. Насколько я знаю, в Box2D v2 совсем не использовалась STL (Стандартная библиотека шаблонов).
Комментарий Gemini 3 по поводу Box2D новой C-версии:
Переход Box2D на чистый Си (версия v3) — это большой шаг для производительности и переносимости, особенно в контексте разработки под Android на SDL3. Ваше замечание про STL верно: Box2D всегда стремилась к минимализму и контролю над памятью, что делало её «почти Си-шной» даже во второй версии.
| Если у вас не установлены Android SDK, NDK, JDK, и т.д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т.д.
Сборка примера
- Скачайте этот пример. На всякий случай, я прикрепил его в виде архива: sdlcross-box2d.zip
- Извлеките пример из архива. Можете открыть папку с извлечённым примером в редакторе кода Sublime Text 4: https://www.sublimetext.com/download

- Скачайте архив SDL3-devel-3.4.0-android.zip. Этот архив можно найти по ссылке
- Скачайте архив box2d-3.2.0-android.zip. Эту библиотеку можно собрать для Android из исходников с помощью инструкции: Инструкция в разработке
- Оба архива выше содержат файлы формата .aar
- Файлы формата .arr из этих архивов нужно скопировать в папку "android-project/app/libs":

- Нужно прописать пути к этим библиотекам в скаченном ранее примере. Откройте файл "android-project/app/build.gradle", и пропишите пути к библиотекам. Должно выглядеть так:
| Code | 1
2
3
4
5
| dependencies {
implementation files('libs/SDL3-3.4.0.aar')
implementation files('libs/box2d-3.2.0.aar')
implementation 'androidx.appcompat:appcompat:1.5.1'
} |
|
- В этом же файле есть секция externalNativeBuild:
| Code | 1
2
3
4
5
6
7
| externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_shared', '-DWITH_IMAGE=ON', '-DWITH_MIXER=OFF', '-DWITH_NET=OFF', '-DWITH_BOX2D=OFF'
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
// abiFilters 'arm64-v8a'
}
} |
|
- В этой секции (externalNativeBuild) нужно закомментировать строку "abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'" и убрать комментарий со строки "abiFilters 'arm64-v8a'":
| Code | 1
2
3
4
5
6
7
| externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_shared', '-DWITH_IMAGE=ON', '-DWITH_MIXER=OFF', '-DWITH_NET=OFF', '-DWITH_BOX2D=OFF'
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
abiFilters 'arm64-v8a'
}
} |
|
- В той же секции externalNativeBuild нужно отключить DWITH_IMAGE, исправив ON на OFF и нужно изменить ON на OFF для Box2D: '-DWITH_BOX2D=ON' для включения активации работы с Box2D в этом примере-шаблоне, вот так:
| Code | 1
2
3
4
5
6
7
| externalNativeBuild {
cmake {
arguments '-DANDROID_STL=c++_shared', '-DWITH_IMAGE=OFF', '-DWITH_MIXER=OFF', '-DWITH_NET=OFF', '-DWITH_BOX2D=ON'
// abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
abiFilters 'arm64-v8a'
}
} |
|
- Откройте CMD в папке "android-project" и выполните команду для сборки программы в APK:
- Откройте вторую консоль "android-project/app/build/outputs/apk/debug" (здесь создаётся APK файл с именем app-debug.apk) и выполните команду для установки приложения на устройство, которое подключено по USB-кабелю к компьютеру:
| Bash | 1
| adb install -r app-debug.apk |
|
- Найдите установленное приложение на смартфоне, запустите его. Вы увидите визуализацию коллайдеров линиями
- Если ничего не выводится или приложение закрывается, то выполните команду в консоли:
| Bash | 1
| adb logcat SDL:V DEBUG:I *:S |
|
- Эта команда выводит лог из устройства в консоль. Если непонятно в чём дело, то копируйте лог в ИИ, например, в Gemini, ChatGPT, DeepSeek и т.д.
Перевод примера с Си на C++
- Откройте файл CMakeLists.txt. Вторая строка вы видите "C":
- Нужно либо заменить "C" на "CXX":
- Либо лучше просто удалить "C":
- Тогда можно даже создавать смешанные проекты. Можно добавить "CXX" к "C", что тоже позволит комбинировать в одном проекте С и C++ файлы
- Найдите в CMakeLists.txt этот код:
| Code | 1
2
3
| add_sdl_executable(sdlcross
src/main.cpp
) |
|
- Замените текст в коде выше "src/main.c" на "src/main.cpp"
- Сам файл "main.c" в проекте нужно переименовать в "main.cpp"
- Вы можете скопировать содержимое файла "main.cpp" и попросить ИИ, например: Gemini, ChatGPT, DeepSeek и т.д. объяснить, что нужно поменять в коде, чтобы перевести его на C++ и вставьте сам код
- Скопируйте для ИИ содержимое файлов "context.h" и "box2d-debug-drawer.h" и спросите ИИ, что нужно изменить в этих файлах для перевода на C++
- Это интересный опыт сравнения Си и C++ с помощью ИИ. Проделайте это самостоятельно.
|