Начнем с малого, как прикрутить Android NDK к C::B
Есть два пути:
-
- прописать на каждую платформу свой профиль, с исполняемыми файлами согласно платформе. На мой взгляд утомительно, много всего и непонятно зачем. С учетом что если собирать одно и тоже под все платформы, то объем телодвижений с переключением конфигураций довольно велик.
У меня по умолчанию собираютсяarm64-v8a, armeabi-v7a, x86, x86_64.
- прописать на каждую платформу свой профиль, с исполняемыми файлами согласно платформе. На мой взгляд утомительно, много всего и непонятно зачем. С учетом что если собирать одно и тоже под все платформы, то объем телодвижений с переключением конфигураций довольно велик.
-
- использовать родную систему сборки
ndk-build. Это самое простое и изящное решение, не вступающее в конфликты с большинством проверокC::B, но, в настройкахC::Bважна каждая деталь, схема довольно капризная, и при неточностях может легко ломаться.
- использовать родную систему сборки
Возможности решения с помощью ndk-build:
- не требуется рутированного устройства
- полноценная отладка сборки, без дополнительных инструментов (набор инструментов NDK)
- полноценная сборка в
Debug/Releaseрежимах - полноценный запуск приложения (с устройства)
- авто запуск/остановка
gdbserverс устройства - не требуется оберток из
Gradle/Javaкода, работает напрямую с устройством - полная интеграция проектов
C::Bпри использвании утилиты экспорта cpb2ndk.
Интеграция Android NDK
- Путь перый: скачать и установить готовый инсталлятор
NDK C::B template, подробнее.. - Путь второй: в ручном режиме устанавливать
NDK C::B templateдля каждого проекта, как это сделать описано ниже.
Идеология и манера сборки приложения с использованием тулчейна Android NDK максимально приближена к типовому поведению C::B, логика процессов:
- сборка в режиме
Release- этапы: всегда новая сборка приложения, копирование его на устройство, запуск приложения. Все действия отображаются в консолеC::B. - сборка в режиме
Debug- этапы: всегда новая сборка приложения, копирование его на устройство, копированиеNDK-партфайлов для отладкиgdbserver,gdb.setup, запускgdbserverна устройстве, ожидание подключения дебагераGDBдля отладки. - режим
запуска приложения- этапы: запуск на устройстве приложения с выводом результатов в консоль. - режим
Отладка -> Старт- этапы: всегда новая сборка приложения, копирование его на устройство, копированиеNDK-партфайлов для отладкиgdbserv,gdb.setup, запускgdbservна устройстве, автоматическое подключение дебагераGDBи переход в режим отладки. - в режимах
Debug,Отладка -> Старт, окно запускаемогоgdbserverстартует в минимизированном состоянии и автоматически закрывается по окончани отладки.
Файлы шаблона:
Сам проект C::B, важные секции:
<Build><Option output>- указывает на скрипт дистанционного запуска приложения на устройстве -RunRemote.cmd. Скрипт генерируется автоматически.<Build><Option compiler="android_ndk-build">- это обработанное название компилятора в настройкахC::B-Android NDK-Build. Как завести учетную запись нового компилятора, показано ниже.
В секции <Extensions><debugger><remote_debugging> находятся настройки дистанционной отладки, реализованной с помощью GDB:
options ip_address="127.0.0.1" ip_port="59999" extended_remote="0", если есть необходимость изменить номер порта, то это так-же необходимо сделать вMakefile. Если опцияextended_remoteбудет отличной от нуля, окно дистанционно запущенногоgdbserverне закроется автоматически после отладки.
AndroidNdkTemplate.cbp - файл проекта C::B.
Если в процессе запуска собранного приложения на устройстве у вас возникают следующие ошибки:
WARNING: linker: /data/local/tmp/youprog: unused DT entry: type 0x6ffffef5 arg 0x4040
WARNING: linker: /data/local/tmp/youprog: unused DT entry: type 0x6ffffffe arg 0x5a34
WARNING: linker: /data/local/tmp/youprog: unused DT entry: type 0x6fffffff arg 0x2
Используйте android-elf-cleaner
Эти ошибки характерны для бинарного файла платформыarmeabi-v7a, позднее они были исправлены на последних версиях библиотек.
Скачать android-elf-cleaner v.0.0.14.79/win32 (03.07.2019)
Исходные файлы управления сборкой в директории NDK проекта:
Application.mk - установки параметров сборки.
Android.mk - собственно и является мейк-файлом уникальным для каждого NDK проекта (приложения).
Makefile - непосредственно запускается C::B:
Файлы Application.mk и Makefile являются универсальными для всех проектов собираемых с помощью NDK и не требуют правок.
Для понимания структуры где чего лежит в проекте NDK приложения, приведу дерево:
│ Android.mk
│ AndroidNdkTemplate.cbp
│ Application.mk
│ main.c
│ Makefile
│
├───libs
│ ├───arm64-v8a
│ │ gdb.setup
│ │ gdbserver
│ │ hello_world
│ ├───armeabi-v7a
│ │ gdb.setup
│ │ gdbserver
│ │ hello_world
│ ├───x86
│ │ gdb.setup
│ │ gdbserver
│ │ hello_world
│ └───x86_64
│ gdb.setup
│ gdbserver
│ hello_world
│
└───obj
└───local
├───arm64-v8a
│ │ hello_world
│ ├───objs
│ │ └───hello_world
│ └───objs-debug
│ └───hello_world
│ main.o
│ main.o.d
├───armeabi-v7a
│ │ hello_world
│ │
│ ├───objs
│ │ └───hello_world
│ └───objs-debug
│ └───hello_world
│ main.o
│ main.o.d
├───x86
│ │ hello_world
│ │
│ ├───objs
│ │ └───hello_world
│ └───objs-debug
│ └───hello_world
│ main.o
│ main.o.d
└───x86_64
│ hello_world
│
├───objs
│ └───hello_world
└───objs-debug
└───hello_world
main.o
main.o.d
Вид настроек проекта из GUI C::B:




Обязательно указать возможные пути где расположены объектные файлы с отладочными символами:
obj/local/armeabi-v7aobj/local//arm64-v8aobj/local/x86obj/local/x86_64

Необходимо добавить команды GDB передающие информацию о нахождении отладочных символов для платформы подключенного устройства:
set solib-search-path obj/local/armeabi-v7a- расположение отладочных символов для активного устройста.file obj/local/armeabi-v7a/<имя приложения>- имя отлаживаемого приложения.
Вид настроек компилятора в C::B:



Дополнительное меню отладки NDK приложения:
Оба используемых в меню скрипта имеют фиксированное имя и генерируются автоматически, во время исполнения Makefile, для удобства разумно добавить их в меню:


Метод отладки приложения состоит из типовых действий, например через F8 или меню Отладка -> Старт. Как только запустился дебагер, вам надо вызвать из созданного меню пункт ADB Debug Remote server, этой командой вы запустите GDB сервер на устройстве, который запустит ваше приложение. Вы подключаетесь к GDB серверу дистанционно и можете проводить сеанс отладки.
В режиме Debug запуск дистанционного сервера происходит автоматически и не требует вызова данного пункта меню.
Смотрите скриншот настроек дебагера в проекте выше.
Данная схема запуска отладки поддерживает и не рутированные устройства.
Глобальные настройки дебагера для NDK выглядят так:

Отладка на устройстве:

Результат сборки приложения толчейном NDK:

Преимущества использования NDK в отличии от статической сборки под определенную платформу:
- Не нужно компилировать двоичные файлы статически, поэтому размер выходного двоичного файла будет меньше.
- Можно использовать android
C/C++библиотеки, такие как liblog, чтобы иметь возможность иметь вывод в logcat из аппликации.
Скачать:
Полный код NDK C::B template находиться в директории C::B шаблон
Страница инсталлятора NDK C::B template
- Скачать инсталлятор
NDK C::B templateCodeBlocksNdkTemplate v.0.0.14.79/win32 (03.07.2019) - Скачать утилиту конвертации настроек cbp2ndk v.0.0.14.79/win32 (03.07.2019)
- Скачать утилиту очистки бинарного файла
armeabi-v7aandroid-elf-cleaner v.0.0.14.79/win32 (03.07.2019)
Обсуждение на ru.stackoverflow.com
License
MIT