Integrating BehaviorTree.CPP Shared Library for Android (NDK & CMake) Интеграция динамической библиотеки BehaviorTree.CPP для Android (NDK и CMake)

A step-by-step guide to configuring and integrating the BehaviorTree.CPP shared library (libbehaviortree_cpp.so) in your CMake projects for Android using NDK. Пошаговое руководство по настройке и интеграции динамической библиотеки BehaviorTree.CPP (libbehaviortree_cpp.so) в проекты CMake для Android с использованием NDK.

Before proceeding, make sure you have configured your environment and compiled the shared library using the previous guides: Перед продолжением убедитесь, что вы настроили рабочее окружение и собрали динамическую библиотеку, следуя предыдущим инструкциям:

Step 1: Create Project Directory Шаг 1: Создание директории проекта

Create a workspace folder and a new directory for your BehaviorTree.CPP Android test project: Создайте рабочую папку для проектов и новую директорию для вашего тестового Android-проекта BehaviorTree.CPP:

Windows (Command Prompt / PowerShell)

mkdir C:\projects\bt-android-test
cd C:\projects\bt-android-test

Step 2: Create Source Files (main.cpp & CMakeLists.txt) Шаг 2: Создание исходных файлов (main.cpp и CMakeLists.txt)

Create the source files in your project directory: Создайте исходные файлы в папке проекта:

Windows (Terminal / Notepad)

notepad main.cpp
notepad CMakeLists.txt

1. File Contents for main.cpp 1. Содержимое файла main.cpp

#include <iostream>
#include <behaviortree_cpp/bt_factory.h>

// Custom action node
class SayHello : public BT::SyncActionNode {
public:
    SayHello(const std::string& name, const BT::NodeConfig& config)
        : BT::SyncActionNode(name, config) {}

    static BT::PortsList providedPorts() {
        return {};
    }

    BT::NodeStatus tick() override {
        std::cout << "Hello, BehaviorTree.CPP from Android!" << std::endl;
        return BT::NodeStatus::SUCCESS;
    }
};

int main() {
    BT::BehaviorTreeFactory factory;
    factory.registerNodeType<SayHello>("SayHello");

    static const char* xml_text = R"(
     <root BTCPP_format="4">
         <BehaviorTree ID="MainTree">
             <SayHello/>
         </BehaviorTree>
     </root>
    )";

    BT::Tree tree = factory.createTreeFromText(xml_text);

    // Tick the behavior tree once
    tree.tickOnce();

    return 0;
}

2. File Contents for CMakeLists.txt 2. Содержимое файла CMakeLists.txt

Directly links the compiled shared library (libbehaviortree_cpp.so) and the Android log library: Напрямую подключает скомпилированную динамическую библиотеку (libbehaviortree_cpp.so) и системную библиотеку логирования Android:

cmake_minimum_required(VERSION 3.21)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Release")
endif()

project(bt-android-test CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# -----------------------------------------------------------------------------
# Library Paths for Android
# -----------------------------------------------------------------------------
set(BTCPP_PATH "C:/libs/behaviortree-4.9.0-android/arm64-v8a")

# -----------------------------------------------------------------------------
# Define Project Source Files
# -----------------------------------------------------------------------------
set(PROJECT_SOURCES
    main.cpp
)

# -----------------------------------------------------------------------------
# Declare Target Type & Sources
# -----------------------------------------------------------------------------
add_executable(app)
target_sources(app PRIVATE ${PROJECT_SOURCES})

target_include_directories(app PRIVATE
    ${BTCPP_PATH}/include
)

# -----------------------------------------------------------------------------
# Link Libraries
# -----------------------------------------------------------------------------
target_link_libraries(app PRIVATE
    # BehaviorTree.CPP shared library (.so)
    ${BTCPP_PATH}/lib/libbehaviortree_cpp.so
    log
)

Step 3: Create Build & Execution Scripts Шаг 3: Создание скриптов сборки и запуска

Create batch scripts to configure, compile, and run the binary on an Android device or emulator via ADB: Создайте пакетные bat-скрипты для конфигурации, компиляции и запуска исполняемого файла на Android-устройстве или эмуляторе через ADB:

Windows (Batch Scripts)

config-android.bat

@echo off
set NDK=H:/AndroidSDK/ndk/28.2.13676358

cmake -G "MinGW Makefiles" ^
  -DCMAKE_TOOLCHAIN_FILE=%NDK%/build/cmake/android.toolchain.cmake ^
  -DANDROID_ABI=arm64-v8a ^
  -DANDROID_PLATFORM=android-21 ^
  -DCMAKE_BUILD_TYPE=Release ^
  -S . -B dist/android

build-android.bat

@echo off
cmake --build dist/android --config Release --parallel

run-android.bat

@echo off
set ADB=H:/AndroidSDK/platform-tools/adb.exe
set DEVICE_DIR=/data/local/tmp/bt-test
set BTCPP_LIB_DIR=C:/libs/behaviortree-4.9.0-android/arm64-v8a/lib

echo [*] Creating target directory on device...
%ADB% shell "mkdir -p %DEVICE_DIR%"

echo [*] Pushing executable and shared library...
%ADB% push dist/android/app %DEVICE_DIR%/
%ADB% push %BTCPP_LIB_DIR%/libbehaviortree_cpp.so %DEVICE_DIR%/

echo [*] Setting permissions and executing...
%ADB% shell "chmod +x %DEVICE_DIR%/app"
%ADB% shell "export LD_LIBRARY_PATH=%DEVICE_DIR%:$LD_LIBRARY_PATH && %DEVICE_DIR%/app"

Make sure an Android device or emulator is connected (check with adb devices), then run the scripts sequentially in Command Prompt: Убедитесь, что Android-устройство или эмулятор подключены (проверьте командой adb devices), затем последовательно запустите скрипты в командной строке:

config-android.bat
build-android.bat
run-android.bat

Step 4: Expected Output Шаг 4: Ожидаемый результат

After running run-android.bat, the executable will run inside /data/local/tmp using the shared library, and you should see the following output in your terminal: После запуска run-android.bat исполняемый файл выполнится внутри /data/local/tmp с использованием динамической библиотеки, и вы увидите следующий вывод в терминале:

Hello, BehaviorTree.CPP from Android!

Support My Work Поддержать проект

If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.

Sberbank (Russia only) Сбербанк (только для РФ)

Sberbank SBP QR Code

Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)

+7 (917) 212-29-59

USDT TRC20

USDT TRC20 QR Code

Support via Cryptocurrency Поддержка криптовалютой

TMtY1YifNf6FKvgeFmqKGQR4NStKr3csGp