Оригинал: Why should you need to pick Android NDK for your next project
Автор: Harigovind Thoyakkat
Дата публикации: 28 марта 2017 г.
Перевод: А.Панин
Дата перевода: 28 апреля 2017 г.

Android NDK (Native Development Kit) является очень популярным инструментарием, используемым для разработки приложений для мобильных устройств. Многие приложения из магазина приложений Android Market используют компоненты, разработанные с использованием языков программирования, отличных от Java, для достижения максимальной производительности. Исходя из этого NDK является инструментарием, помогающим разработчикам создавать компоненты для своих приложений с использованием компилируемых языков программирования для различных целей, начиная с достижения оптимальной производительности и заканчивая упрощением используемого кода.
Для чего и как используется бинарный код
Мы все знаем о том, что процесс разработки приложений для Android тесно связан с использованием языка программирования Java, а также о том, что использование данного языка программирования значительно упрощает жизнь разработчиков, ведь они могут использовать элегантную объектно-ориентированную модель Java. Приложения или алгоритмы, реализованные на языке Java, преобразуются в специальный байткод, который выполняется аналогичным образом на всех поддерживаемых платформах. При этом виртуальная машина Java или JVM (Java Virtual Machine) ответственная за JIT-компиляцию и исполнение байткода Java, доступна практически для всех существующих платформ, начиная с мэйнфреймами и заканчивая мобильными телефонами.
Однако, в случае системы Android, которая используется главным образом на смартфонах и планшетных компьютерах, ключевым фактором становится достижение максимальной производительности приложения на используемом аппаратном обеспечении. Исходный код Java, как говорилось выше, предварительно преобразуется в байткод. Это именно тот байткод, который исполняется с небольшими отличиями на платформах, для которых доступна виртуальная машина Java. В конце концов все приложение исполняется в рамках виртуальной машины на устройстве, работающем под управлением Android.
Что касается разработки приложений для Android, описанный выше фактор является незначительным недостатком. Но программирование на языке Java может оказаться достаточно сложным ввиду постоянного усложнения кода и затруднения его понимания. Более того, использование мультиплатформенного байткода и виртуальной машины обуславливает значительные затраты вычислительных ресурсов устройства.
Другим важным фактором, который требует внимания, является мультиплатформенный код. Если нам нужно создать программу для множества аппаратных платформ, мы можем переписать большую часть кода, относящегося к контроллеру и отображению, для каждой из платформ, что является не самым разумным решением. Но весь код, относящийся к контроллеру, должен быть обязательно портирован на языки C и C++, так, как практически все мобильные платформы поддерживают их; таким образом, если нам удастся реализовать логику в рамках библиотек на языках C и C++ и впоследствии использовать ее на нескольких платформах, нам удастся максимально сократить потери производительности приложения. В подобных случаях мы будем использовать код на языках C и C++ вместе с привычным кодом на языке Java или "мультиплатформенным кодом".
При использовании компилируемого языка программирования исходный код компилируется непосредственно в машинный код для центрального процессора, а не в промежуточное представление, такое, как в языке Java. Таким образом разработчики приложений могут создавать приложения с оптимальной производительностью для различных Android-устройств. Фрагменты компилируемого кода могут быть структурированы в рамках одной разделяемой библиотеки, функции из которой могут вызываться из кода на языке Java. Отдельная разделяемая библиотека должна создаваться для каждой из поддерживаемых архитектур центральных процессоров. Большая часть ее исходного кода при этом может оставаться неизменной. Скомпилированные разделяемые библиотеки должны быть добавлены в файл .apk вашего приложения. С учетом всего вышесказанного, фундаментальная модель приложений Android не изменится.
Использование Android NDK
Android NDK является инструментарием, позволяющим реализовывать части приложения для Android на таких компилируемых языках программирования, как C и C++ и содержит библиотеки для управления активностями и доступа к физическим компонентам устройства, таким, как различные сенсоры и дисплей.
Android NDK интегрирован с инструментами из набора компонентов для разработки программного обеспечения (Android SDK), а также с интегрированной средой разработки Android Studio или устаревшей средой разработки Eclipse ADT. Однако, NDK не может использоваться отдельно.
Принцип работы Android NDK
Сердцем пакета Android NDK является сценарий ndk-build , который отвечает за автоматический обход файлов проекта Android (разработка каждого нового приложения для Android с помощью интегрированной среды разработки, такой, как Android Studio или Eclipse начинается с создания файлов нового проекта) и собирает информацию о том, какие компоненты нужно компилировать. Данный сценарий также ответственен за генерацию бинарных файлов и копирование этих бинарных файлов в директорию файлов проекта приложения.
Мы можем использовать ключевое слово native для того, чтобы компилятор знал, что данный фрагмент реализован в рамках компилируемого кода. Например:
Также в процессе сборки проекта создаются разделяемые библиотеки (Native Shared Libraries, с расширением .so ) и статические библиотеки (Native Shared Libraries, с расширением .a ), которые могут связываться с другими библиотеками. Бинарный интерфейс приложения (Application Binary Interface, ABI) использует разделяемые библиотеки с расширением .so для исполнения машинного кода в системе в процессе работы приложения.
Весь компилируемый код исполняется посредством интерфейса под названием Java Native Interface (JNI), который позволяет связать друг с другом компоненты на языках Java и C/C++.
Для сборки проекта с помощью сценария ndk-build нам придется создать два файла: Android.mk и Application.mk . Оба этих файла должны размещаться в директории JNI . Файл Android.mk описывает модуль и его имя, флаги сборки, используемые библиотеки файлы исходного кода, которые должны компилироваться, а файл Application.mk — бинарные модули, необходимые для работы приложения.
Установка и использование Android NDK в Ubuntu
Android NDK поставляется в формате самораспаковывающегося архива. По этой причине нам придется лишь установить бит исполнения и распаковать его:
В результате компоненты NDK будут сохранены в текущей рабочей директории.
Распаковка в ручном режиме
Ввиду того, что файл с расширением .bin является ничем иным, как самораспаковывающимся архивом формата 7-Zip, мы можем извлечь его содержимое вручную с помощью следующей команды:
Пакет с компонентами архиватора 7-Zip доступен из официального репозитория Ubuntu и может быть установлен, к примеру, с помощью команды apt-get:
Установка с помощью Android Studio
Мы можем установить Android NDK с помощью компонента SDK Manager непосредственно из Android Studio.
Для этого после открытия проекта следует осуществить переход в рамках главного меню окна Tools > Android > SDK Manager . После этого нужно установить флажки напротив названий компонентов LLDB , CMake и NDK . Далее нужно просто применить изменения с помощью соответствующей кнопки.
Создание или импорт проекта с бинарными компонентами
После настройки Android Studio мы можем создать новый проект с поддержкой языков программирования C/C++. Однако, если нам понадобится добавить или импортировать существующий код на этих языках в проект Android Studio, мы будем вынуждены выполнить описанные ниже действия.
Для начала следует создать новые файлы исходного кода с использованием упомянутых языков программирования и добавить их в проект, открытый в Android Studio. Мы можем пропустить этот шаг, если в проекте уже имеются подобные файлы или нам нужно импортировать в него предварительно скомпилированную библиотеку.
Сценарий сборки CMake позволяет сообщить одноименной системе сборки о том, как нужно осуществлять компиляцию файлов исходного кода и сборку результирующей бинарной библиотеки. Этот файл также необходим для импорта и связывания с нашей библиотекой существующих или поставляемых в комплекте NDK библиотек. Мы также можем без каких-либо последствий пропустить данный шаг в том случае, если в комплекте поставки нашей существующей бинарной библиотеки уже содержится файл сценария сборки CMakeLists.txt или она использует компонент ndk-build и в ее комплекте поставки содержится файл сценария сборки Android.mk .
Далее следует сообщить Gradle о существовании нашей бинарной библиотеки путем указания пути к файлу сценария сборки CMake или ndk-build . Gradle использует указанный сценарий сборки для импорта исходного кода в проект Android Studio и упаковки результирующей бинарной библиотеки (файла с расширением .so ) в файл пакета формата APK.
Важное замечание: если в рамках проекта используется устаревший инструмент ndkCompile , нам придется открыть файл build.poperties и удалить из него следующую строку кода перед настройкой Gradle с целью использования CMake или ndk-build:
Теперь мы можем собрать и выполнить наше приложение путем нажатия на кнопку Run . Gradle будет рассматривать процесс CMake или ndk-build в качестве зависимости, которая должна быть собрана, осуществлять сборку бинарной библиотеки и упаковывать ее в файл пакета формата APK.
После запуска приложения на устройстве или в эмуляторе мы сможем использовать функции различных интегрированных сред разработки, таких, как Android Studio, для его отладки.
Все это свидетельствует о важности Android NDK для разработчиков приложений для платформы Android. Например, данный набор программных компонентов позволяет создателям игровых движков лучше оптимизировать версии своих продуктов для Android, в результате чего они будут выдавать более впечатляющие графические эффекты, затрачивая на них меньше системных ресурсов.
Процесс создания простого приложения на основе Android NDK не связан с какими-либо сложностями. Однако, каждому разработчику следует уяснить один важный момент: набор программных компонентов Android NDK разрабатывался для использования в определенных случаях и не должен применяться при разработке любых приложений.
Android NDK может как помочь в процессе разработки приложения, так и максимально осложнить его. Не является тайной и то, что использование бинарного кода на платформе Android в некоторых случаях не приводит к заметному повышению производительности приложения (хотя в большинстве случаев его производительность все же повышается), но при этом оно в любом случае усложняет его код. Обычно повышение производительности приложений достигается благодаря задействованию кода со специфичными для используемого центрального процессора инструкциями. Но в общем случае рекомендуется использовать NDK лишь тогда, когда производительность приложения является критически важным параметром, а не тогда, когда разработчику удобнее писать код на языках C/C++.
В качестве заключения следует сказать о том, что не существует незыблемых правил, регламентирующих возможные случаи использования NDK, поэтому вам всегда стоит обращаться к своими знаниям, опыту и интуиции.
Я хочу знать о NDK. Что такое Android NDK (собственный набор для разработки)? Как его можно использовать? Зачем его использовать?
NDK (Native Development Kit) – это инструмент, который позволяет вам программировать на C / C ++ для устройств Android. Он предназначен для интеграции с SDK (он описан как «инструмент компаньона») и используется только для важных для производительности частей проекта. См. Здесь дополнительную информацию.
NDK может повысить производительность приложений. Это обычно справедливо для многих приложений, связанных с процессором. Многие мультимедийные приложения и видеоигры используют собственный код для задач, требующих больших ресурсов. Улучшения производительности могут исходить из трех источников. Во-первых, собственный код компилируется в двоичный код и запускается непосредственно в ОС, а Java-код транслируется в байт-код Java и интерпретируется с помощью виртуальной машины Dalvik Virtual Machine (VM) . В Android 2.2 или выше компилятор Just-In-Time (JIT) добавляется в Dalvik VM для анализа и оптимизации байт-кода Java во время работы программы (например, JIT может скомпилировать часть байтового кода для Двоичный код перед его исполнением). Но во многих случаях собственный код по-прежнему работает быстрее, чем Java-код.
Java-код запускается Dalvik VM на Android. Dalvik VM специально разработан для систем с ограниченными аппаратными ресурсами (объем памяти, скорость процессора и т. Д.).
Вторым источником повышения производительности в NDK является то, что собственный код позволяет разработчикам использовать некоторые функции процессора, недоступные в Android SDK, такие как технология NEON, технология множественных данных с одной инструкцией (SIMD) , позволяющая обрабатывать несколько элементов данных в параллели. Одним конкретным примером задачи кодирования является преобразование цвета для видеофрагмента или фотографии. Предположим, мы должны преобразовать фотографию 1920×1280 пикселей из цветового пространства RGB в цветовое пространство YCbCr. Наивный подход – применить формулу преобразования к каждому пикселю (то есть более двух миллионов пикселей). С помощью NEON мы можем обрабатывать несколько пикселей одновременно, чтобы сократить время обработки.
Третий аспект заключается в том, что мы можем оптимизировать критический код на уровне сборки, что является обычной практикой в разработке настольных программ.
Недостаток
NDK не может напрямую обращаться к множеству API-интерфейсов, доступных в Android SDK, а разработка в NDK всегда будет вводить дополнительную сложность в ваше приложение.
Android NDK – это вспомогательный инструмент, используемый только в сочетании с Android SDK, который позволяет разработчикам приложений создавать критически важные части своих приложений с помощью собственного (C / C ++) кода.
Это обеспечивает преимущества в виде повторного использования существующего кода и увеличения скорости.
Пожалуйста, перейдите по ссылкам ниже.
Android NDK – это вспомогательный инструмент для Android SDK, который позволяет создавать критически важные для ваших приложений части в собственном коде. Он предоставляет заголовки и библиотеки, которые позволяют создавать операции, обрабатывать ввод пользователей, использовать аппаратные датчики, получать доступ к ресурсам приложений и т. Д. При программировании на C или C ++ . Если вы пишете собственный код, ваши приложения по-прежнему будут упакованы в файл .apk, и они все равно будут работать внутри виртуальной машины на устройстве. Основная модель приложений для Android не меняется.
Следующие ссылки также отвечают на ваш вопрос:
Когда разрабатывать собственный код
Как создать приложение NDK
Как работать с NDK
10 советов для Android NDK
Android NDK – это набор инструментов, который позволяет внедрять компоненты, которые используют собственный код в приложениях Android.
Приложения Android запускаются на виртуальной машине Dalvik. NDK позволяет реализовать части ваших приложений, используя языки родного кода, такие как C и C ++. Это может обеспечить преимущества для определенных классов приложений в виде повторного использования существующего кода, а в некоторых случаях и увеличения скорости.
Android NDK – это вспомогательный инструмент для Android SDK, который позволяет создавать критически важные для ваших приложений части в собственном коде. Он предоставляет заголовки и библиотеки, которые позволяют создавать операции, обрабатывать ввод пользователей, использовать аппаратные датчики, получать доступ к ресурсам приложений и т. Д. При программировании на C или C ++. Если вы пишете собственный код, ваши приложения по-прежнему будут упакованы в файл .apk, и они все равно будут работать внутри виртуальной машины на устройстве. Основная модель приложений для Android не меняется.
NDK – это набор инструментов, который позволяет вам реализовать части вашего приложения, используя языки родного кода, такие как C и C ++ …. Оформить заказ https://developer.android.com/tools/sdk/ndk/index.html
NDK – это всего лишь набор инструментов, который позволяет вам писать коды C / C ++ для вашего приложения. Например, предположим, что вы хотите добавить критическую функцию / производительность в свое приложение, и вы хотите записать его в C / C ++, затем затмить или любой другой IDE не позволит вам писать ваш C / C ++, и в этом случае вы должны использовать NDK и интегрировать его в свое приложение.
What is the Android NDK (native development kit) ? How can one use it? Why should one use it?


8 Answers 8
The NDK (Native Development Kit) is a tool that allows you to program in C/C++ for Android devices. It’s intended to integrate with the SDK (it’s described as a "companion tool") and used only for performance-critical portions of a project. See here for more information.

NDK may improve application performance. This is usually true for many processor-bound applications. Many multimedia applications and video games use native code for processor-intensive tasks. The performance improvements can come from three sources. Firstly, the native code is compiled to a binary code and run directly on OS, while Java code is translated into Java byte-code and interpreted by Dalvik Virtual Machine (VM). At Android 2.2 or higher, a Just-In-Time (JIT) compiler is added to Dalvik VM to analyze and optimize the Java byte-code while the program is running (for example, JIT can compile a part of the byte-code to binary code before its execution). But in many cases, native code still runs faster than Java code.
Java code is run by Dalvik VM on Android. Dalvik VM is specially designed for systems with constrained hardware resources (memory space, processor speed, and so on).
The second source for performance improvements at NDK is that native code allows developers to make use of some processor features that are not accessible at Android SDK, such as NEON, a Single Instruction Multiple Data (SIMD) technology, allowing multiple data elements to be processed in parallel. One particular coding task example is the color conversion for a video frame or a photo. Suppose we are to convert a photo of 1920×1280 pixels from the RGB color space to the YCbCr color space. The naive approach is to apply a conversion formula to every pixel (that is, over two million pixels). With NEON, we can process multiple pixels at one time to reduce the processing time.
The third aspect is that we can optimize the critical code at an assembly level, which is a common practice in desktop software development.
Disadvantage
NDK cannot access lots of APIs available in the Android SDK directly, and developing in NDK will always introduce extra complexity into your application.






