Ndk android studio установка

Интеграция Android Studio, Gradle и NDK

Интегрируем .so файлы в APK

Если вы используете Android Studio, то для интеграции нативных библиотек в приложение раньше было необходимо применение различных сложных способов, включая maven и пакеты .aar/.jar … Хорошая новость состоит в том, что теперь этого уже не требуется.

Вам только требуется положить .so библиотеки в каталог jniLibs в поддиректории, названные соответственно каждой поддерживаемой ABI (x86, mips, armeabi-v7a, armeabi) – и всё! Теперь все файлы .so будут интегрированы в APK во время сборки:

Если название папки jniLibs вас не устраивает, вы можете задать другое расположение в build.gradle:

Строим один APK на архитектуру и добиваемся успеха!

Построить один APK на архитектуру очень просто с использованием свойства abiFilter.
По умолчанию ndk.abiFilter(s) имеет значение all. Это свойство оказывает влияние на интеграцию .so файлов, а также на обращения к ndk-build (мы поговорим об этом в конце поста).
Давайте внесем некоторые архитектурные особенности (конфигурации) в build.gradle:

А затем синхронизируем проект с файлами gradle:

Теперь вы можете наслаждаться новыми возможностями, выбирая желаемые варианты сборки:

Каждый из этих вариантов даст вам APK для выбранной архитектуры:

Полный (Release|Debug) APK будет все еще содержать все библиотеки, как и стандартный пакет, упомянутый в начале этого поста.

Но не прекращайте читать на этом месте! Архитектурно-зависимые APK удобны при разработке, но если вы хотите залить несколько из них в Google Play Store, вам необходимо установить различный versionCode для каждого. Сделать это с помощью новейшей системы сборки очень просто.

Автоматически устанавливаем различные коды версий для ABI-зависимых APK

Свойство android.defaultConfig.versionCode отвечает за versionCode для вашего приложения. По умолчанию оно установлено в -1 и, если вы не измените это значение, будет использован versionCode, указанный в файле AndroidManifest.xml.
Поскольку мы хотим динамически изменять наш versionCode, сначала необходимо указать его внутри build.gradle:

Однако все еще возможно хранить эту переменную в AndroidManifest.xml, если вы получаете ее «вручную» перед изменением:

Теперь вы можете использовать versionCode с различными модификаторами:

Здесь мы поставили префикс 6 для x86, 4 для mips, 2 для ARMv7 и 1 для ARMv5.

Работа с ndk в Android Studio

Если в исходниках проекта есть папка jni, система сборки попытается вызвать ndk-build автоматически.
В текущей реализации ваши Android.mk мейкфайлы игнорируются, вместо них создается новый на лету. Это действительно удобно для небольших проектов (вам больше вообще не требуются .mk файлы!), но в больших может раздражать, если вам требуются все возможности, предоставляемые мейкфайлами. Существует возможность отключить это свойство в build.gradle:

Читайте также:  Телефоны реалми которые получат андроид 11

Если вы хотите использовать генерируемый на лету мейкфайл, вы можете настроить его изначально, установив свойство ndk.moduleName, например, так:

Вы также можете установить другие свойства ndk:

  • cFlags,
  • ldLibs,
  • stl (т.е.: gnustl_shared, stlport_static …),
  • abiFilters (т.е.: «x86», «armeabi-v7a»).

Генерация отладочного APK достигается заданием значения true для свойства android.buildTypes.debug.jniDebugBuild; в этом случае ndk-build будет передано NDK_DEBUG=1.
Если вы используете RenderScript из NDK, вам потребуется установить значение true для свойства defaultConfig.renderscriptNdkMode.
Если вы доверяете авто-генерируемым мейкфайлам, то можете задавать различные cFlags в зависимости от конечной архитектуры, когда вы собираете многоархитектурные APK. Так что если вы хотите полностью довериться gradle, мы рекомендуем генерировать различные APK для архитектур, используя ранее описанные модификаторы конфигурации:

Мой пример файла .gradle

Соединяя все вместе, привожу файл build.gradle, который сам сейчас использую. В нем нет модификаторов для различных поддерживаемых ABI, он не использует интеграцию с ndk-build, поэтому работает в Windows окружении и не требует ни изменения обычных мест расположения исходников и библиотек, ни содержимого моих .mk файлов.

Устранение неисправностей

NDK не сконфигурирован

Если вы получаете ошибку:

Это означает, что инструменты не найдены в каталоге NDK. Имеется два выхода: установить переменную ANDROID_NDK_HOME в соответствии с вашим каталогом NDK и удалить local.properties или же установить ее вручную внутри local.properties:

Не существует правила для создания цели

Если вы получаете ошибку:

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

Прочие вопросы

Вы, возможно, сможете найти ответы на интересующие вас вопросы в google группе adt-dev.

Получение информации по интеграции NDK

Лучшее место для нахождения более подробной информации – официальная страница проекта.
Посмотрите на список изменений и, если пролистаете его целиком, найдете примеры проектов, связанных с интеграцией NDK, внутри самых свежих архивов gradle-samples-XXX.zip.

На видео ниже показано, как настроить проект с исходниками NDK из Android Studio.

Источник

Как начать работу с Native Development Kit от Android

С запуском Android Studio 2.2 разработка приложений для Android, содержащих код на C ++, стала проще, чем когда-либо. В этом уроке я покажу вам, как использовать набор Native Development Kit для Android, который обычно называют NDK, для создания собственной библиотеки C ++, функции которой доступны для классов Java.

Предпосылки

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

1. Зачем писать собственный код?

Как правило, вы должны разработать приложение для Android, используя только Java. Добавление кода на C ++ значительно увеличивает его сложность и снижает его переносимость. Тем не менее, вот несколько причин, по которым вы все равно хотите это сделать:

  • Чтобы максимизировать производительность: вы можете повысить производительность приложения для Android, хотя и незначительно, путем внедрения части бизнес-логики на процессоре на C ++.
  • Для использования высокопроизводительных API-интерфейсов: реализация спецификаций API, таких как Vulkan Graphics и OpenSL ES, является частью NDK. Поэтому разработчики Android-игр, как правило, используют NDK.
  • Использовать популярные библиотеки C / C ++: существует множество библиотек C и C ++, которые не имеют эквивалентов Java. Если вы хотите работать с ними в своем приложении для Android, использование NDK — это ваше решение.
  • Повторное использование кода: до тех пор, пока код, написанный на C ++, не содержит зависимостей от конкретной платформы, он может использоваться как в приложениях Android, так и в iOS, как правило, с минимальными изменениями. Если вы разрабатываете большое приложение и собираетесь поддерживать как платформы iOS, так и Android, использование C ++ может повысить вашу производительность.
Читайте также:  Самсунг андроид модели планшет

2. Создание нового проекта

В Android Studio 2.2 или выше мастер создания проектов позволяет быстро создавать новые проекты, поддерживающие код на C ++.

Начните с запуска Android Studio и нажмите кнопку Start a new Android Studio project на экране приветствия. На следующем экране дайте вашему приложению осмысленное имя и проверьте поле Include C ++ Support.

На экране создания активности мастера выберите параметр Add No Activity. На последнем экране мастера убедитесь, что для значения поля C ++ Standard установлено значение Toolchain Default и нажмите кнопку Finish.

Android NDK и инструменты, от которых он зависит, по умолчанию не установлены. Поэтому, как только проект будет сгенерирован, вы увидите ошибку, которая выглядит так:

Чтобы исправить ошибку, откройте Tools > Android > SDK Manager и перейдите на вкладку SDK Tools.

В списке доступных инструментов разработчика выберите CMake и NDK и нажмите кнопку Apply.

После завершения установки перезапустите Android Studio.

3. Создание собственной библиотеки

Проект Android Studio, который поддерживает C ++, имеет дополнительный каталог исходного кода cpp. Как вы могли догадаться, все файлы и библиотеки C ++ должны быть размещены внутри него. По умолчанию в каталоге есть файл native-lib.cpp. Пока что мы напишем весь наш код на C ++ внутри него.

В этом уроке мы создадим простую нативную библиотеку, содержащую функцию, которая вычисляет площадь круга с помощью формулы πr². Функция примет радиус круга как jdouble и вернет площадь как jstring .

Начните с добавления в файл директив include :

jni.h — это заголовочный файл, содержащий несколько макроопределений, типов, структур и функций, которые незаменимы при работе с NDK. (JNI означает Java Native Interface, и это среда, которая позволяет Java Runtime взаимодействовать с собственным кодом.) Заголовочный файл string необходим, потому что мы будем использовать тип jstring в нашей библиотеке. Заголовочный файл math.h содержит значение π.

По умолчанию для поддержки полиморфизма компилятор C ++ модифицирует имена всех функций, которые вы определяете в своем коде. Эта функция часто упоминается как изменение имени. Из-за манипуляции с именем вызов ваших функций C ++ из кода Java приведет к ошибкам. Чтобы избежать ошибок, вы можете отключить управление именами, указав свои функции внутри блока extern «C» .

Читайте также:  Российский текстовый редактор для андроид

Имена функций C ++, доступные через JNI, должны иметь следующий формат:

  • Они должны иметь префикс Java_.
  • Они должны содержать искаженную форму имени пакета, где точки заменяются символами подчеркивания.
  • Они должны содержать имя класса Java, к которому они принадлежат.

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

Следующий код определяет функцию, называемую calculateArea , к которой можно получить доступ из класса Java, называемого MainActivity :

Обратите внимание, что помимо радиуса функция также принимает тип JNIEnv , который имеет функции утилиты, которые вы можете использовать для обработки типов Java, и экземпляр jobject , который является ссылкой на экземпляр MainActivity . Мы, конечно, будем создавать MainActivity позже в этом уроке.

Вычисление площади очень просто. Все, что вам нужно сделать, это умножить макрос M_PI на квадрат radius .

Просто чтобы вы знали, как обрабатывать строки при работе с JNI, давайте теперь создадим новую строку, содержащую сообщение о том, что такое площадь. Для этого вы можете использовать функцию sprintf() .

Поскольку Java не может напрямую обрабатывать массив символов C ++, возвращаемый тип нашей функции — jstring . Чтобы преобразовать массив output в объект jstring , вы должны использовать функцию NewStringUTF() .

На этом этапе наш код на C ++ готов.

4. Использование нативной библиотеки

На предыдущем шаге вы видели, что функция calculateArea() должна принадлежать классу Java MainActivity . Начните создавать класс, щелкнув правой кнопкой мыши имя вашего Java-пакета и выбрав File > New > Empty Activity.

В появившемся диалоговом окне назовите действие MainActivity. Убедившись, что опция Launcher Activity отмечена, нажмите кнопку Finish.

Перед тем, как его можно будет использовать, необходимо загрузить собственную библиотеку. Поэтому добавьте в класс static блок и загрузите библиотеку с помощью метода loadLibrary() класса System .

Чтобы иметь возможность использовать С++ функцию calculateArea() внутри действия, вы должны объявить ее как native метод.

Теперь вы можете использовать метод calculateArea() , как любой обычный метод Java. Например, вы можете добавить следующий код к методу onCreate() для вычисления и печати области круга с радиусом 5,5:

Если вы запустите приложение, вы сможете увидеть следующий вывод в окне logcat:

Заключение

В этом уроке вы узнали, как создать собственную C ++-библиотеку и использовать ее в приложении для Android. Стоит отметить, что собственный процесс сборки по умолчанию генерирует отдельный .so-файл для каждой архитектуры процессора, поддерживаемой NDK. Поэтому вы можете быть уверены, что ваше приложение будет работать на большинстве Android-устройств без каких-либо проблем.

Чтобы узнать больше об Android NDK, я предлагаю вам обратиться к руководству NDK.

И ознакомьтесь с некоторыми нашими другими учебниками и курсами по разработке Android!

Фоновый звук в Android с MediaSessionCompat

Сделайте снимки с помощью своего приложения для Android

Источник

Оцените статью