Введение в Android NDK
Для разработки приложений под ОС Android, Google предоставляет два пакета разработки: SDK и NDK. Про SDK существует много статей, книжек, а так же хорошие guidelines от Google. Но про NDK даже сам Google мало что пишет. А из стоящих книг я бы выделил только одну, Cinar O. — Pro Android C++ with the NDK – 2012.
Эта статья ориентирована на тех, кто ещё не знаком (или мало знаком) с Android NDK и хотел бы укрепить свои знания. Внимание я уделю JNI, так как мне кажется начинать нужно именно с этого интерфейса. Так же, в конце рассмотрим небольшой пример с двумя функциями записи и чтения файла. Кто не любит много текста, тот может посмотреть видео версию.
Что такое Android NDK?
Android NDK (native development kit) – это набор инструментов, которые позволяют реализовать часть вашего приложения используя такие языки как С/С++.
Для чего используют NDK?
- Нужно увеличить производительность (например, сортировка большого объема данных);
- Использовать стороннюю библиотеку. Например, много уже чего написано на С/С++ языках и нужно просто заиспользовать существующий материал. Пример таких библиотек, как, Ffmpeg, OpenCV;
- Программирование на низком уровне (например, всё что выходит за рамки Dalvik);
Что такое JNI?
Java Native Interface – стандартный механизм для запуска кода, под управлением виртуальной машины Java, который написан на языках С/С++ или Assembler, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это даёт возможность вызова функции С/С++ из программы на Java, и наоборот.
Преимущества JNI
Основное преимущество перед аналогами (Netscape Java Runtime Interface или Microsoft’s Raw Native Interface and COM/Java Interface) является то что JNI изначально разрабатывался для обеспечения двоичной совместимости, для совместимости приложений, написанных на JNI, для любых виртуальных машин Java на конкретной платформе (когда я говорю о JNI, то я не привязываюсь к Dalvik машине, потому как JNI был написан Oracle для JVM который подходит для всех Java виртуальных машин). Поэтому скомпилированный код на С/С++ будет выполнятся в не зависимости от платформы. Более ранние версии не позволяли реализовывать двоичную совместимость.
Двоичная совместимость или же бинарная совместимость – вид совместимости программ, позволяющий программе работать в различных средах без изменения её исполняемых файлов.
Как устроен JNI

JNI таблица, организована как таблица виртуальных функций в С++. VM может работать с несколькими такими таблицами. Например, одна будет для отладки, вторая для использования. Указатель на JNI интерфейс действителен только в текущем потоке. Это значит, что указатель не может гулять с одного потока в другой. Но нативные методы могут быть вызваны из разных потоков. Пример:
jdouble Java_pkg_Cls_f__ILjava_lang_String_2 (JNIEnv *env, jobject obj, jint i, jstring s) < const char *str = (*env)->GetStringUTFChars(env, s, 0); (*env)->ReleaseStringUTFChars(env, s, str); return 10; >
- *env – указатель на интерфейс;
- оbj – ссылка на объект в котором описан нативный метод;
- i and s – передаваемые аргументы;
Локальные и глобальные ссылки
JNI делит ссылки на три типа: локальные, глобальные и слабые глобальные ссылки. Локальные действительны пока не завершиться метод. Все Java объекты которые возвращает функции JNI являются локальными. Программист должен надеется на то что VM сама подчистит все локальные ссылки. Локальные ссылки доступны лишь в том потоке в котором были созданы. Однако если есть необходимость то их можно освобождать сразу методом JNI интерфейса DeleteLocalRef:
jclass clazz; clazz = (*env)->FindClass(env, "java/lang/String"); //ваш код (*env)->DeleteLocalRef(env, clazz);
Глобальные ссылки остаются пока они явно не будут освобождены. Что бы зарегистрировать глобальную ссылку следует вызвать метод NewGlobalRef. Если же глобальная ссылка уже не нужна, то её можно удалить методом DeleteGlobalRef:
jclass localClazz; jclass globalClazz; localClazz = (*env)->FindClass(env, "java/lang/String"); globalClazz = (*env)->NewGlobalRef(env, localClazz); //ваш код (*env)->DeleteLocalRef(env, localClazz);
Обработка ошибок
JNI не проверяет ошибки такие как NullPointerException, IllegalArgumentException. Причины:
- снижение производительности;
- в большинстве функций C библиотек очень и очень трудно защитится от ошибок.
jthrowable ExceptionOccurred(JNIEnv *env);
Например, некоторые функции JNI доступа к массивам не возвращают ошибки, но могут вызвать исключения ArrayIndexOutOfBoundsException или ArrayStoreException.
Примитивные типы JNI
В JNI существуют свои примитивные и ссылочные типы данных.
| Java Type | Native Type | Description |
|---|---|---|
| boolean | jboolean | unsigned 8 bits |
| byte | jbyte | signed 8 bits |
| char | jchar | unsigned 16 bits |
| short | jshort | signed 16 bits |
| int | jint | signed 32 bits |
| long | jlong | signed 64 bits |
| float | jfloat | 32 bits |
| double | jdouble | 64 bits |
| void | void | N/A |
Ссылочные типы JNI

Модифицированный UTF-8
JNI использует модифицированную кодировку UTF-8 для представления строк. Java в свою очередь использует UTF-16. UTF-8 в основном используется в С, потому что он кодирует \u0000 в 0xc0, вместо привычной 0x00. Изменённые строки кодируются так, что последовательность символов, которые содержат только ненулевой ASCII символы могут быть представлены с использованием только одного байта.
Функции JNI
Интерфейс JNI содержит в себе не только собственный набор данных, но и свои собственные функции. На их рассмотрение уйдёт много времени, так как их не один десяток. Ознакомится с ними вы сможете в официальной документации.
Пример использования функций JNI
Небольшой пример, что бы вы усвоили пройденный материал:
#include //. JavaVM *jvm; JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption* options = new JavaVMOption[1]; options[0].optionString = "-Djava.class.path=/usr/lib/java"; vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 1; vm_args.options = options; vm_args.ignoreUnrecognized = false; JNI_CreateJavaVM(&jvm, &env, &vm_args); delete options; jclass cls = env->FindClass("Main"); jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V"); env->CallStaticVoidMethod(cls, mid, 100); jvm->DestroyJavaVM();
- JavaVM – предоставляет интерфейс для вызова функций, которые позволяют создавать и уничтожать JavaVM;
- JNIEnv – обеспечивает большинство функций JNI;
- JavaVMInitArgs – аргументы для JavaVM;
- JavaVMOption – опции для JavaVM;
Потоки
Всеми потоками в Linux управляет ядро, но они могут быть прикреплены к JavaVM функциями AttachCurrentThread и AttachCurrentThreadAsDaemon. Пока поток не присоединён он не имеет доступа к JNIEnv. Важно, Android не приостанавливает потоки которые были созданы JNI, даже если срабатывает GC. Но перед тем как поток завершиться он должен вызвать метод DetachCurrentThread что бы отсоединиться от JavaVM.
Первые шаги

Структура проекта у вас должна выглядеть следующим образом:
Как мы видим из рисунка 3, весь нативный код находится в папке jni. После сборки проекта, в папке libs создастся четыре папки под каждую архитектуру процессора, в которой будет лежать ваша нативная библиотека (количество папок зависит от количество выбранных архитектур).
- В корне проекта нужно создать папку jni, в которую поместить исходники нативного кода;
- Создать файл Android.mk, который будет собирать проект;
- Создать файл Application.mk, в котором описываются детали сборки. Он не является обязательным условием, но позволяет гибко настроить сборку;
- Создать файл ndk-build, который будет запускать процесс сборки (тоже не является обязательным).
Android.mk
Как упоминалось уже выше, это make файл для сборки нативного проекта. Android.mk позволяет группировать ваш код в модули. Модули могут быть как статические библиотеки (static library, только они будут скопированные в ваш проект, в папку libs), разделяемые библиотеки (shared library), автономный исполняемый файл (standalone executable).
Пример минимальной конфигурации:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := NDKBegining LOCAL_SRC_FILES := ndkBegining.c include $(BUILD_SHARED_LIBRARY)
- LOCAL_PATH := $(call my-dir) – функция call my-dir возвращает путь папки в которой вызывается файл;
- include $(CLEAR_VARS) – очищает переменные которые использовались до этого кроме LOCAL_PATH. Это необходимо так как все переменные являются глобальными, потому что сборка происходит в контексте одного GNU Make;
- LOCAL_MODULE – имя выходного модуля. В нашем примере имя выходной библиотеки установлено как NDKBegining, но после сборки в папке libs создадутся библиотеки с именами libNDKBegining. Android добавляет к названию префикс lib, но в java коде при подключении вы должны указывать название библиотеки без префикса (то есть названия должны совпадать с установленными в make файлах);
- LOCAL_SRC_FILES – перечисление исходных файлов из которых следует создать сборку;
- include $(BUILD_SHARED_LIBRARY) – указывает тип выходного модуля.
MY_SOURCE := NDKBegining.c Что бы обратится к переменной: $(MY_SOURCE) Переменные, так же можно конкатенировать, например: LOCAL_SRC_FILES += $(MY_SOURCE)
Application.mk
- APP_OPTIM – дополнительная переменная которая устанавливается в значения release или debug. Используется для оптимизации при сборке модулей. Отлаживать можно как release так и debug, но debug предоставляет больше информации для отладки;
- APP_BUILD_SCRIPT – указывает на альтернативный путь к Android.mk;
- APP_ABI – наверное одна из самых важных переменных. Она указывает для какой архитектуры процессоров собирать модули. По умолчанию стоит armeabi которая соответствует ARMv5TE архитектуры. Например для поддержки ARMv7 следует использовать armeabi-v7a, для IA-32 – x86, для MIPS – mips, или если вам нужно поддерживать все архитектуры то значение должно быть таким: APP_ABI := armeabi armeabi-v7a x86 mips. Если вы использует ndk версии 7 и выше, то можно не перечислять все архитектуры, а установить так APP_ABI := all.
- APP_PLATFORM – таргет платформы;
- APP_STL – Android использует runtime библиотеку libstdc++.so которая является урезанной и разработчику доступен не весь функционал С++. Однако, переменная APP_STL позволяет включить в сборку поддержку расширений;
- NDK_TOOLCHAIN_VERSION – позволяет выбрать версию компилятора gcc (по умолчанию 4.6);
NDK-BUILDS
- clean – очищает все сгенеренные бинарные файлы;
- NDK_DEBUG=1 – генерирует отладочный код;
- NDK_LOG=1 – показывает лог сообщений (используется для отладки);
- NDK_HOST_32BIT=1 – Android имеет средства для поддержки 64-х битных версий утилит (например NDK_PATH\toolchains\mipsel-linux-android-4.8\prebuilt\windows-x86_64 и т.д.);
- NDK_APPLICATION_MK — указывается путь к Application.mk.
По умолчанию устанавливается поддержка 64-х разрядной версии утилит, но вы можете принудительно собрать только для 32-х установив флаг NDK_HOST_32BIT=1. Google, рекомендует всё же использовать 64-х разрядность утилит для повышения производительности больших программ.
Как собрать проект?
Раньше это было мучением. Нужно было установить CDT плагин, скачать компилятор cygwin или mingw. Скачать Android NDK. Подключить это всё в настройках Eclipse. И как на зло это всё оказывалось не рабочим. Я первый раз когда столкнулся с Android NDK, то настраивал это всё 3 дня (а проблема оказалось в том что в cygwin нужно было дать разрешение 777 на папку проекта).
Сейчас с этим всё намного проще. Идёте по этой ссылке. Качаете Eclipse ADT Bundle в котором уже есть всё то что необходимо для сборки.
Вызов нативных методов из Java кода
Для того что бы использовать нативный код из Java вам сперва следует определить нативные методы в Java классе. Например:
native String nativeGetStringFromFile(String path) throws IOException; native void nativeWriteByteArrayToFile(String path, byte[] b) throws IOException;
Перед методом следует поставить зарезервированное слово «native». Таким образом компилятор знает, что это точка входа в JNI. Эти методы нам нужно реализовать в С/С++ файле. Так же Google рекомендует начинать именовать методы со слова nativeХ, где Х – реальное название метода. Но перед тем как реализовывать эти методы вручную, следует сгенерировать header файл. Это можно сделать вручную, но можно использовать утилиту javah, которая находится в jdk. Но пойдём дальше и не будет использовать её через консоль, а будем это делать при помощи стандартных средств Eclipse.
Теперь можете запускать. В директории bin/classes будут лежать ваши header файлы.
Далее копируем эти файлы в jni директорию нашего нативного проекта. Вызываем контекстное меню проекта и выбираем пункт Android Tools – Add Native Library. Это позволит нам использовать jni.h функции. Дальше вы уже можете создавать cpp файл (иногда Eclipse его создаёт по умолчанию) и писать тела методов, которые уже описаны в header файле.
Пример кода я не стал добавлять в статью, чтобы не растягивать её. Пример вы можете посмотреть/скачать с github.
- программирование на android
- android ndk
- jni
Настройка Android SDK
Прежде чем вы сможете запустить написанный код на Android-устройстве, нужно выполнить несколько простых действий. Это относится как к работе с Unity, так и к созданию приложений с нуля.
1. Скачать Android SDK
Зайдите на страницу Android Developer SDK. Скачайте архив с последней версией Android SDK и распакуйте его.
2. Установить Android SDK
Следуйте инструкциям на странице Installing the SDK (причём, вы можете свободно пропустить опциональные части, относящиеся к Eclipse). В шаге 4 руководства Installing the SDK убедитесь, что добавили как минимум одну Android platform (Android платформу) с уровнем API равным или выше 9 (платформа 2.3 или выше), Platform Tools и USB drivers (USB драйверы), если вы используете Windows.
3. Удостовериться, что система определяет ваше устройство
Это может быть не так просто, особенно на Windows системах, в которых драйвера часто бывают источником проблем. Также, с вашим устройством может идти дополнительная информация или особые драйверы от производителя.
Для Windows: если Andoid устройство автоматически определяется системой, вам все равно придётся обновить драйверы на те, который поставляются с Android SDK. Это делается через диспетчер устройств Windows. —>Если устройство не определяется автоматически, используйте драйверы из Android SDK или особые драйверы, предоставленные производителем. —>Дополнительную информацию можно найти здесь: USB Drivers for Windows
Для Mac: если вы разрабатываете на OSX, тогда обычно не требуется никаких дополнительных драйверов.
Важно: Не забудьте включить “Отладку по USB” на вашем устройстве. Перейдите в Настройки -> Параметры разработчика , для включения отладки по USB. Начиная с Android Jelly Bean 4.2, параметры разработчика по умолчанию скрыты. Для их включения, понажимайте несколько раз пальцем на строку в меню Настройки -> Об устройстве -> Номер сборки . После этого вам станет доступен пункт Настройки -> Параметры разработчика .
Если вы не уверены, что ваше устройство корректно установилось в системе, пожалуйста, прочтите страницу Решение проблем при разработке под Android для дополнительной информации.
4. Добавить путь до Android SDK в Unity
При первой сборке проекта под Android (или если Unity не сможет обнаружить SDK), вас попросят указать местоположение папки, в которую вы установили Android SDK (вы должны выделить корневую папку установленного SDK). Путь до Android SDK также можно изменить в редакторе, выбрав в меню Unity > Preferences и перейдя в раздел External Tools окна настроек.
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

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 минут в зависимости от характеристик ПК. Для корректной установки необходимо:

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

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

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

Чтобы произвести начальную настройку программного обеспечения, необходимо:
- Запустить установленный софт SDK от имени администратора. После запуска программы высветится приветственное окно, в котором можно быстро создать проект.
- Выбрать заголовок Create New Project и нажать на понравившийся шаблон (Activity). Можно работать с нуля или редактировать готовый проект. Activity отвечает за логику экрана приложения. Лучше установить либо No Activity, либо Empty Activity.
- Указать в появившемся окне настроек название проекта и пакета. Если в планах публикация в 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. Центр карьеры поможет с резюме и подготовкой к собеседованию. Программа подойдет для новичков

Статьи по теме:
Плюсы и минусы обеих платформ, сколько зарабатывают мобильные разработчики и как освоить специальность с нуля
Setting Up Android SDK and NDK

How to set up your Android development environment for Unreal Engine
On this page
- Recommended Setup
- 1. Install Android Studio
- 2. Set Up Android Studio for First-Time Use
- 3. Set up Command-Line Tools for Android
- 4. Finalize the Android Studio Installation on Your OS
- 5. Set Up Android NDK
- How to Manually Target SDK Paths
Choose your operating system:
Unreal Engine uses the Android Software Development Kit (SDK) distributed with Android Studio for all essential Android development components, including the Android Native Development Kit (NDK). This page provides a walkthrough for setting up Android Studio and ensuring that Unreal Engine recognizes these components correctly, and some troubleshooting tips for managing NDK installations and earlier engine builds.
Due to an update to the Android SDK Command-line Tools in February 2023, users on Unreal Engine 4.27 through 5.1 need to edit the SetupAndroid script used in this tutorial. If you are experiencing problems with NDK setup, refer to the section on setting up Command-Line Tools for Android for more details.
Recommended Setup
Make sure that Unreal Editor and the Epic Games Launcher are both closed to ensure that there are no problems with either the installation of NDK components or setting your environment variables for the engine.
If you need to support an earlier installation of Unreal Engine refer to the section on Manually Targeting SDK Paths . You can find the needed NDK version for your version of Unreal Engine in the Android Development Requirements page.
1. Install Android Studio
Before setting up the required SDK and NDK components on your computer, you need to install Android Studio.
Refer to Android Development Requirements for information about which Android Studio and NDK versions are compatible with your current version of Unreal Engine.
- Navigate to the Android Studio Archive in your web browser. Scroll down to Android Studio 4.0, click to unfold the dropdown, and download the appropriate installer or zip file for your operating system.

Click image for full size.

Click image for full size.

Click image for full size.

Click image for full size.
If you choose a custom install location, SetupAndroid.bat will not be able to find files unless you edit it first. We highly recommend keeping the default installation location.

Click image for full size.

Click image for full size.
2. Set Up Android Studio for First-Time Use
When you start your new install of Android Studio for the first time, follow these steps:

-
When the Import Android Studio Settings dialog appears, select do not import settings, then click OK to continue.

Click image for full size.

Click image for full size.

Click image for full size.

Click image for full size.

Click image for full size.

Click image for full size.

Click image for full size.

Click image for full size.
If you do not use the default SDK path, it is possible for SetupAndroid.bat to fail during a later step, as it will be unable to locate needed files.
3. Set up Command-Line Tools for Android
Unreal Engine’s Android SDK setup depends on Command-Line Tools for Android version 8.0 . Before moving on to finalize the installation, you need to make sure this version is installed and that UE’s SetupAndroid script is targeting it correctly.
Originally, the SetupAndroid script targeted the Latest version, which referred to 8.0 . Due to an update in February 2023, Latest now refers to 9.0 , and you will need to re-target 8.0 manually if you are using a version of Unreal Engine that depends on it. This is required for UE 4.27, 5.0, and 5.1. The steps below take this into account and will walk you through fixing the SetupAndroid script.
- In the Welcome to Android Studio dialog, you will see a prompt in the lower-right corner asking to update your Android Studio to the latest version. Hover over it and dismiss it without updating. This will reveal the Configure and Get Help dropdowns.
- Open the Configure dropdown and click SDK Manager.

Click image for full size.

Click image for full size.

Click image for full size.
set SDKMANAGER=%STUDIO_SDK_PATH%\cmdline-tools\latest\bin\sdkmanager.bat
Replace the directory latest with 8.0 . It should read as follows:
set SDKMANAGER=%STUDIO_SDK_PATH%\cmdline-tools\8.0\bin\sdkmanager.bat
4. Finalize the Android Studio Installation on Your OS
After completing all of the above steps, you need to finalize your installation to make sure your environment is fully set up before proceeding. Each operating system requires a different step to finalize installation.
Restart your computer.
Close your terminal window and reopen it.
Either close your terminal window and reopen it, or log out and log back in.
5. Set Up Android NDK
With the necessary Android SDK components installed, you can use the SetupAndroid script to download and install the appropriate version of Android NDK.
- Open the Engine/Extras directory and run the appropriate SetupAndroid script for your operating system. SetupAndroid.bat is for Windows, SetupAndroid.command is for Mac, and SetupAndroid.sh is for Linux.
- The script prompts you to accept the Android SDK license agreement. Type Y and press Enter to accept.

Click image for full size.
The install directory for NDK should be C:/Users/[Username]/AppData/Local/Android/SDK/ndk/, where «username» is your login name for your computer. You should see a folder containing the required NDK version in this location.
How to Manually Target SDK Paths
If you followed the instructions above without encountering problems, Unreal Engine will automatically associate the SDK paths for the Android SDK, the current Android NDK version, and the Java Development Kit (JDK). However, if you are using an earlier version of the Unreal Engine alongside Android Studio, you may need to manually target your SDK paths to be compatible. This is most likely to be the case if you have an installation of Unreal Engine alongside an earlier version that used CodeWorks.
Do not install CodeWorks and Android Studio at the same time, otherwise you will receive errors. If you need to support an earlier version of Unreal Engine alongside 4.25 or later, use the Android Studio setup in this document, then follow the instructions in this section to target the path for the version of Android Studio you need.
You can find the SDK paths by opening Edit > Project Settings, navigating to the Platforms > Android > Android SDK section.

When these fields are left blank, they fall back on a set of default paths used by the installation process in the previous sections. If you have multiple installations of these components, or have installed them in non-standard directories, you can manually provide their paths here. Alternatively, you can open BaseEngine.ini and provide them under the [/Script/AndroidPlatformEditor.AndroidSDKSettings] section.
[/Script/AndroidPlatformEditor.AndroidSDKSettings] SDKPath = (Path="C:\Filepath") NDKPath = (Path="C:\Filepath") JDKPath = (Path="C:\Filepath")
If the entries for SDKPath , NDKPath , and JDKPath do not exist in your BaseEngine.ini , they will use the default path to the Android home directory.