Как сделать натив

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

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

Предпосылки

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

  • последняя версия Android Studio
  • базовое понимание синтаксиса C ++

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.

Project configuration screen
Project configuration screen
Project configuration screen

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

Toolchain selection screen
Toolchain selection screen
Toolchain selection screen

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

No NDK found error
No NDK found error
No NDK found error

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

SDK Tools Dialog
SDK Tools Dialog
SDK Tools Dialog

После завершения установки перезапустите 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 .

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

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

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

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

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

Create a new launcher activity
Create a new launcher activity
Create a new launcher activity

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

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

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

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

Output in logcat
Output in logcat
Output in logcat

Заключение

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

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

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

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

Paul Trebilcox-Ruiz
Paul Trebilcox-Ruiz
Paul Trebilcox-Ruiz

В магазине Google Play есть десятки приложений для камер, каждый из которых позволяет другим способом делать фотографии или делать что-то уникальное с фотографиями из .

В этой статье мы создадим нативный Android модуль, который будет возвращать уровень заряда батарейки смартфона в React Native приложение.

Но для начала я советую прочитать не большую статью о том, как работает React Native.

Создаем нативный Android модуль

Готовим основной файл модуля

Открываем проект на React Native и ищем в нем папку
android/app/src/main/java/com/[название вашего проекта]/.

Создаем в ней файл BatteryLevel.java.

Мы только что создали каркас для нашего модуля. В этом файле мы будем описывать методы, которые хотим использовать из JavaScript.

Для того, чтобы мы смогли обратиться к модулю из JavaScript, нужно добавить обязательный метод getName и указать в нем имя нашего модуля.

Пока что модуль не умеет определять уровень заряда батарейки.

Поэтому нужно написать метод getLevel, который определит уровень заряда и передаст его в JavaScript.

Хочу заострить ваше внимание на некоторых вещах:

  1. Аннотация @ReactMethod перед методом говорит, что мы можем вызвать этот метод из JavaScript. Это обязательное условие, иначе вы не сможете вызвать этот метод из JavaScript.
  2. Методы, которые мы хотим вызвать из JavaScript, должны иметь возвращаемый тип void. Это значит, что метод ничего не возвращает явным образом, т.е. нет оператора return в конце метода.

Раз метод ничего не возвращает, то как он передаст значение заряда батарейки в JavaScript?

Для этого мы используем callback-метод. Из JavaScript файла мы передадим в метод getLevel функцию, которая должна быть выполнена по его окончании. В нашем случае это updateLevelCallback.

Полный код файла BatteryLevel.java

Полный код файла BatteryLevel.java

Регистрируем модуль

Основная часть модуля готова. Теперь нам нужно зарегистрировать его, чтобы он стал доступен из JavaScript.

Для этого создадим файл-пакет BatteryLevelPackage.java в папке android/app/src/main/java/com/[название вашего проекта]/ и добавим модуль в метод createNativeModules.

Полный код файла BatteryLevelPackage.java

Полный код файла BatteryLevelPackage.java

Добавляем пакет модуля ко остальным пакетам приложения

Пакет модуля должен быть предоставлен в методе getPackages в файле MainApplication.java. В этом методе через запятую указываются все пакеты нативных модулей, используемых в React Native проекте.

Полный код файла MainApplication.java

Полный код файла MainApplication.java

Используем нативный Android модуль в React Native приложении

В проекте React Native в файле App.js (вы можете использовать любой другой файл) импортируем NativeModules из пакета ‘react-native’ и достаем из него недавно созданный модуль BatteryLevel.

Полный код файла App.js

Полный код файла App.js

Подытожим

Шаги для создания и использования нативного Android модуля в React Native приложении:

  1. Создаем основной файл модуля в папке android/app/src/main/java/com/[название вашего проекта]/.
  2. Создаем пакет модуля в той же папке и регистрируем модуль.
  3. Добавляем пакет модуля в метод getPackages в файле MainApplication.java.
  4. В React Native проекте в файле App.js (или в другом) импортируем NativeModules из пакета ‘react-native’.
  5. Используем нативный модуль: NativeModules.[имя модуля].[имя метода]().

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


Forbes Brand Voice, Quartz и Buzzfeed специализируются на производстве нативной рекламы. Сегодня это лидеры рынка в Америке. Рассказываем, как они строят работу с рекламодателями, какие показатели измеряют и как создают контент.

Brand Voice — крупнейшее агентство по созданию нативной рекламы, интерактивного и видеоконтента, который они размещают на площадке Forbes. Здесь производство нативной рекламы — конвейер, который работает без сбоев благодаря отлаженным процессам и прозрачным правилам.

Brand Voice даёт брендам возможность заказать эксклюзивный материал у собственных криейтеров или разместить на платформе материалы, которые создали для них другие агентства или паблишеры. Каждый материал проходит проверку на соответствие редакционным стандартам и может быть отклонён редакцией.

Команда Brand Voice начинает работу с новым клиентом с утверждения концепции материала, затем — обсуждают и согласовывают черновики. Процесс создания спланирован заранее, и все стараются придерживаться этого плана.

В Brand Voice считают, что бренды могут транслировать собственную позицию или мнение, которое не обязательно должно совпадать с редакционным. Читателя об этом предупреждают соответствующие пометки внутри нативных материалов. Однако, если позиция бренда противоречит редакции и угрожает нарушить целостность редполитики, Brand Voice отказывают в публикации рекламодателю.

В Brand Voice не продают публикации по одной, а заключают долгосрочные договоры с рекламодателями. Премиум-план стоит 100 000 $ в месяц и включает неограниченное количество публикаций и доступ к платформе онлайн-статистики минимум на 6 месяцев.

Сейчас у Brand Voice около 150 постоянных партнёров, чьи публикации они выпускают регулярно. Первый парнёр студии, который работает с ними с 2010 года — SAP, магазин высоких технологий.


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

Такой платформой для SAP стала персональная страница на портале Forbes — SAP Voice. Такая есть у каждого рекламодателя Forbes. На ней собраны все публикации, есть описание деятельности компании, контакты и основные продукты. Эта страница — ещё одно преимущество, которое даёт сотрудничество с Brand Voice.

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

Они узнали, что 52% читателей — топ-менеджеры, 21% работают в сфере консалтинга, по 13% в финансах и медиа и 12% — в техническом секторе, 65% живут в Северной Америке и больше половины читают Quartz с мобильных девайсов.

Дальше они разделили публикации по жанрам и узнали, что 85% читают аналитические материалы, 61% — информацию от лидеров и экспертов компаний, 57% — эксклюзивные данные, 42% — об опыте использования продуктов, 36% — перспективы компаний и 32% — истории компаний.

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

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



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

Одна из задач журналистов в отделе нативной рекламы Quartz — находить острые и актуальные темы для публикаций. В Quartz не боятся, что на одну и ту же тему в журнале выйдет два материала. Наоборот, они считают, что это, помогает осветить одну и ту же проблему по-разному, и дать читателям возможность узнать больше подробностей и точек зрения.

В сентябре 2015 года Quartz привлекли 16 миллионов уникальных посетителей в месяц. А прибыль компании с 2014 по 2015 год выросла на 80%.

Buzzfeed отталкиваются в стратегии и тактике от читательской обратной связи. Они собирают подробную статистику для каждой публикации и высчитывают секретный индекс “lift”.

Рекламодатели получают доступ к системе и могут в реальном времени отслеживать статистику брендированного контента.

Аналитики Buzzfeed подсчитали, что нативная реклама на 48% повышает вовлечённость и на 42% — намерение совершить покупку у клиентов.

Чтобы добиться максимального вовлечения, Buzzfeed добавляют в каждый кейс эмоциональную составляющую и обращаются к читателям на их языке. Это не только усиливает эффект от публикации, но и продлевает её жизнь.

Одна из успешных рекламных кампаний — запуск 6 публикаций для Пенсильванского университета Temple.


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

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

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

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

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

Что такое нативная и кроссплатформенная мобильная разработка, чем они отличаются, как сделать выбор. Объясняет Surf.


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

Натив и кроссплатформа: что это вообще такое

Это два типа разработки. Нативное приложение создаётся для конкретной операционной системы на языке программирования, который ей понятен. Пишутся два отдельных кода для двух ОС.

В случае кроссплатформы программисты используют фреймворки — программные каркасы, на которые затем вешают необходимые функции. Фреймворки универсальные — с их помощью создают приложения сразу для нескольких ОС. Код один, а систем много.

Кроссплатформенная разработка — относительно новое явление. И в этом есть как плюсы, так и минусы. С одной стороны, репутация фреймворков пока кажется ненадёжной. С другой — они создавались и тестировались с учётом опыта, который накопила к этому времени сфера мобильной разработки.

Натив: что это, кому подходит, примеры

Программирование в нативной среде ведётся на нескольких языках. Для Android это Kotlin и Java, а для iOS — Swift и Objective-C.

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

Плюсы нативного подхода

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

Никаких ограничений: можно смело браться за реализацию любых идей, связанных с работой устройства — камерой, GPS, сенсорами, файловой системой устройства и так далее.

В нативной разработке намного больше специалистов — нет проблем с тем, чтобы найти сотрудников на проект или просто с кем-то посоветоваться.

Нативные приложения хороши всем, кроме стоимости. Это дорогой проект: для каждой ОС придётся разрабатывать свою логику, интерфейс и вёрстку. Под каждую платформу нужно держать отдельный штат разработчиков и тестировщиков. В зависимости от региона зарплата опытного мобильного разработчика начинается от 90 000 рублей, а у старшего специалиста может достигать 350 000 рублей.


Зарплаты мобильных разработчиков — одни из самых высоких на рынке. Данные Хабр Карьеры за второе полугодие 2020

Итог: нативное приложение оптимально для конкретной операционной системы, меньше весит, быстрее работает и даёт все возможности для реализации сложных функций. Но будьте готовы к большим расходам.


Кроссплатформа: что это, кому подходит, примеры

На рынке представлено много кроссплатформ: React Native, Xamarin, PhoneGap, Titanium, Ionic, Flutter. Однако глобально выбор сводится к двум вариантам: React Native и Flutter. Это наиболее популярные и развитые фреймворки. Для них быстрее и проще найти разработчика.

Оба решения дают качественный пользовательский опыт. В большинстве случаев существенной разницы между ними нет, но мы отдаём предпочтение Flutter. И не мы одни: к апрелю 2020 года его опробовали больше двух миллионов разработчиков. 500 тысяч заявили, что используют фреймворк ежемесячно. 92% высоко оценили Flutter и отметили, что планируют работать с ним дальше.


При работе с кроссплатформенным приложением пользователь должен воспринимать его как нативное — плавные анимации, высокая скорость работы, работа с жестами. С этим пока целиком справляется только Flutter.

В каких случаях стоит выбрать кроссплатформу

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

Вы представляете крупную компанию, но именно по вашему проекту бюджет ограничен. Например, у него вторичная роль в бизнесе, как в случае приложения для водителей Яндекс. Такси, которое сделали на Flutter. Специалистам Яндекса требовалась iOS-версия приложения Таксометр, которое водители используют для приёма заказов. На разработку с нуля было всего 2,5 месяца, а само приложение должно было интегрироваться с актуальными версиями Android. Нативное приложение не подходило из-за сроков разработки, не получилось бы добиться одинакового поведения обоих приложений, нельзя использовать общую библиотеку компонентов. Поэтому приложение сделали на кроссплатформе.

У вас стартап и нужно сделать MVP (минимально жизнеспособный продукт) быстро и эффективно. Тот случай, когда чем быстрее сделаете и меньше денег потратите, тем лучше.

Приложения для разных ОС получаются практически одинаковыми. Так часто бывает в ритейле. Функции и пользовательские сценарии, программы лояльности, каталог, онлайн-магазин — всё одинаковое. Нет смысла просто дублировать приложения.

95% ваших пользователей сидят на одной ОС. Содержать отдельную команду и поддерживать приложение ради 5% дорого и нецелесообразно. Так случилось с нашим корпоративным приложением для KFC. У 95% сотрудников был Android, а у 5%, среди которых менеджеры и управляющие ресторанами, — iOS. Можно раздать сотрудникам корпоративные андроиды, но получится дорого и неудобно. А создавать два нативных приложения означает вдвое увеличить бюджет. Подходящим решением стало кроссплатформенное приложение на Flutter.

Дешевле не значит хуже: почему кроссплатформа экономичнее

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

В случае кроссплатформы можно переиспользовать основную часть кода, а бизнес-логика, интерфейс и вёрстка почти не требуют изменений. Меньше расходы, компактнее команда разработчиков, короче показатель time-to-market — с помощью Flutter можно выпустить продукт на рынок за 2–3 месяца. Можно быстрее запускать новые функции и обновления, то есть зарабатывать с помощью приложения больше и быстрее. По нашим подсчётам, экономия бюджета на Flutter составляет до 40%.

Например: Росбанк Бизнес

Кросс-платформа подходит не только для заведомо бюджетных проектов. На ней отлично можно создавать сложные и дорогие приложения. Так Surf создал Росбанк Бизнес — первое в России и второе в мире банковское приложение на Flutter. Мы выбрали этот фреймворк во многом благодаря скорости запуска, критически важной для заказчика.


6 вещей, которые нужно знать при выборе мобильной разработки

1. Натив — два кода под две системы. Кроссплатформа — один код под несколько ОС.

2. Нативная разработка под конкретные операционные системы — хорошее, но дорогое и более медленное решение.

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

4. Кроссплатформа позволяет сэкономить до 40% бюджета и сокращает показатель time-to-market.

5. У современных кроссплатформенных фреймворков широкие возможности: на них можно делать сложные продукты, которые с точки зрения пользователя неотличимы от нативных приложений.

6. Кроссплатформ сегодня много, но Flutter по пользовательскому опыту превосходит аналоги, а популярность фреймворка среди разработчиков растёт. Поэтому, если вы выбрали кроссплатформу, смотрите в сторону Flutter.

Читайте также: