Перейти к содержимому

Android sdk ndk tools что это

  • автор:

Настройка пакета SDK для Android для Xamarin.Android

Это руководство описывает, как использовать диспетчер пакетов SDK для Android с Xamarin в Visual Studio и Visual Studio для Mac.

Это руководство относится к Visual Studio 2022, Visual Studio 2019, Visual Studio 2017 и Visual Studio для Mac.

Диспетчер пакетов SDK для Android, предназначенный для Xamarin (устанавливается в составе рабочей нагрузки Разработка мобильных приложений на .NET), поможет вам скачать новейшие компоненты Android, необходимые для разработки приложения Xamarin.Android. Он заменяет автономный диспетчер пакетов SDK от Google, который был признан нерекомендуемым.

  • Visual Studio
  • Visual Studio для Mac

Требования

Чтобы использовать диспетчер пакетов SDK Xamarin Android, необходимо следующее:

  • Visual Studio 2022 Community, Professional или Enterprise.
  • Visual Studio 2019 (Community, Professional или Enterprise).
  • ИЛИ Visual Studio 2017 (выпуск Community, Professional или Enterprise). Требуется Visual Studio 2017 версии 15.7 или более поздней.
  • Инструменты Visual Studio для Xamarin версии 4.10.0 или более поздней версии (устанавливается как часть рабочей нагрузки Разработка мобильных приложений на .NET).

Диспетчеру пакетов SDK Xamarin Android также требуется Java Development Kit (которая устанавливается автоматически вместе с Xamarin.Android). Существует несколько альтернатив JDK:

  • По умолчанию Xamarin.Android использует JDK 8, который требуется, если вы разрабатываете API уровня 24 или выше (JDK 8 также поддерживает уровни API выше 24).
  • При разработке специально для уровня API 23 или ниже можно продолжать использовать пакет JDK 7.
  • Если вы используете Visual Studio 15.8 Preview 5 или более поздней версии, вы можете попробовать использовать microsoft Mobile OpenJDK Distribution , а не JDK 8.

Xamarin.Android не поддерживает пакет JDK 9.

Диспетчер SDK

Чтобы запустить диспетчер пакетов SDK в Visual Studio, щелкните Сервис > Диспетчер пакетов SDK для Android для Android>:

Расположение пункта меню диспетчера пакетов SDK для Android

Диспетчер пакетов SDK для Android открывается на экране Пакеты SDK и инструменты для Android. На этом экране есть две вкладки: Платформы и Средства:

Снимок экрана: открытие диспетчера пакетов SDK для Android на вкладке

Экран Пакеты SDK и инструменты для Android более подробно описан в следующих разделах.

Расположение пакета SDK для Android

Расположение пакета SDK для Android настраивается в верхней части экрана Пакеты SDK и инструменты для Android, как показано на предыдущем снимке экрана. Это расположение нужно настроить для правильной работы вкладок Платформы и Сервис. Задание расположения пакета SDK для Android может потребоваться по одной или нескольким из следующих причин:

  1. Диспетчер пакетов SDK для Android не смог найти пакет SDK для Android.
  2. Вы установили пакет SDK для Android в альтернативное расположение (отличное от используемого по умолчанию).

Чтобы задать расположение пакета SDK для Android, нажмите кнопку с многоточием (. ) справа от пункта Расположение пакета SDK для Android. При этом открывается диалоговое окно Обзор папок, в котором можно перейти к расположению пакета SDK для Android. На следующем снимке экрана выбран пакет SDK для Android в разделе Program Files (x86)\Android :

Снимок экрана: диалоговое окно

При нажатии кнопки ОК диспетчер пакетов SDK будет работать с пакетом SDK для Android, установленным в выбранном расположении.

Вкладка «Сервис»

Вкладка Сервис отображает список инструментов и дополнений. Эта вкладка используется для установки инструментов пакета SDK для Android, инструментов платформы и инструментов сборки. Кроме того, можно установить эмулятор Android, низкоуровневый отладчик (LLDB), NDK, ускорение HAXM и библиотеки Google Play.

Например, чтобы скачать пакет эмулятора Android от Google, установите флажок рядом с элементом Эмулятор Android и нажмите кнопку Применить изменения:

Установка эмулятора Android на вкладке

Может появиться диалоговое окно с сообщением Для установки следующего пакета требуется принять условия лицензии:

Экран принятия лицензии

Щелкните Принять, чтобы принять условия лицензионного соглашения. В нижней части окна индикатор выполнения указывает ход скачивания и установки. После завершения установки вкладка Сервис указывает, что выбранные инструменты и дополнения установлены.

Вкладка «Платформы»

Вкладка Платформы содержит список версий пакетов SDK вместе с другими ресурсами (например, образами системы) для каждой платформы:

Снимок экрана: панель

На этом экране указана версия Android (например, Android 8.0), кодовое название (Oreo), уровень API (например, 26) и размеры компонентов платформы (например, 1 ГБ). Вкладка Платформы позволяет вам устанавливать компоненты для целевого уровня API Android. Дополнительные сведения о версиях и уровнях API Android см. в разделе Основные сведения об уровнях API Android.

Если установлены все компоненты платформы, рядом с ее именем появляется флажок. Если установлены не все компоненты платформы, для нее заполняется поле. Вы можете развернуть платформу, чтобы просмотреть ее компоненты (в том числе и установленные), щелкнув поле + слева от нее. Щелкните , чтобы свернуть список компонентов для платформы.

Чтобы добавить в пакет SDK другую платформу, щелкайте поле рядом с ней, пока в нем не появился флажок (обозначающий установку всех компонентов), а затем нажмите кнопку Применить изменения:

Пример добавления компонентов Android 7.1 Nougat в пакет SDK для Android

Чтобы установить только отдельные компоненты, щелкните один раз поле рядом с платформой. Затем можно выбрать любые отдельные компоненты, которые вам нужны:

Пример добавления некоторых компонентов Android 7.1

Обратите внимание, что число устанавливаемых компонентов отображается рядом с кнопкой Применить изменения. После нажатия кнопки Применить изменения вы увидите экран Принятие условий лицензионного соглашения, показанный ранее. Щелкните Принять, чтобы принять условия лицензионного соглашения. Это диалоговое окно может появиться несколько раз, если устанавливается несколько компонентов. В нижней части окна индикатор выполнения указывает ход скачивания и установки. После завершения скачивания и установки (это может занять несколько минут в зависимости от числа скачиваемых компонентов) добавленные компоненты помечаются флажком и указываются в списке Установленные.

Выбор репозитория

По умолчанию диспетчер пакетов SDK для Android скачивает компоненты и инструменты платформы из репозитория, управляемого Майкрософт. Если вам нужен доступ к экспериментальным альфа- и бета-версиям платформ и инструментов, которые еще не доступны в репозитории Майкрософт, вы можете переключить диспетчер пакетов SDK на использование репозитория Google. Чтобы переключиться, щелкните значок шестеренки в правом нижнем углу и выберите Репозиторий > Google (не поддерживается):

Выбор репозитория Google

Если выбран репозиторий Google, на вкладке Платформы могут отобразиться дополнительные пакеты, недоступные ранее. (На снимке экрана выше при переключении на репозиторий Google была добавлена платформа 28 пакета SDK для Android.) Помните, что использование репозитория Google не поддерживается и потому не рекомендуется для обычной разработки.

Чтобы вернуться на поддерживаемый репозиторий платформ и инструментов, щелкните Майкрософт (рекомендуется). Это восстановит список пакетов и инструментов по умолчанию.

Требования

Чтобы использовать диспетчер пакетов SDK Xamarin Android, необходимо следующее:

  • Visual Studio для Mac 7.5 или более поздней версии.

Диспетчеру пакетов SDK Xamarin Android также требуется Java Development Kit (которая устанавливается автоматически вместе с Xamarin.Android). Существует несколько альтернатив JDK:

  • По умолчанию Xamarin.Android использует JDK 8, который требуется, если вы разрабатываете API уровня 24 или выше (JDK 8 также поддерживает уровни API выше 24).
  • При разработке специально для уровня API 23 или ниже можно продолжать использовать пакет JDK 7.
  • Если вы используете Visual Studio для Mac 7.7 или более поздней версии, вы можете попробовать использовать microsoft Mobile OpenJDK Distribution, а не JDK 8.

Xamarin.Android не поддерживает пакет JDK 9.

Диспетчер SDK

Чтобы запустить диспетчер пакетов SDK в Visual Studio для Mac, щелкните Сервис > Диспетчер пакетов SDK:

Расположение пункта меню диспетчера пакетов SDK для Android

Диспетчер пакетов SDK Android открывается в окне параметров, содержащем три вкладки — Платформы, Сервис и Расположения:

Снимок экрана: открытие диспетчера пакетов SDK для Android на вкладке

Вкладки диспетчера пакетов SDK для Android описаны в следующих разделах.

Вкладка «Расположения»

Вкладка Расположения содержит три параметра для настройки расположений пакета SDK для Android, пакета NDK для Android и пакет SDK для Java (JDK). Эти расположения нужно настроить для правильной работы вкладок Платформы и Сервис.

При запуске диспетчер пакетов SDK автоматически определяет путь для каждого установленного пакета и указывает, что он был обнаружен, размещая зеленую галочку рядом с путем:

Снимок экрана: вкладка

Нажмите кнопку Сбросить к значениям по умолчанию, чтобы диспетчер пакетов SDK искал пакеты SDK, NDK и JDK в расположениях по умолчанию.

Как правило, вкладка Расположения используется, чтобы изменить расположение пакета SDK для Android и (или) пакета JDK для Java. Вам не нужно устанавливать NDK для разработки приложений Xamarin.Android. NDK используется только в том случае, если необходимо разрабатывать части приложения с использованием языков машинного кода, таких как C и C++.

Вкладка «Сервис»

Вкладка Сервис отображает список инструментов и дополнений. Эта вкладка используется для установки инструментов пакета SDK для Android, инструментов платформы и инструментов сборки. Кроме того, можно установить эмулятор Android, низкоуровневый отладчик (LLDB), NDK, ускорение HAXM и библиотеки Google Play.

Например, чтобы скачать пакет эмулятора Android от Google, установите флажок рядом с элементом Эмулятор Android и нажмите кнопку Применить изменения:

Установка эмулятора Android с вкладки

Может появиться диалоговое окно с сообщением Для установки следующего пакета требуется принять условия лицензии:

Экран принятия условий лицензии

Щелкните Принять, чтобы принять условия лицензионного соглашения. В нижней части окна индикатор выполнения указывает ход скачивания и установки. После завершения установки вкладка Сервис указывает, что выбранные инструменты и дополнения установлены.

Вкладка «Платформы»

Вкладка Платформы содержит список версий пакетов SDK вместе с другими ресурсами (например, образами системы) для каждой платформы:

Снимок экрана: панель

На этом экране указана версия Android (например, Android 8.1), кодовое название (Oreo), уровень API (например, 27) и размеры компонентов платформы (например, 1 ГБ). Вкладка Платформы позволяет вам устанавливать компоненты для целевого уровня API Android. Дополнительные сведения о версиях и уровнях API Android см. в разделе Основные сведения об уровнях API Android.

Если установлены все компоненты платформы, рядом с ее именем появляется флажок. Если установлены не все компоненты платформы, для нее заполняется поле. Вы можете развернуть платформу, чтобы просмотреть ее компоненты (в том числе и установленные), щелкнув стрелку слева от нее. Щелкните стрелку вниз, чтобы свернуть список компонентов для платформы.

Чтобы добавить в пакет SDK другую платформу, щелкайте поле рядом с ней, пока в нем не появился флажок (обозначающий установку всех компонентов), а затем нажмите кнопку Применить изменения:

Пример добавления всех компонентов платформы

Чтобы установить только отдельные компоненты, щелкните один раз поле рядом с платформой. Затем можно выбрать любые отдельные компоненты, которые вам нужны:

Пример добавления некоторых компонентов

Обратите внимание, что число устанавливаемых компонентов отображается рядом с кнопкой Применить изменения. После нажатия кнопки Применить изменения вы увидите экран Принятие условий лицензионного соглашения, показанный ранее. Щелкните Принять, чтобы принять условия лицензионного соглашения. Это диалоговое окно может появиться несколько раз, если устанавливается несколько компонентов. В нижней части окна индикатор выполнения указывает ход скачивания и установки. После завершения скачивания и установки (это может занять несколько минут в зависимости от числа скачиваемых компонентов) добавленные компоненты помечаются флажком и указываются в списке Установленные.

Выбор репозитория

По умолчанию диспетчер пакетов SDK для Android скачивает компоненты и инструменты платформы из репозитория, управляемого Майкрософт. Если вам нужен доступ к экспериментальным альфа- и бета-версиям платформ и инструментов, которые еще не доступны в репозитории Майкрософт, вы можете переключить диспетчер пакетов SDK на использование репозитория Google. Чтобы переключиться, щелкните значок шестеренки в правом нижнем углу и выберите Репозиторий > Google (не поддерживается):

Выбор репозитория Google

Если выбран репозиторий Google, на вкладке Платформы могут отобразиться дополнительные пакеты, недоступные ранее. (На снимке экрана выше при переключении на репозиторий Google была добавлена платформа 28 пакета SDK для Android.) Помните, что использование репозитория Google не поддерживается и потому не рекомендуется для обычной разработки.

Чтобы вернуться на поддерживаемый репозиторий платформ и инструментов, щелкните Майкрософт (рекомендуется). Это восстановит список пакетов и инструментов по умолчанию.

Сводка

В этом руководстве вы узнали, как устанавливать и использовать диспетчер пакетов SDK для Android с Xamarin в Visual Studio и Visual Studio для Mac.

Связанные ссылки

  • Общие сведения об уровнях API Android
  • Изменения в инструментарии пакета SDK для Android

Software Development Kit (SDK)

SDK (от англ. «Software Development Kit» — «комплект программ для разработки») — это набор необходимых программных продуктов (библиотек, скриптов и т.п.), предназначенный для облегчения процесса разработки и тестирования кода для конкретных программных платформ (пакетов программ, аппаратных платформ и т.п.).

Производитель программной (аппаратной или программно-аппаратной) платформы заинтересован в притоке новых программистов, которые расширяют сферу применения основного продукта и потому предлагает комплект SDK чаще всего бесплатно. Для расширения функционала SDK и упрощения разработки могут применяться интегрированные среды разработки (IDE), взаимодействующие с SDK.

Часто производители платформ переименовывают предлагаемые SDK:

  • JDK — Java Development Kit,
  • ADT — Android Development Tools,
  • Android NDK — Android Native Development Kit,
  • WDK — Windows Driver Kit,
  • DDK — Driver Development Kit.

Android SDK

Android SDK — это дополнительный набор инструментов Android Studio, которые помогают написать код, запустить тестирование и отладку, проверить работу приложения на различных версиях операционной системы и оценить результат в реальном времени. Также пакет позволяет пользователям получать информацию о состоянии операционной системы, читать логи и выявлять ошибки. Через SDK для Андроид можно восстанавливать программную оболочку и устанавливать сторонние прошивки.

Освойте профессию «Android-разработчик»

Что такое Android SDK и для чего он нужен

Набор состоит из пакетов, необходимых для создания приложений. Вот основные, которыми могут воспользоваться разработчики на Android.

Android SDK Platform Tools. В группу входят такие инструменты взаимодействия с Android, как Android Debugging Bridge (ADB), Fastboot, Systrace и другие. ADB помогает найти ошибки в работе приложений, установить APK на смартфон. Fastboot — активировать быструю загрузку для управления мобильным устройством с компьютера, перепрошить гаджет, настроить доступ, параметры работы операционной системы. Systrace — получить информацию о запущенных процессах, проследить за активностью и объемом данных, которые отправлены по сети.

16 месяцев
Android-разработчик

Запускайте приложения и игры для Android

Group 1321314280 (3)

Android SDK Build Tools. Компоненты Android SDK используются для создания кода. Zipalign позволяет оптимизировать файл APK, AAPT2 — проанализировать, проиндексировать и скомпилировать ресурсы в двоичный формат под платформу Android, Аpksigner — подписать пакет APK с помощью закрытого ключа.

Эмулятор Android. Инструмент помогает протестировать приложения и опробовать функции последних версий Android.

Подробное описание Android SDK и необходимую документацию можно найти на официальном сайте в разделе User guide.

Установка доступна на устройствах с операционными системами Windows, Mac, Linux и Chrome OS. Для запуска персональный компьютер должен соответствовать минимальным системным требованиям.

Читайте также Как пользоваться Android Studio

Где скачать Android SDK

Пользователи могут самостоятельно выбрать ОС и загрузить решение на официальном сайте разработчика. При нажатии на кнопку Download Options откроется список доступных версий. Если Android Studio не нужна, можно скачать базовые инструменты командной строки Android (аналог пакета Android SDK Tools, эта программа устарела). Для просмотра, удаления пакетов и установки доступных версий Android SDK предназначен SDK Manager.

Как установить Android Studio на Windows

Процесс инсталляции занимает 2–5 минут в зависимости от характеристик ПК. Для корректной установки необходимо:

  1. Запустить файл Android Studio Setup от имени администратора.
  2. Согласиться с предупреждением системы безопасности, нажав на кнопку «Запустить».
  3. Дождаться распаковки и инсталляции установочных файлов.
  4. Разрешить вносить новые сведения для этого компьютера.
  5. Нажать на кнопку Next и выбрать компоненты Android SDK Platforms Tools, которые будут установлены. Лучше не снимать галочки, так как лишний функционал можно отключить в программе после установки.
  6. Указать путь установки и начать процесс инсталляции.

После извлечения всех файлов на экране появится надпись Completed. Для завершения установки нужно нажать на кнопки Next и Finish.

Станьте Android-разработчиком — работайте в штате, на фрилансе или запускайте собственные приложения

Где скачать и как установить Java Development Kit

Для работы с Android SDK требуется загрузка Java Development Kit. Java Development Kit отвечает за графическое отображение исходного кода. Чтобы увидеть список версий Java, нужно перейти на официальный сайт Oracle. Для установки необходимо:

  1. Выбрать версию. Последние версии Java доступны только для 64-битных систем. Их можно загрузить либо в компрессированном архиве, либо в инсталляционном файле.
  2. Зарегистрироваться в системе Oracle. Если у пользователя есть учетная запись — пройти процедуру авторизации.
  3. Скачать Java Development Kit для Android на ПК.
  4. Выполнить все требования установочного файла, указав место хранения утилиты.
  5. После завершения установки закрыть программу и перезагрузить компьютер.
  6. Теперь можно приступать к настройке и работе с Android SDK.

Интерфейс и настройка

Чтобы произвести начальную настройку программного обеспечения, необходимо:

  1. Запустить установленный софт SDK от имени администратора. После запуска программы высветится приветственное окно, в котором можно быстро создать проект.
  2. Выбрать заголовок Create New Project и нажать на понравившийся шаблон (Activity). Можно работать с нуля или редактировать готовый проект. Activity отвечает за логику экрана приложения. Лучше установить либо No Activity, либо Empty Activity.
  3. Указать в появившемся окне настроек название проекта и пакета. Если в планах публикация в Google Play, во втором случае нужно подобрать уникальное наименование. В окне можно поменять директорию проекта, язык программирования (Java или Kotlin), указать минимальную поддерживаемую версию Android SDK. Чем она ниже, тем больше устройств будут поддерживать приложение.

Чтобы добавить дополнительные инструменты Android SDK, нужно:

1. В открывшемся окне перейти во вкладку Tools и выбрать SDK Manager. Вкладка Tools расположена в верхней части установленного приложения.

2. После этого открыть вкладку SDK Tools. В ней представлена информация об установочных пакетах, можно скачать необходимые для работы.

Знакомство и базовая настройка Android Studio завершены.

Возможные ошибки при установке и запуске

Если устройство соответствует характеристикам, но программа выдает ошибку Skipping SDK Tools 11, были установлены старые компоненты Java, а затем добавлен софт SDK. Необходимо переустановить все компоненты, начиная с пакетов разработки от Java и заканчивая Android Studio. После удаления рекомендуется очистить остаточные файлы программой CCleaner (или аналогами).

Программа конфликтует с кириллицей, поэтому иногда возникает ошибка non-ASCII. Чтобы устранить ее, необходимо переименовать учетную запись.

Android SDK Tools — это функциональное программное обеспечение, помогающее разработчикам создавать оптимизированные приложения. Независимо от того, используется ли Java, Kotlin или C#, SDK позволяет запустить продукт и получить доступ к уникальным функциям операционной системы. Google активно поддерживает и продвигает открытое программирование, поэтому каждый желающий может попробовать себя в роли кодера для ОС Android.

Android-разработчик

Освойте программирование на Java и Kotlin, мобильную разработку и UX/UI, разработайте свое приложение для Android. Центр карьеры поможет с резюме и подготовкой к собеседованию. Программа подойдет для новичков

картинка - 2023-03-14T191628.466

Статьи по теме:

Плюсы и минусы обеих платформ, сколько зарабатывают мобильные разработчики и как освоить специальность с нуля

Использование NDK в своих приложениях

Android Tools

Приложения на Android, как правило, написаны на языке Java, с его элегантными объектно-ориентированным дизайном. Однако в случае, если необходимо преодолеть ограничения языка Java, такие как управление памятью и производительность, посредством программирования непосредственно в нативный интерфейс Android. Для этих целей, помимо Android SDK, Android предоставляет Native Developmemt Kit (NDK), реализующий поддержку разработки на C/C++.

NDK предоставляет все инструменты (компиляторы, библиотеки и заголовочные файлы) для создания приложений, которые получают доступ к устройству нативно. Нативный код обеспечит высокую производительность там, где Java имеет ограничения. С помощью NDK также можно управлять нативными процессами и физическими компонентами устройства, такими как датчики и сенсорный ввод. Кроме того, NDK может быть полезен в следующих случаях:

  • Извлечение дополнительной производительности из устройства, чтобы добиться низкой задержки или запуска приложений с интенсивными вычислениями, таких как игры или физическое моделирование.
  • Использование своих библиотек или библиотек других разработчиков, написанных на C/C++.

При сборке APK-файла, Gradle компилирует код на C/C++ в нативную библиотеку, после чего добавляет в APK-файл. Затем ваш код на Java сможет обращаться к библиотеке и её методам через инфраструктуру JNI (Java Native Interface).

Начало работы с NDK

Поддержка NDK осуществляется, начиная с версии Android Studio 2.2 и выше. Чтобы использовать NDK в своём приложении, нужно установить его. Для этого в Android Studio нужно открыть Configure и выбрать SDK Manager.

В открывшемся окне на вкладке SDK Tools нужно поставить галочки напротив выделенных элементов. После этого достаточно будет нажать Apply и Android Studio начнёт загрузку и установку.

  • CMake — утилита внешней сборки, которая работает вместе с Gradle для создания нативной библиотеки. Этот компонент не нужен в случае, если используется ndk-build.
  • LLDB — отладчик, который Android Studio использует для отладки нативного кода.
  • NDK — собственно набор инструментов для написания нативного кода на C/C++.

Теперь можно перейти к созданию нового проекта. В Configure your new project поставьте галочку Include C++ Support.

Затем идёт стандартная процедура создания проекта, заполняем все поля так, как хотим, после чего попадаем на экран Customize C++ Support.

В этом окне можно настроить следующие параметры:

  • C++ Standard — в раскрывающемся списке выбирается стандарт C++, который будет использоваться в приложении. Вариант Toolchain Default использует настройки CMake по умолчанию.
  • Exceptions Support — флажок, определяющий, нужно ли включить поддержку обработки исключений C++. Если включить флажок, то Android Studio добавит флаг -fexceptions в cppFlags в файле build.gradle уровня модуля, который Gradle передает в CMake.
  • Runtime Type Information Support — флажок, определяющий, нужно ли включить поддержку RTTI (Runtime Type Information — механизм, который определяет тип переменной или объекта во время выполнения программы). Если включить флажок, Android Studio добавит флаг -frtti в cppFlags в файле build.gradle уровня модуля, который Gradle передает в CMake.

После настройки Android Studio соберёт проект. Перейдя в список файлов, можно увидеть новые файлы, созданные для нативной библиотеки.

В папке cpp можно разместить все исходные файлы, заголовочные файлы и готовые библиотеки, которые нужно добавить в приложение.

Нельзя просто так взять и вызвать какой-либо из нативных методов с помощью Java-кода, для этого нужно реализовать метод, который будет вызывать особым образом. В качестве примера автоматически создаётся файл native-lib.cpp. Он предоставляет метод stringFromJNI(), который возвращает в приложение строку «Hello from C++«.

#include #include extern "C" JNIEXPORT jstring JNICALL Java_ru_androidtools_ndktest_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) < std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); >

Известная проблема: Android Studio в настоящее время показывает только заголовочные файлы, которые соответствуют исходным файлам — даже если вы укажете другие заголовочные файлы в скрипте CMake.

В External Build Files можно увидеть скрипт сборки CMake или ndk-build. Аналогично тому, как build.gradle сообщает Gradle о том, как собрать приложение, CMake и ndk-build требуют, чтобы скрипт сборки знал, как создать свою нативную библиотеку. Для новых проектов Android Studio создаёт файл CMakeList.txt и помещает его в корневой каталог модуля. В данном случае, по умолчанию он выглядит следующим образом:

# For more information about using CMake with Android Studio, read the # documentation: https://d.android.com/studio/projects/add-native-code.html # Sets the minimum version of CMake required to build the native library. cmake_minimum_required(VERSION 3.4.1) # Creates and names a library, sets it as either STATIC # or SHARED, and provides the relative paths to its source code. # You can define multiple libraries, and CMake builds them for you. # Gradle automatically packages shared libraries with your APK. add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp ) # Searches for a specified prebuilt library and stores the path as a # variable. Because CMake includes system libraries in the search path by # default, you only need to specify the name of the public NDK library # you want to add. CMake verifies that the library exists before # completing its build. find_library( # Sets the name of the path variable. log-lib # Specifies the name of the NDK library that # you want CMake to locate. log ) # Specifies libraries CMake should link to your target library. You # can link multiple libraries, such as libraries you define in this # build script, prebuilt third-party libraries, or system libraries. target_link_libraries( # Specifies the target library. native-lib # Links the target library to the log library # included in the NDK. $ )

Чтобы к нативному коду можно было обращаться из приложения, в MainActivity.java нужно выполнить несколько операций, перечисленных ниже.

public class MainActivity extends AppCompatActivity < // 1 static < System.loadLibrary("native-lib"); >// 2 public native String stringFromJNI(); @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 3 TextView tv = findViewById(R.id.sample_text); tv.setText(stringFromJNI()); > >
  1. С помощью метода System.loadLibrary() мы загружаем библиотеку из папки cpp.
  2. Объявляем нативный метод загруженной библиотеки.
  3. Вызываем нативный метод библиотеки.

Запустим приложение и увидим строчку из нативного кода в TextView.

Вот так выглядит процесс запуска приложения с нативным кодом:

  1. Gradle вызывает внешний скрипт сборки CMakeLists.txt.
  2. CMake следует командам из скрипта сборки, чтобы скомпилировать исходный файл native-lib.cpp в общую библиотеку, и называет полученную библиотеку libnative-lib.so, который Gradle затем упаковывает в APK.
  3. Во время выполнения MainActivity приложения загружает нативную библиотеку, используя System.loadLibrary(). После этого метод библиотеки stringFromJNI() становится доступным для использования.
  4. MainActivity.onCreate() вызывает stringFromJNI(), который возвращает строку «Hello from C++» в TextView.

Примечание: Instant Run несовместим с компонентами проекта, написанными на нативном коде.

Анализ APK-файла

Чтобы убедиться, что нативная библиотека была добавлена в APK, можно этот APK проанализировать с помощью утилиты APK Analyzer. Для этого в Android Studio выберем в меню Build — Build APK(s).

После того, как APK будет собран, появится уведомление с предложением открыть папку, в которой он находится, либо проанализировать его. Выбираем analyze. Либо можно в меню выбрать Build — Analyze APK и указать путь до созданного APK (app/build/outputs/apk).

В Android Studio откроется результат анализа APK. Здесь можно увидеть, какой размер имеет собранный APK, сколько классов и методов включает в себя, список ресурсов и прочее.

Здесь можно увидеть, что собранный APK имеет следующие характеристики:

Характеристика Значение
Размер APK в несжатом виде 1.7 MB
Размер APK в сжатом виде 1.4 MB
Количество классов 1269
Количество методов 10359

Однако нас интересует наличие нативной библиотеки. Если раскрыть папку lib, занимающую 18,7% от размера APK, то можно увидеть там файл libnative-lib.so под разные архитектуры. Это и есть скомплиированная нативная библиотека.

Сравним, насколько меняется размер APK-файла по сравнению с приложением без использования NDK. Создадим пустой проект с надписью «Hello, world!» на экране. Соберём APK и посмотрим на его характеристики.

Характеристика Значение
Размер APK в несжатом виде 1.4 MB
Размер APK в сжатом виде 1.2 MB
Количество классов 1269
Количество методов 10357

В результате сравнения получаем, что размер APK за счет добавления нативной библиотеки изменяется незначительно.

Рассмотрим, как можно добавить свой нативный код в приложение.

Добавление исходных файлов

Чтобы добавить в cpp свои файлы, нужно нажать правой кнопкой мыши на папку cpp и выбрать C/C++ Source File.

В появившемся окне нужно написать имя исходного файла, а также выбрать расширение файла.

В раскрывающемся списке Type можно выбрать стандартные расширения файла, либо создать свои. Для этого нужно нажать на кнопку справа от раскрывающегося списка, после чего откроется окно настроек, где будет предложено создать тип и выбрать для него расширение исходного файла и заголовочного.

Если есть необходимость в создании заголовочного файла, можно поставить флажок на Create an associated header.

Применение нативного кода не ограничивается возвратом захардкоженных строк. Например, можно написать нативный код, который принимает от Java объект, работает с ним и возвращает результат работы.

Создадим Java-класс MeshData, который будет служить для хранения данных объекта.

public class MeshData < private int _facetCount; public float[] VertexCoords; public MeshData(int facetCount) < _facetCount = facetCount; VertexCoords = new float[facetCount]; // заполняем массив значениями for (int i = 0; i < facetCount; ++i) < VertexCoords[i] = 10.0f * i; >> public int getFacetCount() < return _facetCount; >>

Добавим созданный исходный файл test-lib.cpp в метод System.loadLibrary() активности и объявим метод getMemberFieldFromNative(), с помощью которого мы будем передавать объект из Java в нативный код.

public class MainActivity extends AppCompatActivity < static < System.loadLibrary("native-lib"); >public native String stringFromJNI(); public native float getMemberFieldFromNative(MeshData obj); .

Откроем test-lib.cpp и добавим в него JNI-метод, который будет принимать объект MeshData и получать доступ к полю VertexCoords.

JNIEXPORT jfloat JNICALL Java_ru_androidtools_ndktest_MainActivity_getMemberFieldFromNative( JNIEnv *env, jobject callingObject, jobject obj) //obj это экземпляр MeshData, который мы передали из Java < float result = 0.0f; // получаем класс объекта jclass cls = env->GetObjectClass(obj); // получаем поле, [F это массив float jfieldID fieldId = env->GetFieldID(cls, "VertexCoords", "[F"); // получаем поле объекта, возвращает JObject (потому что это массив) jobject objArray = env->GetObjectField(obj, fieldId); // Преобразовываем объект в jfloatarray jfloatArray *fArray = reinterpret_cast(&objArray); jsize len = env->GetArrayLength(*fArray); // получаем элементы массива float *data = env->GetFloatArrayElements(*fArray, 0); for (int i = 0; i < len; ++i) < result += data[i]; >// этот метод очень важен, поскольку копирует измененный массив обратно и помогает избежать утечек памяти env->ReleaseFloatArrayElements(*fArray, data, 0); return result; >

Не забудьте в начале файла подключить библиотеку jni.h.

#include

Следующий JNI-метод возвращает значение.

int getFacetCount(JNIEnv *env, jobject obj) < jclass cls = env->GetObjectClass(obj); jmethodID methodId = env->GetMethodID(cls, "getFacetCount", "()I"); int result = env->CallIntMethod(obj, methodId); return result; > JNIEXPORT jint JNICALL Java_ru_androidtools_ndktest_MainActivity_invokeMemberFuncFromNative( JNIEnv *env, jobject callingObject, jobject obj) < int facetCount = getFacetCount(env, obj); // возвращаем результат (в int) return facetCount; >

После этого создаем объект Java в следующем JNI-методе чтобы вернуть его.

JNIEXPORT jobject JNICALL Java_ru_androidtools_ndktest_MainActivity_createObjectFromNative( JNIEnv *env, jobject callingObject, jint param) < jclass cls = env->FindClass("ru/androidtools/ndktest/MeshData"); jmethodID methodId = env->GetMethodID(cls, "", "(I)V"); jobject obj = env->NewObject(cls, methodId, param); return obj; >

Поскольку мы не можем передавать список или объекты в нативный код, мы должны передавать в него массив. Для этого объявим в коде активности метод processObjectArrayFromNative().

public native int processObjectArrayFromNative(MeshData[] objArray);

Добавим JNI-метод, который будет считывать этот массив.

JNIEXPORT jint JNICALL Java_ru_androidtools_ndktest_MainActivity_processObjectArrayFromNative( JNIEnv *env, jobject callingObject, jobjectArray objArray) < int resultSum = 0; int len = env->GetArrayLength(objArray); // получаем все объекты в массиве for (int i = 0; i < len; ++i) < jobject obj = (jobject) env->GetObjectArrayElement(objArray, i); resultSum += getFacetCount(env, obj); > return resultSum; >

Примечание: Поскольку мы используем C++, в код нужно добавить extern «C». Это ключевое слово необходимо для того, чтобы сообщать компилятору о том, чтобы он не преобразовывал имена функций, а оставлял их такими, как в реализации. В противном случае во время работы приложения можно столкнуться с исключением «No implementation found».

В результате код test-lib.cpp выглядит следующим образом:

#include extern "C" < int getFacetCount(JNIEnv *env, jobject obj) < jclass cls = env->GetObjectClass(obj); jmethodID methodId = env->GetMethodID(cls, "getFacetCount", "()I"); int result = env->CallIntMethod(obj, methodId); return result; > JNIEXPORT jfloat JNICALL Java_ru_androidtools_ndktest_MainActivity_getMemberFieldFromNative( JNIEnv *env, jobject callingObject, jobject obj) < float result = 0.0f; jclass cls = env->GetObjectClass(obj); jfieldID fieldId = env->GetFieldID(cls, "VertexCoords", "[F"); jobject objArray = env->GetObjectField(obj, fieldId); jfloatArray *fArray = reinterpret_cast(&objArray); jsize len = env->GetArrayLength(*fArray); float *data = env->GetFloatArrayElements(*fArray, 0); for (int i = 0; i < len; ++i) < result += data[i]; >env->ReleaseFloatArrayElements(*fArray, data, 0); return result; > JNIEXPORT jint JNICALL Java_ru_androidtools_ndktest_MainActivity_invokeMemberFuncFromNative( JNIEnv *env, jobject callingObject, jobject obj) < int facetCount = getFacetCount(env, obj); return facetCount; >JNIEXPORT jobject JNICALL Java_ru_androidtools_ndktest_MainActivity_createObjectFromNative( JNIEnv *env, jobject callingObject, jint param) < jclass cls = env->FindClass("ru/androidtools/ndktest/MeshData"); jmethodID methodId = env->GetMethodID(cls, "", "(I)V"); jobject obj = env->NewObject(cls, methodId, param); return obj; > JNIEXPORT jint JNICALL Java_ru_androidtools_ndktest_MainActivity_processObjectArrayFromNative( JNIEnv *env, jobject callingObject, jobjectArray objArray) < int resultSum = 0; int len = env->GetArrayLength(objArray); for (int i = 0; i < len; ++i) < jobject obj = (jobject) env->GetObjectArrayElement(objArray, i); resultSum += getFacetCount(env, obj); > return resultSum; > >

Теперь в коде активности объявим оставшиеся методы и вызовем их. Результат работы выведем в TextView.

public class MainActivity extends AppCompatActivity < static < System.loadLibrary("native-lib"); >public native String stringFromJNI(); public native float getMemberFieldFromNative(MeshData obj); public native int invokeMemberFuncFromNative(MeshData obj); public native MeshData createObjectFromNative(int param); public native int processObjectArrayFromNative(MeshData[] objArray); @Override protected void onCreate(Bundle savedInstanceState) < super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // выводим сообщение из примера исходного файла String msg = stringFromJNI(); // инициализируем объект MeshData в Java-коде и передаем его в методы MeshData obj = new MeshData(3); msg += "\n\nResult getMemberFieldFromNative: " + getMemberFieldFromNative(obj); msg += "\nResult invokeMemberFuncFromNative: " + invokeMemberFuncFromNative(obj); // инициализируем объект MeshData в нативном коде и возвращаем его в Java MeshData obj2 = createObjectFromNative(18); msg += "\n\nResult createObjectFromNative: " + obj2.getFacetCount(); // обрабатываем массив объектов в нативном коде и возвращаем его в Java MeshData[] objArray = new MeshData[] < new MeshData(10), new MeshData(20) >; int arrayRes = processObjectArrayFromNative(objArray); msg += "\n\nResult processObjectArrayFromNative: " + arrayRes; TextView tv = findViewById(R.id.sample_text); tv.setText(msg); > >

Однако написать код исходного файла недостаточно. Если посмотреть на вкладку Project, то можно обнаружить, что там нет файла test-lib.cpp. Исправить это можно, сообщив CMake о его наличии.

Настройка CMake

Теперь, когда мы написали нативный код, нужно добавить test-lib.cpp в CMakeLists.txt, чтобы CMake скомпилировал его в библиотеку. По факту, в файле из примера уже есть весь нужный код, однако там нужно добавить созданный выше исходный файл.

Откроем CMakeLists.txt и найдем там команду add_library().

add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp )

Здесь в параметры передаётся название, которое будет дано скомпилированной библиотеке. После этого нужно указать тип создаваемой библиотеки (STATIC, SHARED или MODULE). Затем идет перечисление файлов, которые нужно скомпилировать.

В списке файлов нужно добавим путь до test-lib.cpp и синхронизируем проект, после чего CMake скомпилирует указанные файлы в библиотеку.

add_library( # Sets the name of the library. native-lib # Sets the library as a shared library. SHARED # Provides a relative path to your source file(s). src/main/cpp/native-lib.cpp src/main/cpp/test-lib.cpp )

В библиотеку можно скомпилировать столько файлов, сколько может потребоваться для работы.

В результате запускаем приложение и видим, что наша нативная библиотека работает.

Настройка Gradle

В случае, если вы добавляете NDK в проект вручную, в build.gradle модуля приложения нужно прописать некоторые команды.

Откроем build.gradle. В defaultConfig нужно добавить externalNativeBuild и указать внутри него флаги следующим образом.

android < compileSdkVersion 27 defaultConfig < applicationId "ru.androidtools.ndktest" minSdkVersion 16 targetSdkVersion 27 versionCode 1 versionName "1.0" externalNativeBuild  cmake  cppFlags "" > > > . >

Здесь перечисляются флаги, о которых мы говорили в начале статьи (поддержка исключений, RTTI). Если никакие флаги не нужны, просто оставляем поле пустым.

Затем нужно передать в Gradle скрипт, по которому CMake будет собирать нативную библиотеку. Для этого внутри android нужно добавить externalNativeBuild и передать в него имя файла скрипта сборки.

android < . externalNativeBuild  cmake  path "CMakeLists.txt" > > >

На этом конфигурация Gradle завершается и можно собирать приложение.

Раздел: Кодинг Метки: Android, apk, c, code, lesson, native, ndk

Использование NDK в своих приложениях : 4 комментария

  1. Тим 20.06.2018 Коллеги, что вы можете сказать про новшество в NDK 17? Убрана поддeржка armeabi, из-за чего получаем ошибку: ABIs [armeabi] are not supported for platform. Supported ABIs are [armeabi-v7a, arm64-v8a, x86, x86_64]. И что странно, из-за этого перестало поддреживаться множество современных девайсов, среди которых Moto G5, которому всего год Для чего убрали поддержку armeabi и есть ли смысл возвращаться на предыдущий NDK?
  1. drink 28.09.2019 Куда уже проще !
  1. женя 23.11.2019 как добавлять классы в этот код с++?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *