8 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Введение в Android NDK

Учимся работать с Android NDK или как использовать C код в java проектах

Android NDK представляет собой набор утилит, позволяющих Вам включать код, написанный на C и C++, в ваше приложение. Такой код называется нативным(native), поскольку он не может быть выполнен на виртуальной машине и компилируется непосредственно в машинный код требуемой процессорной архитектуры.

Данный урок относится к разряду продвинутых. Подразумевается, что читатель уже имеет некоторые навыки, в частности

  1. Вы умеете программировать на Java и C
  2. Вы умеете работать с командной строкой
  3. Вы знаете, как узнать версии Cygwin, awk и других инструментов, которыми нам придется пользоваться
  4. Вы умеете разрабатывать приложения для Android
  5. У Вас настроена среда разработки для Android (в момент написания автор использовал Android 2.2)
  6. Вы используете Eclipse или можете транслировать инструкции по работе с eclipse на свою IDE.

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

Когда нужно использовать Android NDK?

Обычно разработчики решают использовать нативный код в двух случаях: они хотят увеличить производительность своего приложения, или у них есть готовый C/C++ проект, который требуется с минимальными затратами портировать на Android. Давайте не будем спешить и разберемся, когда же целесообразно использовать NDK, а когда этого не нужно делать.

Наиболее часто программистами высказывается мнение, что NDK стоит использовать, когда приложение сильно нагружает процессор. Существуют алгоритмы, позволяющие полностью загрузить процессор через DalvikVM, в этом случае использование нативного кода действительно с большой вероятностью позволит получить выигрыш в производительности. Однако, не нужно забывать, что использование JIT компилятора также позволяет повысить производительность java кода. Многие думают, что использование в приложении машинного кода автоматически означает увеличение скорости работы приложения. На самом деле это не так. Переключение с выполнения java кода на машинный код и обратно несет с собой накладные расходы, поэтому использовать NDK стоит, только если у вас выполняется какой-нибудь долгий сложный расчет, полностью написанный на C, и в java коде не предполагается частое дерганье нативных функций.

Другой причиной, которая может побудить Вас использовать NDK является необходимость портирования готового приложения. Вполне логично не переписывать уже проверенные и отлаженные куски кода на java, а использовать NDK. Этот подход также позволит Вам в дальнейшем без особых затрат вносить параллельно правки в исходное и портированное на android приложение. В частности, такой подход оправдан в отношении приложений, использующих OpenGL ES.

Шаг 1: Установка Android NDK и настройка среды разработки

Прежде всего, Вам необходимо скачатьAndroid NDK. Для установки и нормальной работы нам также понадобятся утилиты Cygwin 1.7 или старше, awk последней версии, а также GNU Make 3.81 или старше.

После того, как Вы скачали архив с NDK, распакуйте его в какую-нибудь папку. Можно распаковать этот архив туда же, где лежит Android SDK. Путь к этой папке необходимо прописать в системной переменной PATH. В Windows для этих целей лучше настроить конфигурацию Cygwin.

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

Создайте новый Android проект. Чтобы избежать проблем в будущем сохраните проект так, чтобы путь к нему не содержал в себе символов пробела. Для примера создайте проект, в качестве названия пакета укажите “com.mamlambo.sample.ndk1”, а в качестве Activity – “AndroidNDK1SampleActivity”.

В корне проекта создайте папку с названием “jni”. Именно здесь будет содержаться файлы с нативным кодом. Если Вы знакомы с JNI, то вам будет приятно узнать, что Android NDK по сути представляет собой JNI с ограниченным набором заголовочных файлов для компиляции C кода.

Шаг 3: Добавляем C код в Android проект

Создайте в папке jni файл с именем native.c и добавьте в него следующий код

Созданная таким образом функция берет параметр String у java объекта, конвертирует его в C-string и записывает в LogCat. Зубодробительное имя функции выбрано не случайно, оно несет в себе важную информацию: сначала указывается название паттерна (“Java”), затем идут название пакета, имя класса и название метода. Каждая часть имени отделяется знаком подчеркивания.

Первые два параметра у функции имеют особое значение. Первый параметр определяет JNI среду и часто используется со вспомогательными функциями. Второй параметр является объектом Java, частью которого является функция.

Шаг 4: Вызов нативного кода из Java

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

Необходимо также объявить функцию helloLog в классе, где она вызывается. Сделать можно с помощью строки

Таким образом, мы сообщаем компилятору и линковщику, что реализацию этой функции стоит искать в папке с нативным кодом.

Наконец, нужно загрузить библиотеку, куда в конечном счете будет скомпилирован код. Добавьте следующую инициализацию в класс Activity.

System.loadLibrary() обеспечивает загрузку библиотеки по имени. Вы можете использовать любое название.

Шаг 5: Создаем Make file для нативного кода

Для компиляции нативного кода в папке jni должен находиться Make file с именем “Android.mk”. Ниже приведен код этого фала для нашего примера, то есть когда функция находится в файле native.c и в качестве имени библиотеки указано ndk1

Шаг 6: компиляция нативного кода

После того, как Вы написали код и добавили make файл в папку jni можно приступать к компиляции. Для этого нужно в командной строке (Если вы работаете в windows, запустите Cygwin) запустить ndk-build из папки проекта. Утилита ndk-build входит в состав Android NDK. Если Вы все сделали правильно, то вы должны увидеть что-то вроде этого

Шаг 7: Запуск приложения

Теперь можно запустить проект, нажать на кнопку и посмотреть, как изменится LogCat.

Может произойти одна из двух вещей: 1) ваш проект может запуститься и работать, как Вы того ожидаете. В этом случае примите мои поздравления. 2) Возникнет ошибка, которая в LogCat отобразиться как “Could not execute method of activity.” Ничего страшного. Обычно Eclipse сконфигурирован так, что при запуске проекта автоматически происходит его перекомпиляция. В случае, если эта опция отключена, то нужно вручную заставить Eclips перекомпилировать проект. Для этого перед запуском нужно вызвать менюProject->Clean from the Eclipse toolbar.

Шаг 8: Как вернуть объект из нативной функции

Следующий пример демонстрирует возможность нативных функций возвращать объекты, например String. Добавьте код в файл native.c

С помощью команды malloc мы создали буфер, куда затем с помощью sprintf поместили строку. Чтобы функция возвращала корректный результат, мы использовали JNI helper функцию NewStringUTF(), которая фактически создает Java объект на основании C строки. После этого мы очистили память с помощью команды free().

Для успешной компиляции проекта необходимо в native.c подключить заголовочный файл stdio.h. В классе Activity нужно также объявить новую функцию:

после этого с функцией getString можно работать, например следующим образом:

Замечания

Android NDK для своей работы требует Android SDK 1.5. С помощью NDK можно получить доступ ко многим API, например к OpenGL ES.

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

Читать еще:  iPhone XR – обзор, характеристики, камеры, дисплей и цена

Заключение

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

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

Приложения на 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++“.

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

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

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

  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 имеет следующие характеристики:

android-ndk Начало работы с android-ndk

замечания

Что такое Android NDK?

Android Native Development Kit (NDK) является вспомогательным инструментом для Android SDK, который позволяет создавать части приложений на C / C ++. Это полезно для:

  • Совместное использование компонентов приложений на разных платформах (Android, iOS, Linux и т. Д.)
  • Повышение производительности для критических частей
  • Повторное использование существующих библиотек C / C ++

NDK предоставляет заголовки и библиотеки, которые позволяют разработчику создавать действия, обрабатывать ввод пользователей, использовать аппаратные датчики, доступ к ресурсам приложений и т. Д. – все это время программирования на C / C ++.

Версии

Начало работы с Android NDK с простым примером

Используя Android Studio 2.2 и выше Native Development Kit (NDK), вы можете использовать для компиляции кода на C и C ++.

Вы можете использовать NDK, вручную загрузив NDK и создав его или через CMake.

Здесь я дам поток процессов для ручной установки NDK и пример кода,

На основе вашей ОС системы вы можете загрузить NDK из этого места https://developer.android.com/ndk/downloads/index.html .

После загрузки укажите путь в переменной среды системы как имя переменной « NDK_PROJECT_PATH » и значение переменной «местоположение хранимого пути NDK».

Затем, чтобы интегрировать NDK с Android Studio, после создания нового проекта Android,

Читать еще:  На Android вышло приложение Post-it — классный заметочник со стикерами

В gradle – локальные свойства добавляют местоположение пути sdk как

Затем нажмите «Сборка – сделать проект» (Ctrl + f9).

Ваш проект будет успешно создан и получит BUILD SUCCESFUL в построении градации сообщений, как показано ниже

Затем в терминале сначала он будет содержать путь к проекту

Там добавляется cd app/src/main

Путь будет простираться от пути проекта до основного.

Затем снова Build – Make Project (Ctrl + f9).

Теперь вы найдете в папке отладки app-build-intermediates-classes-debug , как показано ниже.

Теперь создайте новый файл класса Java в приложении / src / main / java. Здесь я создал java-файл с именем NativeClass

Напишите простую функцию вызова с именем функции и входом для функции. Здесь я написал функцию в качестве примера и дал два целочисленных ввода для нее,

Снова создайте проект (Ctrl + f9) ,

Когда вы создадите, вы найдете файл класса, созданный в сборке, как это,

где, – d – для вывода каталога – JNI файл -Generate JNI-стиль заголовка ( по умолчанию) – путь к классам – для которых для загрузки классов

Теперь создадим проект (Ctrl + f9), вы найдете созданную папку jni, и файл заголовка будет создан с именем, указанным вами в терминале раньше, как показано ниже

Теперь скопируйте файл заголовка и сохраните его как .cpp или .c файл с тем же именем заголовочного файла в jni-папке.

Я создал файл cpp, как показано ниже

Application_com_ndkapplication_NativeClass.cpp

И для этого примера нет необходимости добавлять какую-либо функцию в заголовочный файл.

Создайте новый файл с именем Android.mk и Application.mk в папке Jni

Файл Android.mk предназначен для описания ваших источников в системе сборки.

Android.mk

узнать подробности об этом файле, прочитав по этой ссылке https://developer.android.com/ndk/guides/android_mk.html

Application.mk, который описывает собственные модули, которые требуется вашему приложению.

Application.mk

чтобы узнать подробности об этом файле, прочитайте по этой ссылке https://developer.android.com/ndk/guides/application_mk.html

Затем в основной активности передайте вход и получите вывод для файла родного класса.

здесь я дал два целых числа, вводимых через a, b и получив выход из переменной res.

Полученный вывод отображается на экране, перейдя в TextView.

И не забудьте добавить библиотеку, которую вы указали в файле Android.mk как LOCAL_MODULE, например,

Наконец, снова создайте проект (Ctrl + f9), вы найдете файлы .so, созданные под каждой папкой armeabi-v7a, armeabi, arm64-v8a, mips, mips64, x86 и x86_64.

Затем запустите приложение, вы получите результат для этого примера как 10.

Это базовая программа для новичков NDK, здесь можно импортировать библиотеку OpenCV, и вы также можете делать приложения для обработки изображений.

Введение в разработку Android-приложений

Презентацию к лекции Вы можете скачать здесь.

1.1. Введение. История Android

Android – открытая операционная система для мобильных телефонов, смартфонов, коммуникаторов, планшетных компьютеров, электронных книг, цифровых проигрывателей, наручных часов, нетбуков и смартбуков, основанная на ядре Linux и поддерживающая различные аппаратные платформы, такие как ARM , MIPS , POWER , x86 .

Изначально разрабатывалась компанией Android Inc., которую затем (июль, 2005) купила Google. Впоследствии (ноябрь, 2007) Google инициировала создание бизнес-альянса Open Handset Alliance (в его состав вошли Google, HTC, Intel, Motorola, Nvidia и другие компании), который и занимается сейчас поддержкой и дальнейшим развитием платформы.

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

1.2. Инструментарий разработчика

Перед тем, как приступить к созданию Android -приложений, необходимо выбрать подходящий инструментарий разработки.

Как правило, разработка Android -приложений осуществляется на языке Java . Поэтому, в первую очередь , необходимо установить Java Development Kit ( JDK ). Но для начала следует разобраться, что представляет из себя Java .

Java – это объектно-ориентированный язык программирования . Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java , которая обрабатывает байтовый код и передает инструкции оборудованию как интерпретатор . Достоинство подобного способа выполнения программ заключается в полной независимости байт-кода от операционной системы и оборудования, что позволяет выполнять Java -приложения на любом устройстве, для которого существует соответствующая виртуальная машина . Другой важной особенностью Java является гибкая система безопасности благодаря тому, что исполнение программы полностью контролируется виртуальной машиной. Любые операции , которые превышают установленные полномочия программы (например, попытка несанкционированного доступа к данным или соединения с другим компьютером) вызывают немедленное прерывание . Следует заметить, что фактически, большинство архитектурных решений, принятых при создании Java , было продиктовано желанием предоставить синтаксис , схожий с С/C++. В Java используются практически идентичные соглашения для объявления переменных, передачи параметров и операторов. Поэтому те, кто уже имеет опыт программирования на C/C++, смогут быстро освоиться и начать писать Java -приложения.

JDK – это бесплатно распространяемый комплект разработчика приложений на языке Java , включающий в себя компилятор Java , стандартные библиотеки классов Java , примеры, документацию, различные утилиты и исполнительную систему Java Runtime Environment ( JRE ). В состав JDK не входит интегрированная среда разработки (Integrated Development Environment ). Поэтому после того, как будет установлен JDK , следует установить IDE .

Существует несколько популярных сред разработки, но в данном курсе мы остановим свой выбор на Eclipse IDE и соответствующем для нее плагине Android Development Tools ( ADT ).

Android Software Development Kit ( SDK ) содержит множество инструментов и утилит для создания и тестирования приложений. Например, с помощью SDK Manager можно установить Android API любой версии (Рис. 1.1), а также проверить репозиторий на наличие доступных, но еще не установленных пакетов и архивов.

Android Native Development Kit (NDK) позволяет осуществлять разработку Android -приложений на языке C/C++. Зачем это может потребоваться? Есть несколько причин. Например, необходимость использовать код, который уже написан для нативной платформы, или ускорение выполнения критических кусков кода.

1.3. Архитектура Android

Рассмотрим основные компоненты операционной системы Android (Рис. 1.2).

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

Application Framework. Предоставляя открытую платформу разработки, Android дает разработчикам возможность создавать гибкие и инновационные приложения. Разработчики могут использовать аппаратные возможности устройства, получать информацию о местоположении, выполнять задачи в фоновом режиме, устанавливать оповещения и многое другое. Разработчики имеют полный доступ к тем же API , что используются в основных приложениях.

Архитектура приложений разработана с целью упрощения повторного использования компонентов; любое приложение может “публиковать” свои возможности и любое другое приложение может затем использовать эти возможности (с учетом ограничений безопасности). Этот же механизм позволяет заменять стандартные компоненты на пользовательские.

Libraries. Android включает в себя набор C/C++ библиотек, используемых различными компонентами системы. Эти возможности доступны разработчикам в контексте применения Android Aplication Framework. Некоторые основные библиотеки, перечислены ниже:

  • Mедиа библиотеки – эти библиотеки предоставляют поддержку воспроизведения и записи многих популярных аудио, видео форматов и форматов изображений, в том числе MPEG4, MP3, AAC, AMR, JPG, PNG и других;
  • Surface Manager – управляет доступом к подсистеме отображения 2D и 3D графических слоев;
  • LibWebCore – современный веб-движок, на котором построен браузер Android;
  • SGL – основной графический движок 2D;
  • 3D библиотеки – реализованы на основе OpenGL; библиотеки используют либо аппаратное 3D-ускорение (при его наличии), либо включены программно;
  • FreeType – поддержка растровых и векторных шрифтов
  • SQLite – механизм базы данных, доступной для всех приложений.
Читать еще:  Hello Pal: общение на иностранных языках с носителями

Android Runtime. Android включает в себя набор основных библиотек, которые обеспечивают большинство функций, доступных в библиотеках Java . Каждое приложение Android работает в своем собственном процессе, со своим собственным экземпляром виртуальной машины Dalvik. Dalvik была написана так, что устройство может работать эффективно с несколькими виртуальными машинами одновременно.

Dalvik проектировалась специально под платформу Android . Виртуальная машина оптимизирована для низкого потребления памяти и работы на мобильном аппаратном обеспечении. Dalvik использует собственный байт-код. Android -приложения переводятся компилятором в специальный машинно-независимый низкоуровневый код. И именно Dalvik интерпретирует и выполняет такую программу при выполнении на платформе. Кроме того, с помощью специальной утилиты, входящей в состав Android SDK , Dalvik способна переводить байт-коды Java в коды собственного формата и также исполнять их в своей виртуальной среде.

Linux Kernel. Android основан на Linux версии 2.6 с основными системными службами – безопасность , управление памятью , управление процессами и модель драйверов. Разработчики Android модифицировали ядро Linux, добавив поддержку аппаратного обеспечения, используемого в мобильных устройствах и, чаще всего, недоступного на компьютерах.

android-ndk Начало работы с android-ndk

замечания

Что такое Android NDK?

Android Native Development Kit (NDK) является вспомогательным инструментом для Android SDK, который позволяет создавать части приложений на C / C ++. Это полезно для:

  • Совместное использование компонентов приложений на разных платформах (Android, iOS, Linux и т. Д.)
  • Повышение производительности для критических частей
  • Повторное использование существующих библиотек C / C ++

NDK предоставляет заголовки и библиотеки, которые позволяют разработчику создавать действия, обрабатывать ввод пользователей, использовать аппаратные датчики, доступ к ресурсам приложений и т. Д. – все это время программирования на C / C ++.

Версии

Начало работы с Android NDK с простым примером

Используя Android Studio 2.2 и выше Native Development Kit (NDK), вы можете использовать для компиляции кода на C и C ++.

Вы можете использовать NDK, вручную загрузив NDK и создав его или через CMake.

Здесь я дам поток процессов для ручной установки NDK и пример кода,

На основе вашей ОС системы вы можете загрузить NDK из этого места https://developer.android.com/ndk/downloads/index.html .

После загрузки укажите путь в переменной среды системы как имя переменной « NDK_PROJECT_PATH » и значение переменной «местоположение хранимого пути NDK».

Затем, чтобы интегрировать NDK с Android Studio, после создания нового проекта Android,

В gradle – локальные свойства добавляют местоположение пути sdk как

Затем нажмите «Сборка – сделать проект» (Ctrl + f9).

Ваш проект будет успешно создан и получит BUILD SUCCESFUL в построении градации сообщений, как показано ниже

Затем в терминале сначала он будет содержать путь к проекту

Там добавляется cd app/src/main

Путь будет простираться от пути проекта до основного.

Затем снова Build – Make Project (Ctrl + f9).

Теперь вы найдете в папке отладки app-build-intermediates-classes-debug , как показано ниже.

Теперь создайте новый файл класса Java в приложении / src / main / java. Здесь я создал java-файл с именем NativeClass

Напишите простую функцию вызова с именем функции и входом для функции. Здесь я написал функцию в качестве примера и дал два целочисленных ввода для нее,

Снова создайте проект (Ctrl + f9) ,

Когда вы создадите, вы найдете файл класса, созданный в сборке, как это,

где, – d – для вывода каталога – JNI файл -Generate JNI-стиль заголовка ( по умолчанию) – путь к классам – для которых для загрузки классов

Теперь создадим проект (Ctrl + f9), вы найдете созданную папку jni, и файл заголовка будет создан с именем, указанным вами в терминале раньше, как показано ниже

Теперь скопируйте файл заголовка и сохраните его как .cpp или .c файл с тем же именем заголовочного файла в jni-папке.

Я создал файл cpp, как показано ниже

Application_com_ndkapplication_NativeClass.cpp

И для этого примера нет необходимости добавлять какую-либо функцию в заголовочный файл.

Создайте новый файл с именем Android.mk и Application.mk в папке Jni

Файл Android.mk предназначен для описания ваших источников в системе сборки.

Android.mk

узнать подробности об этом файле, прочитав по этой ссылке https://developer.android.com/ndk/guides/android_mk.html

Application.mk, который описывает собственные модули, которые требуется вашему приложению.

Application.mk

чтобы узнать подробности об этом файле, прочитайте по этой ссылке https://developer.android.com/ndk/guides/application_mk.html

Затем в основной активности передайте вход и получите вывод для файла родного класса.

здесь я дал два целых числа, вводимых через a, b и получив выход из переменной res.

Полученный вывод отображается на экране, перейдя в TextView.

И не забудьте добавить библиотеку, которую вы указали в файле Android.mk как LOCAL_MODULE, например,

Наконец, снова создайте проект (Ctrl + f9), вы найдете файлы .so, созданные под каждой папкой armeabi-v7a, armeabi, arm64-v8a, mips, mips64, x86 и x86_64.

Затем запустите приложение, вы получите результат для этого примера как 10.

Это базовая программа для новичков NDK, здесь можно импортировать библиотеку OpenCV, и вы также можете делать приложения для обработки изображений.

Suvitruf’s Blog :: Gamedev suffering

Блог о разработке игр и серверных технологиях

Основы Android NDK: вызов Java-методов из C/C++ кода при помощи JNI

В прошлой статье кратко рассмотрел Android NDK, показал как вызывать нативные методы из Java. Разумным продолжением той статьи будет описание того, как вызвать Java методы из C++.

Введение

  1. Определить у класса метод, который хотим вызвать.
  2. Получить дескриптор нужного класса.
  3. Описать сигнатуру метода.
  4. Получить идентификатор метода (ссылку).
  5. Вызвать метод у нужного объекта.

Определение методов

Просто определить метод у класса можно, но лучше использовать интерфейсы и реализовать их в нашем классе. Для начала придумаем более-менее практическую задачу, ибо писать примеры на какие-то абстрактные темы не интересно. Предположим, у вас в C++ коде есть таймер, который что-то делает и вызывает через определённые промежутки Java метод. Как пример, рендеринг в игровом движке или опрос сервера и т.д.

Для простоты, скажем, этот таймер будет сообщать о том, сколько времени прошло после запуска. Теперь определим наш интерфейс в Java с этим методом.

Теперь реализуем его в нашем главном Activity.

Данному интерфейсу в нативном коде на C++ будет соответствовать класс NativeCallListener :

Далее необходимо получить дескриптор класса.

Получение дескриптора класса

Для этого есть два способа. Первый использует ссылку на объект: jclass cl = pJniEnv->GetObjectClass(pWrappedInstance);

Второй позволяет получить дескриптор по имени: jclass cl = pEnv->FindClass(«ru/suvitruf/androidndk/MainActivity»);

Второй метод не одобряю, ибо в случае смены реализации на стороне java, придётся менять и нативный код, но зато не требуется ссылка для получения дескриптора. Первый метод более удобен, как я считаю.

Полностью инициализация (получение дескриптора класса и ссылки на метод) будет такой:

Cсылки на объекты, переданные в JNI-метод, действительны только в пределах времени выполнения этого метода. При попытки обратится к mObjectRef или pJniEnv после выполнения метода, там будет NULL. Поэтому мы и создаём глобальные ссылки на ни, чтобы потом использовать. Теперь нужен метод для получение JNIEnv:

Определение сигнатуры и получение идентификатора метода

Для этого у нас написано это: sendTimeID = pJniEnv->GetMethodID(cl, “sendTime”, “(I)V”);

В качестве параметров GetMethodID служат дескриптор класса, имя метода, список параметров и возвращаемого типа «(I)V». В скобках указаны входные параметры, после них — возвращаемый тип. Ниже приведена таблица типов параметров и пару примеров описания методов.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Статьи c упоминанием слов: