Добавьте код C и C++ в свой проект

Добавьте код на C и C++ в свой Android-проект, поместив его в каталог cpp в модуле вашего проекта. При сборке проекта этот код будет скомпилирован в нативную библиотеку, которую Gradle сможет упаковать вместе с вашим приложением. Затем ваш код на Java или Kotlin сможет вызывать функции из вашей нативной библиотеки через Java Native Interface (JNI). Чтобы узнать больше об использовании фреймворка JNI, прочитайте советы по JNI для Android .

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

Чтобы импортировать существующую библиотеку ndk-build в свой проект Android Studio, узнайте, как связать Gradle с проектом вашей нативной библиотеки .

На этой странице показано, как настроить Android Studio с необходимыми инструментами сборки, создать новый проект с поддержкой C/C++ и добавить новые файлы C/C++ в ваш проект.

Если же вы хотите добавить нативный код в существующий проект, выполните следующие шаги:

  1. Создайте новые исходные файлы и добавьте их в свой проект Android Studio.
    • Пропустите этот шаг, если у вас уже есть нативный код или вы хотите импортировать предварительно собранную нативную библиотеку.
  2. Настройте CMake для сборки вашего нативного исходного кода в библиотеку. Этот скрипт сборки необходим, если вы импортируете и связываете его с предварительно собранными или платформенными библиотеками.
    • Если у вас уже есть нативная библиотека, для которой существует скрипт сборки CMakeLists.txt , или если она использует ndk-build и включает скрипт сборки Android.mk , пропустите этот шаг.
  3. Настройте Gradle , указав путь к файлу скрипта CMake или ndk-build . Gradle использует скрипт сборки для импорта исходного кода в ваш проект Android Studio и упаковки вашей нативной библиотеки в приложение.

После настройки проекта вы сможете получать доступ к своим нативным функциям из кода Java или Kotlin, используя фреймворк JNI . Чтобы собрать и запустить приложение, нажмите «Запустить». Запустите приложение из строки меню. .

Примечание: Если в вашем существующем проекте используется устаревший инструмент ndkCompile , перейдите на использование CMake или ndk-build .

Загрузите NDK и инструменты сборки.

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

  • Android Native Development Kit (NDK) : набор инструментов, позволяющий использовать код на C и C++ с Android. NDK предоставляет платформенные библиотеки, позволяющие управлять нативными активностями и получать доступ к физическим компонентам устройства, таким как датчики и сенсорный ввод.
  • CMake : внешний инструмент сборки, работающий совместно с Gradle для сборки вашей нативной библиотеки. Этот компонент вам не понадобится, если вы планируете использовать только ndk-build .
  • LLDB : отладчик в Android Studio, предназначенный для отладки нативного кода .

Информацию об установке этих компонентов см. в разделе «Установка и настройка NDK и CMake» .

Создайте новый проект с поддержкой C/C++.

Для создания нового проекта с поддержкой нативного кода процесс аналогичен созданию любого другого проекта в Android Studio , но с дополнительным шагом:

  1. В разделе «Выберите свой проект» мастера выберите тип проекта «Нативный C++» .
  2. Нажмите «Далее» .
  3. Заполните все остальные поля в следующем разделе мастера.
  4. Нажмите «Далее» .
  5. В разделе «Настройка поддержки C++» мастера вы можете настроить свой проект с помощью поля «Стандарт C++» .
    • Используйте раскрывающийся список, чтобы выбрать, какой стандарт C++ вы хотите использовать. Выбор варианта «Toolchain Default» использует настройки CMake по умолчанию.
  6. Нажмите «Готово» .

После того, как Android Studio завершит создание нового проекта, откройте панель «Проект» в левой части IDE и выберите в меню раздел «Android» . Как показано на рисунке 1, Android Studio добавит группу `cpp` :

Рисунок 1. Группы представлений Android для ваших исходных файлов и внешних скриптов сборки.

Примечание: Данное представление не отражает фактическую файловую иерархию на диске, а группирует похожие файлы для упрощения навигации по проекту.

В группе `cpp` вы найдете все исходные файлы нативных приложений, заголовочные файлы, скрипты сборки для CMake или ndk-build , а также предварительно собранные библиотеки, входящие в состав вашего проекта. Для новых проектов Android Studio создает пример исходного файла C++, native-lib.cpp , и помещает его в каталог src/main/cpp/ вашего модуля приложения. Этот пример кода содержит простую функцию C++, ` stringFromJNI() , которая возвращает строку "Hello from C++" . Узнайте, как добавить дополнительные исходные файлы в ваш проект, в разделе о создании новых исходных файлов нативных приложений .

Подобно тому, как файлы build.gradle указывают Gradle, как собирать ваше приложение, CMake и ndk-build требуют наличия скрипта сборки, чтобы знать, как собрать вашу нативную библиотеку. Для новых проектов Android Studio создает скрипт сборки CMake, CMakeLists.txt , и помещает его в корневой каталог вашего модуля. Чтобы узнать больше о содержимом этого скрипта сборки, прочитайте раздел «Настройка CMake» .

Соберите и запустите демонстрационное приложение.

Когда вы нажимаете кнопку «Выполнить», вы увидите, что... Запустите приложение из строки меню. Android Studio собирает и запускает приложение, которое отображает текст «Hello from C++» на вашем устройстве Android или эмуляторе. Ниже представлен обзор событий, происходящих при сборке и запуске демонстрационного приложения:

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

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

  1. Выберите Сборка > Сборка пакетов / APK-файлов > Сборка APK-файлов .
  2. Выберите Сборка > Анализ APK .
  3. Выберите APK или AAB файл из каталога app/build/outputs/ и нажмите OK .
  4. Как показано на рисунке 2, в окне анализатора APK вы можете увидеть libnative-lib.so в папке lib/<ABI>/ .

    Рисунок 2. Найдите нативную библиотеку с помощью анализатора APK.

Совет: Если вы хотите поэкспериментировать с другими приложениями Android, использующими нативный код, нажмите Файл > Создать > Импортировать пример и выберите пример проекта из списка NDK .

Создайте новые исходные файлы C/C++.

Чтобы добавить новые исходные файлы C/C++ в существующий проект, выполните следующие действия:

  1. Если в основном наборе исходных файлов вашего приложения еще нет каталога cpp/ , создайте его следующим образом:
    1. Откройте панель «Проект» в левой части IDE и выберите в меню пункт «Проект» .
    2. Перейдите в папку your-module > src .
    3. Щелкните правой кнопкой мыши на главном каталоге и выберите «Создать» > «Каталог» .
    4. Введите cpp в качестве имени каталога и нажмите OK .

  2. Щелкните правой кнопкой мыши по каталогу cpp/ и выберите New > C/C++ Source File .
  3. Введите имя для исходного файла, например, native-lib .
  4. В меню «Тип» выберите расширение исходного файла, например, .cpp .
    • Нажмите «Редактировать типы файлов» . Чтобы добавить в меню другие типы файлов, например .cxx или .hxx , в появившемся диалоговом окне « Новые расширения файлов» выберите другое расширение файла из меню «Расширение исходного файла» и «Расширение заголовка» и нажмите «ОК» .
  5. Для создания заголовочного файла установите флажок «Создать связанный заголовочный файл» .
  6. Нажмите ОК .

После добавления новых файлов C/C++ в ваш проект вам все равно потребуется настроить CMake для включения этих файлов в вашу нативную библиотеку.

Дополнительные ресурсы

Чтобы узнать больше о поддержке кода C/C++ в вашем приложении, воспользуйтесь следующим ресурсом.

Кодлабс