Форум программистов, компьютерный форум, киберфорум
8Observer8
Войти
Регистрация
Восстановить пароль

SDL3 для Android: Вывод текста со шрифтом TTF с помощью SDL3_ttf

Запись от 8Observer8 размещена 25.01.2026 в 15:55. Обновил(-а) 8Observer8 01.02.2026 в 01:01
Показов 1867 Комментарии 0

Содержание блога

Если у вас не установлены Android SDK, NDK, JDK, и т.д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т.д.

Сборка примера



  • Скачайте этот пример. На всякий случай, я прикрепил его в виде архива: sdlcross-text.zip
  • Извлеките пример из архива. Можете открыть папку с извлечённым примером в редакторе кода Sublime Text 4: https://www.sublimetext.com/download
    Название: e102c8a65e39e36e5dc4c1f409e4e0124e7fb102.png
Просмотров: 7789

Размер: 4.7 Кб
  • Скачайте архив SDL3-devel-3.4.0-android.zip. Этот архив можно найти по ссылке
  • Скачайте архив SDL3_ttf-devel-3.2.2-android.zip. Этот архив можно найти по ссылке
  • Оба архива выше содержат файлы формата .aar
  • Файлы формата .arr из этих архивов нужно скопировать в папку "android-project/app/libs":
    Название: 89f94ca802fbae5ebfbe2838d3f94a139776e145.png
Просмотров: 741

Размер: 3.1 Кб
  • Нужно прописать пути к этим библиотекам в скаченном ранее примере. Откройте файл "android-project/app/build.gradle", и пропишите пути к библиотекам. Должно выглядеть так:
    Code
    1
    2
    3
    4
    5
    
    dependencies {
        implementation files('libs/SDL3-3.4.0.aar')
        implementation files('libs/SDL3_ttf-3.2.2.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 и нужно добавить '-DWITH_TTF=ON' для включения TTF, вот так:

    Code
    1
    2
    3
    4
    5
    6
    7
    
            externalNativeBuild {
                cmake {
                    arguments '-DANDROID_STL=c++_shared', '-DWITH_TTF=ON', '-DWITH_IMAGE=OFF', '-DWITH_MIXER=OFF', '-DWITH_NET=OFF', '-DWITH_BOX2D=OFF'
                    // abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
                    abiFilters 'arm64-v8a'
                }
            }
  • Скачайте прикреплённый архив font.zip, в котором лежит бесплатный шрифт, взятый по ссылке, и перенесите папку "fonts" в папку "android-project/app/src/main/assets":
    Название: 813459555c91094634f0785e90a595e411f674b3.png
Просмотров: 739

Размер: 2.4 Кб
  • Откройте в редакторе кода файл CMakeLists.txt и добавьте строку новые строки:
    Code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    option(WITH_TTF "Enable SDL3_ttf" ON)
     
    if(WITH_TTF)
        find_package(SDL3_ttf CONFIG REQUIRED)
    endif()
     
    if(WITH_TTF)
        target_compile_definitions(sdlcross PRIVATE WITH_TTF)
        target_link_libraries(sdlcross PRIVATE SDL3_ttf::SDL3_ttf)
    endif()
  • Откройте в редакторе кода файл src/context.h и добавьте строку новые строки. Я скопировал немного лишнего, чтобы понимать куда копировать новые строки кода:

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #ifdef WITH_TTF
    #include <SDL3_ttf/SDL_ttf.h>
    #endif
     
    typedef struct {
        // ...
    #ifdef WITH_TTF
        SDL_Texture *textTexture;
    #endif
        // ...
  • Откройте в редакторе кода файл src/main.c и добавьте строку новые строки:

    C
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    
    #if defined(WITH_TTF)
    #include <SDL3_ttf/SDL_ttf.h>
    #endif
     
     
    SDL_AppResult SDLCALL SDL_AppInit(void **appstate, int argc, char *argv[]) {
        (void) argc;
        (void) argv;
     
        // ...
     
    #ifdef WITH_TTF
        if (!TTF_Init())
        {
            SDL_Log("TTF_Init failed: %s", SDL_GetError());
            return SDL_APP_FAILURE;
        }
     
        TTF_Font *font = TTF_OpenFont("fonts/LiberationSans-Regular.ttf", 60);
        if (!font)
        {
            SDL_Log("TTF_OpenFont failed: %s", SDL_GetError());
            return SDL_APP_FAILURE;
        }
     
        const char *text = "Привет, Мир!"; // Hello World!
        SDL_Color textColor = (SDL_Color) { 100, 255, 100, 255 };
        SDL_Surface *surface = TTF_RenderText_Blended(font, text, 0, textColor);
        state->textTexture = SDL_CreateTextureFromSurface(state->renderer, surface);
        SDL_DestroySurface(surface);
    #endif
     
        show_important_message(1, "Entering the loop");
        return SDL_APP_CONTINUE;
    }
     
    SDL_AppResult SDLCALL SDL_AppIterate(void *appstate)
    {
        SdlCrossState *const state = appstate;
     
    #ifdef WITH_TTF
            SDL_FRect textRect;
            textRect.x = 200.f;
            textRect.y = 200.f;
            SDL_GetTextureSize(state->textTexture, &textRect.w, &textRect.h);
            // Draw the text
            SDL_RenderTexture(state->renderer, state->textTexture, NULL, &textRect);
    #endif
     
            SDL_RenderPresent(state->renderer);
        }
        return SDL_APP_CONTINUE;
     
    void SDLCALL SDL_AppQuit(void *appstate, SDL_AppResult result)
    {
        SdlCrossState *const state = appstate;
        (void) result;
     
        // ...
     
    #if defined(WITH_TTF)
        if (state->textTexture)
        {
            SDL_DestroyTexture(state->textTexture);
            state->textTexture = NULL;
        }
    #endif
     
        // ...
     
        SDL_free(state);
        TTF_Quit();
        SDL_Quit();
    }
  • Откройте CMD в папке apdroid-project и выполните команду для сборки программы в APK:
    Bash
    1
    
    gradlew assembleDebug
  • Откройте вторую консоль в папке "android-project/app/build/outputs/apk/debug" и выполните команду для установки приложения на устройство, которое подключено по USB-кабелю к компьютеру:
    Bash
    1
    
    adb install -r app-debug.apk
  • Приложение будет установлено. Запустите приложение. Должен быть выведен текст "Привет, Мир!" зелёного цвета:
    Название: 2a08689c36e0fc7a0bdf6ba5e90273d385a0f466.png
Просмотров: 743

Размер: 2.8 Кб
  • Если текста нет или приложение закрывается, то выполните команду в консоли:
    Bash
    1
    
    adb logcat SDL:V DEBUG:I *:S
  • Эта команда выводит лог из устройства в консоль. Если непонятно в чём дело, то копируйте лог в ИИ, например, в Gemini, ChatGPT, DeepSeek и т.д.
  • Примечание. Вы можете использовать программу scrcpy для вывода экрана смартфона на экран компьютера, чтобы делать скриншоты для форума. При этом смартфон должен быть подключён USB-кабелем.
Вложения
Тип файла: zip sdlcross-text.zip (452.8 Кб, 47 просмотров)
Тип файла: zip fonts.zip (206.1 Кб, 40 просмотров)
Тип файла: zip SDL3-devel-3.4.0-android.zip (15.69 Мб, 34 просмотров)
Тип файла: zip SDL3_ttf-devel-3.2.2-android.zip (20.60 Мб, 32 просмотров)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru