Как начать использовать код C++ в своем проекте Android

1656520218 kak nachat ispolzovat kod c v svoem proekte android

от Onur Tuna

В прошлом году я выступал с докладом на GDG DevFest в Анкаре, Турция. С тех пор я планировал поделиться этим разговором здесь. Теперь, когда я кандидат наук и имею немного больше времени, я размещаю этот пост здесь.

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

Разминка

Я хотел бы начать с объяснения процесса создания приложения в Android. Поскольку вам нужно знать некоторые основные внутренние вещи, эта тема несколько техническая.

CiOMuYEICXxQIaTnhTq2QDcUjDvxJ67U2qnP

Вам не нужно знать все, что показано на картинке выше, но это хороший справочник.

Теперь скажем, что вы пишете приложение для Android с помощью Java. Вы будете иметь:

  • исходный код этой программы
  • какие-то файлы ресурсов (например, изображения или файлы xml для расположения графического интерфейса)
  • и, возможно, некоторые файлы AIDL, являющиеся интерфейсами Java, заставляющие процессы общаться друг с другом.

Вероятно, вы собираетесь использовать дополнительные библиотеки и связанные с ними файлы в своем проекте.

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

Это процесс сборки Android в простейшие сроки.

Время работы Android

Теперь давайте поговорим о времени исполнения. У вас есть приложение, и когда она запускается, ее читает машина. Android имеет два вида виртуальных машин для запуска приложения. Я не буду представлять старый, который называется Dalvik, поскольку сегодня большинство устройств Android работает на виртуальной машине под названием Android Run Time, ART — так об этом мы здесь и поговорим.

YChoo3SiUcI378wJqem7nUIB0bsaS3egjrf1

ART — это опережающая время виртуальная машина (AOT). Итак, что это значит? Позволь объяснить. Когда программа запускается впервые, ее код компилируется в машинный код, который затем может быть прочитан настоящей машиной. Это означает, что код не компилируется часть за частью во время выполнения. Это увеличивает время установки программы, уменьшая использование аккумулятора.

В общем, вы пишете программу, а затем компилируете ее в двоичный код, считываемый ART. Затем ART преобразует этот код в родной код, который может прочитать устройство.

ART & C++

z7AduOu6vW2oHfZQ3f8e7etkODct3vYAYP7X

Что делать, если вы пишете приложение для Android с помощью Java, но есть некоторый код C++, контактирующий с Java? Как этот C++ повлияет на процесс составления или время выполнения программы? Не очень много.

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

Процесс сборки C++

GC85hntQ4WtielAPH0Z8EVMCPRxI6fwQaPU6

Теперь мы должны поговорить о процессе составления C++. Исходный код (файлы .cpp и .h) преобразуется в расширенный исходный код препроцессором на первом шаге. Этот исходный код содержит множество кодов. Хотя вы можете получить окончательный исполняемый файл, используя команду, подобную вышеприведенной, можно вырезать этапы сборки с помощью связанных флагов. Вы можете получить расширенный источник, предоставив флаг к g++ компилятор. У меня есть файл строки 40867 для исходного кода .cpp с 4 строками «hello world».

Для получения расширенного исходного кода используйте g++ -E hello.cpp -o hello.ii.

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

Есть два вида связывания: динамическое и статическое.

5lb-AjEa2LTfa12E3iNzGeaq80uCdHbmlqPs

Итак, пора пойти немного глубже, когда мы обсуждаем чистый C++.

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

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

Поэтому динамическая ссылка может вызвать уязвимость в вашем проекте. Однако вопрос безопасности выходит за рамки этой публикации.

Некоторые понятия

CMake и Gradle

Если мы хотим добавить код C++ в наш проект Android, полезно использовать CMake для обработки операций сборки. Помните процесс сборки, который я только что представил выше? Когда у вас есть куча библиотек C++ и исходного кода, работать со всеми ими становится сложнее. Такой инструмент, как CMake, облегчает процесс сборки.

CMake будет доступна по умолчанию, если вы решите включить поддержку C++ в начале своего проекта. Также вам нужно использовать закрытие Gradle, чтобы упаковать библиотеки в ваш APK.

KQdZIREs7iuVrUMQbLpwrzRpWAz1bkMijSrf

ABI

Как известно, Android распространяется для разных устройств. Каждое устройство может иметь разную архитектуру ЦБ. Когда вы разрабатываете приложение для Android, содержащее код C++, вы должны заботиться о платформах, на которых будет работать ваше приложение.

Помните механизм сборки C++, который я представил выше? Код C++ должен быть скомпилирован как библиотека для каждой целевой платформы. Вы можете собрать библиотеку для всех поддерживаемых платформ или выбрать только одну платформу.

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

Nx7BBPjHD6Dn3bwH9cHuv7Kl0buNiStKpAnK
Таблица поддержки Android для разных процессоров.

JNI

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

JNI – это аббревиатура от Java Native Interface. Это позволяет частям C++ и Java общаться друг с другом в самых простых терминах. К примеру, если вы хотите вызвать функцию с C++ в Java, вам следует написать интерфейс JNI для этой цели.

jipzVE6uvyBsaoSwHDAM9VifTSIZSa3YxXhk

Интерфейсом является native-lib.cpp, соединяющий код C++ с кодом Java. В приведенном выше примере единственным кодом C++ является сам JNI. Однако вы можете включить библиотеки, которые вы хотите использовать, и реализовать вызывающую их функцию. Эта новая функция может быть вызвана частью Java. Таким образом, он работает как мост.

Что делать, если вы хотите попробовать

Здесь у вас есть все необходимые базовые знания для использования C++ в вашем Android-проекте. Если вы желаете попробовать, вот как сделать обычный проект Android с кодом C++.

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

bnDl13uKInK-yDGhQnELCJQsNoBq-fuSV3A6
UQCYmz05inEFug2gtN4fKEEoMmwEVJQbi0ca

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

WRXTaytqujH3hU1-1PJ6K83BphnZPVJ4MjGk

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *