Использование нативного кода, написанного на C или С++ — это тема, которую многие разработчики не затрагивают вовсе. Но порой использование C++ в приложениях намного упрощает/ускоряет разработку. В этой статье будут рассмотрены основные принципы работы с native кодом.
- Предварительная настройка
- Зачем нужен NDK?
- Java. Путешествие в Native (или туда и обратно)
- Создание файлов с C++ кодом
- Работа с Application.mk
- Работа с Android.mk
- Подключение библиотеки в Java и вызов C++ методов
Предварительная настройка
Если у вас ещё не настроен Eclipse, то читаем как настроить Eclipse для работы с Android. Только помимо того, что в статье сказано, при установке ещё необходимо выбрать и установить NDK плагин.
Так же вам необходимо установить CDT для Eclipse. Под Виндой вам вроде как ещё понадобиться установить Cygwin.
Теперь необходимо создать проект и прописать пути.
- Создать Android Application.
- Eclipse -> Window -> Preferences -> Android -> set path to SDK
- Eclipse -> Window -> Preferences -> Android -> NDK -> set path to the NDK
- Нажмите правой кнопкой мыши на проект и выберите Android Tools -> Add native support
Как делают мобильные приложения на JavaScript для начинающих
В проекте будет создана папка jni, где вы должны размещать файлы с C++ кодом. В ранних версиях был баг, когда Eclipse не мог верно настроить пути до некоторых хэдеров из NDK. В последней версии всё нормально. Просто очистите проект (Clean project), а затем перестройте его (Build project).
Зачем нужен NDK?
Думаю, необходимо предварительно объяснить, когда вообще стоит (и стоит ли?) использовать ndk. Многие советуют использовать C++, когда требуются какие-то большие/сложные вычисления. Что значит сложно? =/ В общем, лучше назову конкретные случаи, когда использование NDK оправдано:
- Работа с OpenGL ES. Думаю, большинство тех, кто использует NDK, юзают его как раз для написания игр.
- Использование кросс-платформенных движков, вроде кокоса.
- Самый очевидный случай — это когда вам надо использовать уже написанный на C++ код. За десятилетия на C++ уже куча всего написано. Зачем переписывать такие вещи на Java, если можно просто использовать эти Open Source наработки. Да и не всё можно переписать, думаю тот же openCV бессмысленно бы было переписывать, в том время когда можно просто подключить готовые исходники.
Возможности NDK огромны. Вы можете из Java вызывать C++ методы. В то же время, вам ничто не машет вызывать Java методы из C++. Даже есть возможность создавать приложение практически без использования Java, используя NativeActivity (API 9 и выше).
Java. Путешествие в Native (или туда и обратно).
Да простит меня профессор за упоминание его работы (: И так, рассмотреть всё в рамках одной статьи невозможно. Поэтому, для начала реализуем лишь вызов native методов из Java.
Как изучать программирование на телефоне? C++, Python, Java и пр.
Перечислю кратко основные моменты при работе с native:
- Создание файлов с C++ кодом.
- Определение C++ методов для экспорта.
- Создание .mk файлов.
- Генерация библиотеки.
- Подключение библиотеки в Java и вызов C++ методов.
Создание файлов с C++ кодом
В native определим всего 3 метода: передача строки, изменение строки, получение строки.
Создадим для начала файл def.h, подключим пару нужных файлов и определим методы для вывода в консоль.
#include #include #include #include #ifdef __ANDROID__ #define LOG_TAG «MyNative» #define STRINGIFY(x) #x #define LOG_TAG __FILE__ «:» STRINGIFY(__MyNative__) #define LOGI(. ) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(. ) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #endif
Создадим файл MyNative.h и определим в нём спецификации методов для экспорта, чтоб вызывать их из Java кода потом.
#include #include char MyStr[80]; extern «C»
Теперь все три метода можно вызвать из Java кода. Я этот код ручками писал. Но можно заюзать javah, которая будет сама генерить эти заголовки. extern «C» нужен, чтобы компилятор C++ не менял имена объявленных функций.
Стоит немного сказать про наименование методов. Java_ — обязательный префикс. ru_suvitruf_androidndk, так как у нас пакет ru.suvitruf.androidndk, ну а дальше наименование класса и метода на стороне Java. В каждой функции в качестве аргумента имеется JNIEnv* — интерфейс для работы с Java, при помощи него можно вызывать Java-методы, создавать Java-объекты.
Второй обязательный параметр — jobject или j class — в зависимости от того, является ли метод статическим. Если метод статический, то аргумент будет типа jclass (ссылка на класс объекта, в котором объявлен метод), если не статический — jobject — ссылка на объект, у которого был вызван метод.
Ну и создадим MyNative.cpp с реализацией методов.
#include JNIEXPORT void Java_ru_suvitruf_androidndk_AndroidNDK_SetString(JNIEnv * env, jobject obj, jstring str)< jboolean isCopy; const char * Str; Str = env->GetStringUTFChars(str, strcpy(MyStr,Str); LOGI(«string = «%s»»,MyStr); > void ChangeStr() < strcat(MyStr,» and bb.»); >JNIEXPORT void Java_ru_suvitruf_androidndk_AndroidNDK_ChangeString(JNIEnv * env, jobject obj) < ChangeStr(); LOGI(«string after change = «%s»»,MyStr); >JNIEXPORT jstring Java_ru_suvitruf_androidndk_AndroidNDK_GetString(JNIEnv * env, jobject obj)< LOGI(«returned string = «%s»»,MyStr); return env->NewStringUTF(MyStr); >
Работа с Application.mk
В этом файле описаны глобальные настройки для сборки либы.
# Без этой строчки ничего не будет работать (: APP_STL:=stlport_static # Список модулей/либ, которые нужна забилдить. Они будут такие же как в LOCAL_MODULE в Android.mk файле APP_MODULES := AndroidNDK # Указываем под какой arm собирать. Не обязательный параметр. APP_ABI := armeabi armeabi-v7a # Платформа, под которую билдим. Не обязательный параметр.
APP_PLATFORM := android-10
Работа с Android.mk
Здесь указываем параметры/настройки по линковке и прочее, чтобы собрать либу.
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # имя нашего модуля, который будет вызываться в Java при помощи System.loadLibrary() LOCAL_MODULE := AndroidNDK LOCAL_DEFAULT_CPP_EXTENSION := cpp #список файлов, который нужно собрать LOCAL_SRC_FILES := MyNative.cpp #список библиотек из ndk, которые надо включить в сборку LOCAL_LDLIBS := -llog -landroid include $(BUILD_SHARED_LIBRARY)
В Android.mk вообще есть не мало всяких флагов и прочего. Можно добавлять в сборку уже готовые библиотеки и т.д. В следующих статьях напишу, как это делается.
После того, как вы создали C++ файлы и .mk сделали, можно забилдить проект, тогда в папке obj появится библиотека libAndroidNDK.so.
Подключение библиотеки в Java и вызов C++ методов.
Теперь остаётся только написать Java код. Сделаем простенькое приложение. Разместим поле для ввода текста, три кнопки (передача текста в native, изменение текста в native и возврат изменённой строки из native) и поле для нового текста, который получили из native кода.
Для того, чтобы использовать native методы создадим класс AndroidNDK.
public class AndroidNDK < // Загрузка модуля «AndroidNDK» — нативной библиотеки, в которой реализованы методы. // Название этого модуля задается в файле Android.mk. static < System.loadLibrary(«AndroidNDK»); >public static native void SetString(String str); public static native void ChangeString(); public static native String GetString(); >
Этот код выполнит загрузку нашей библиотеки, в которой реализованы методы. Обратите ещё раз внимание на этот класс и методы и вспомните наименование методов при экспорте в native коде: Java_ru_suvitruf_androidndk_AndroidNDK_ChangeString.
Java код по обработке нажатий на кнопки писать не буду, ибо это тривиальная задача. В любом случае, если понадобиться, можете посмотреть в исходниках к статье. В логе будет вот что:
Для знакомства с native достаточно написал. Можете скачать исходники AndroidNDK.rar.
Источник: suvitruf.ru
Введение в разработку Android-приложений
Аннотация: Краткая история ОС Android. Intel для Android: партнерство и инструментарий разработчика. Архитектура приложений для Android. Ресурсы приложения. Пользовательский интерфейс.
Инструментарий разработки приложений для Android. Обзор шагов разработки типичного приложения под 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), а также проверить репозиторий на наличие доступных, но еще не установленных пакетов и архивов.
Рис. 1.1. Окно SDK Manager, в котором разработчику предоставляется возможность выбрать версии Android API для установки
Android Native Development Kit (NDK) позволяет осуществлять разработку Android -приложений на языке C/C++. Зачем это может потребоваться? Есть несколько причин. Например, необходимость использовать код, который уже написан для нативной платформы, или ускорение выполнения критических кусков кода.
1.3. Архитектура Android
Рассмотрим основные компоненты операционной системы Android (Рис. 1.2).
Applications. Android поставляется с набором основных приложений, включающим календарь, карты, браузер , менеджер контактов и другие. Все перечисленные приложения написаны на Java .
Application Framework. Предоставляя открытую платформу разработки, Android дает разработчикам возможность создавать гибкие и инновационные приложения. Разработчики могут использовать аппаратные возможности устройства, получать информацию о местоположении, выполнять задачи в фоновом режиме, устанавливать оповещения и многое другое. Разработчики имеют полный доступ к тем же API , что используются в основных приложениях.
Архитектура приложений разработана с целью упрощения повторного использования компонентов; любое приложение может «публиковать» свои возможности и любое другое приложение может затем использовать эти возможности (с учетом ограничений безопасности). Этот же механизм позволяет заменять стандартные компоненты на пользовательские.
Рис. 1.2. Архитектура операционной системы Android
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 – механизм базы данных, доступной для всех приложений.
Android Runtime. Android включает в себя набор основных библиотек, которые обеспечивают большинство функций, доступных в библиотеках Java . Каждое приложение Android работает в своем собственном процессе, со своим собственным экземпляром виртуальной машины Dalvik. Dalvik была написана так, что устройство может работать эффективно с несколькими виртуальными машинами одновременно.
Dalvik проектировалась специально под платформу Android . Виртуальная машина оптимизирована для низкого потребления памяти и работы на мобильном аппаратном обеспечении. Dalvik использует собственный байт-код. Android -приложения переводятся компилятором в специальный машинно-независимый низкоуровневый код. И именно Dalvik интерпретирует и выполняет такую программу при выполнении на платформе. Кроме того, с помощью специальной утилиты, входящей в состав Android SDK , Dalvik способна переводить байт-коды Java в коды собственного формата и также исполнять их в своей виртуальной среде.
Linux Kernel. Android основан на Linux версии 2.6 с основными системными службами – безопасность , управление памятью , управление процессами и модель драйверов. Разработчики Android модифицировали ядро Linux, добавив поддержку аппаратного обеспечения, используемого в мобильных устройствах и, чаще всего, недоступного на компьютерах.
1.4. Обзор Java-интерфейсов
Для прикладного программиста Android – это набор интерфейсов на языке Java . Рассмотрим, как он организован. В основе набора – пакеты, входящие в стандарт языка Java , такие как java .util, java .lang, java .io. Они есть на любой платформе, где могут быть запущены java -приложения, и неспецифичны для Android . К ним примыкают расширения, которые не входят в стандарт языка – пакеты javax. net , javax.xml и другие. Но самым большим и интересным является набор интерфейсов, созданных специально для Android . Рассмотрим некоторые из его пакетов.
Пакеты android.view и android.widget отвечают за графический интерфейс пользователя ( Graphical User Interface ). Они содержат набор встроенных виджетов, таких как кнопки и поля ввода, разметки для расположения виджетов на экране. С их помощью можно создать простейшее Android — приложение .
Для работы с примитивами рисования и графическими файлами предназначен пакет android.graphics , а с помощью android.animation можно создавать несложную анимацию.
Пакет android.opengl предоставляет движок OpenGL , android.gesture осуществляет поддержку управления жестами на сенсорном экране, позволяет распознавать жесты и создавать новые.
Большое количество интерфейсов предназначено для коммуникации. Пакет android.net включает стеки сетевых протоколов высокого уровня, таких как HTTP и SIP , поддержку Wi-Fi. Пакет android.webkit – популярный движок веб-браузера, который позволяет легко отображать веб-страницы в приложении. Пакеты android.bluetooth и android.nfc предоставляют стеки протоколов связи на коротких расстояниях BlueTooth и Near Field Communication соответственно. Пакет android.telephony дает доступ к телефонной функциональности – например, отправка SMS .
Для управления прикладными приложениями предназначен пакет android.app . Пакет android.hardware позволяет обращаться к камере и датчикам, а пакет android.location предоставляет информацию о географических координатах устройства, в том числе с помощью датчика GPS .
Пакет android.media отвечает за кодирование звуковых и видео потоков, для мобильных устройств это до сих пор вычислительно сложная задача, требующая качественной оптимизации. Пакет android.database предоставляет доступ к базам данных.
Источник: intuit.ru
Как работает Android. Введение для Java-разработчиков
Среди программистов на Java то и дело слышны разговоры о разработке под Android. Именно Android держит Java на первом плане в последние несколько лет. Насколько же важно понимать или знать Android для разработчиков на Java? Ну, зависит от того, нравится ли вам разработка приложений и хотите ли вы, чтобы вашими приложениями пользовалось множество людей. Если да, то Android даст вам эту возможность.
Количество телефонов под управлением операционной системы Android исчисляется миллионами и продолжает расти быстрее, чем число iPhone с iOS. Это значит, что для Java-разработчика очень даже имеет смысл научиться программировать под Android, чему эта статья как раз и посвящена. Кроме того, это одна из хороших причин вообще научиться программировать на Java.
Из этого обзора вы узнаете основы работы Android, без лишних подробностей, но в достаточном объеме. Одно очевидное преимущество Java-разработчиков над остальными – то, что API Android очень похоже на API языка Java, и Android поддерживает если не все доступные в J2SE SDK классы, то, по крайней мере, наиболее важные. Еще одно преимущество: вы можете использовать для разработки под Android те же инструменты, что и для Java. Например, IDE Eclipse, ведь Google предоставляет для Eclipse плагин для разработки приложений Android. В начале работы с Android, имеет смысл заглянуть в такие руководства, как Head First Android Development и Android in Action (3-е изд.) – две лучшие книги по Android для Java-разработчиков.
Напротив, если вы захотите заняться разработкой под iOS, вас ждёт непростой процесс изучения языка Objective-C и SDK iOS. Мне кажется, переход на Objective-C и iOS имеет больше смысла для C++-разработчика, чем для «джависта». Так что классическая война между Java и C++ продолжается благодаря разработке приложений для смартфонов. В любом случае давайте разберемся в особенностях внутреннего функционирования Android.
Как работает Android?
Как я уже упоминал, в операционной системе Android для разработки приложений используется Java. Вы можете написать код приложения для Android с помощью предоставляемого Google API Java, который затем будет скомпилирован в файлы классов. На этом схожесть заканчивается.
Android не использует виртуальную машину Java (JVM) для выполнения файлов классов, вместо этого, в нём используется виртуальная машина Dalvik, не являющаяся истинной JVM и не работающая с Java-байткодом. Для выполнения на виртуальных машинах Dalvik, файлы классов компилируются в формат DEX (Dalvik EXecutable – исполняемые файлы Dalvik).
После преобразования в формат DEX, файлы классов вместе с другими ресурсами объединяются в пакеты Android (APK) для распространения и инсталляции на различных устройствах. Главное, что следует знать: в основе базовой библиотеки классов виртуальной машины Dalvik лежит подмножество проекта Apache Harmony, вследствие чего она не поддерживает всё API J2SE. Если вы используете для написания кода приложений под Android IDE Eclipse, можете особо не волноваться, поскольку там есть автодополнение кода. Теперь давайте разберемся, как приложения Android выполняются на устройствах.
Как приложения Android выполняются на устройствах?
Если вам знакома операционная система Linux и понятие процесса, вам будет несложно понять, как выполняются Android-приложения. По умолчанию, операционная система Android присваивает каждому приложению уникальный идентификатор пользователя. После запуска приложений Android, каждое из них выполняется в своём процессе, в своей собственной виртуальной машине.
По мере необходимости, операционная система Android управляет запуском и остановом процессов приложений. Это значит, что все приложения Android работают изолированно друг от друга, но, разумеется, могут запрашивать доступ к аппаратным и другим системным ресурсам.
Если вы знакомы с разработкой мобильных приложений, допустим, в J2ME, то, наверняка, сталкивались с понятием прав доступа (permissions). При установке или запуске приложения Android, оно запрашивает права, необходимые для доступа к интернету, телефонной книге или другим системным ресурсам. Пользователь явным образом предоставляет эти права, иначе в действии будет отказано.
Все эти права доступа описываются в файле манифеста приложения Android. В отличие от Java, манифест Android представляет собой XML-файл, в котором перечислены все компоненты приложения и настройки для них. Четыре основных компонента приложения Android: активности, сервисы, поставщики контента и широковещательные приемники (broadcast receivers).
Из них чаще всего встречаются активности, соответствующие отдельной экранной форме приложения Android. Например, в игре для операционной системы Android может быть несколько экранов: для входа в систему, рекордов, инструкций и экран самой игры. Каждый из этих элементов соответствует различным активностям в вашем приложении.
Как и в Java, в ОС Android хорошо то, что она выполняет некоторые задачи вместо разработчика, например, создает объекты активностей. За организацию активностей отвечает класс System . Если нужно запустить активность, достаточно вызвать метод startActivity() с объектом Intent в качестве параметра. В ответ на этот вызов, класс System или создаст новый объект активности или повторно использует старый.
Аналогично сборке мусора в языке Java, отвечающей за чрезвычайно важную задачу повторного использования памяти, Android управляет запуском, остановом, созданием и уничтожением приложений. Может показаться, что он слишком сильно их ограничивает, но это не так. Android предоставляет события жизненного цикла, которые можно переопределять для вмешательства в этот процесс.
Вот и всё о том, как работает Android. Java-разработчику, безусловно, имеет смысл изучить Android, поскольку эта система использует Java, так что вы сможете воспользоваться своими знаниями методик программирования на Java, паттернами проектирования и рекомендуемыми практиками для создания хороших приложений Android.
Конечно, вам придется приспособиться к некоторым специфическим для Android вещам, но это придёт само собой со временем. Итак, чего же вы ждёте? Вперёд, изучайте Android и пишите ваше первое Android-приложение HelloWorld! Наконец, можете взглянуть на некоторые хорошие книги, посвященные основам разработки на Android, например, Head First Android Development – лучшую из посвященных Android книг. Источник: Introduction of How Android Works for Java Programmers
Источник: javarush.com