- Работаем с кодом C/C++ на Android: основы Android NDK и Java Native Interface
- NDK or not to NDK?
- С чего начинается NDK
- Дорога из Java в натив и обратно. Некоторые правила движения по этой дороге
- Описание нативных методов в Java
- Описание нативных методов в C/C++
- Сборка нативного кода при помощи ndk-build
- Живой пример
- Полезные и очень полезные ссылки
- Вакантное место: ведущий Android разработчик в компании Softeq Development
- Что будете делать Вы?
- Что нужно от Вас?
- Большим плюсом будет:
- Контактная информация:
- 8 лучших редакторов кода для мобильных устройств
- Dcoder
- Turbo Editor
- Quoda
- QuickEdit
- Our Code Editor Free
- Android Web Developer (AWD)
- Android Interactive Development Environment (AIDE)
- Codeanywhere
Работаем с кодом C/C++ на Android: основы Android NDK и Java Native Interface
Исользование нативного кода, написанного на C или С++ — это тема которая затрагивается большинством разработчиков в лучшем случае поверхностно. И чаще всего это оправданно, так как использование нативного кода на порядок усложняет процесс разработки приложения и случаи, когда использование Android NDK действительно оправданно можно пересчетать на пальцах одной руки опытного токаря. Из этой статье вы сможете получить действительно базовый навыки работы с NDK, включая использование STL_PORT, полезной утилиты javah и пару моих мыслей о том, когда применение NDK себя оправдывает.
NDK or not to NDK?
Статьи о NDK принято начинать с описания случаев, когда использование NDK уместно. Не буду отходить от этой традиции с смысле последовательности, но отойду от ее содежательной части.
Часто рекомендуют использовать NDK для «сложных вычислительных процессов». Признаться честно, я не уверен, что кто-то занимается вычислением числа π при помощи своего Android-девайса. Поэтому я перечислю те случаи, которые, на мой взгляд, явлются «NDKable» в порядке возрастающей важности:
- Работа с OpenGL ES
- Использование кросс-платформенных игровых движков, например Cocos2Dx
- Использование уже написанного на C/C++ кода (а его ох как дофига написано!). Часто, это работа с мультимедиа, например FFMPEG, libpng или наукоемкие вещи типа openCV
Таким образом, работа с NDK чаще всего представляем из себя процесс (часто — мучительный) сборки некой библиотеки под ARM и написиние оберток (wrappers) на нативные методы. В тоже время, сейчас есть возможность ваять приложение практически без использования Java, используя NativeActivity (API 9 и выше).
Если говорить о возможностях NDK, то они обширны. Мы можем вызывать Java-методы и обращаться к объектам в нативном коде, так же мы можем вызывать нативные методы из Java-кода. Нативный код можно дебажить, можно настроить Eclipse так, что работать с ним будет так же просто, как работать с Java-кодом. Но эти вещи тянут на отдельную статью и сегодня касаться их мы не будем.
- Вызывать нативные меоды из Java
- Использовать в нативном коде C++ и STL_PORT
- Писать make-файлы и использовать полезную утилиту javah
С чего начинается NDK
Забегая вперед, скажу сразу: забудьте о Windows, если хотите работать с NDK. Я не явлюясь противником технологий Microsoft (как и любых технологий в принципе), но сборка проекта под виндой с использованием Cygwin — это не самое веселое занятие, тем более наукой не зафиксированно ни одного случая успешной сборки того же FFMPEG в среде Windows (если вам известен такой случай, буду рад узнать подробности ).
Так что первый шаг — это поставить какой-нибудь UNIX.
Допустим, первый шаг уже выполнен, второй — это скачать сам NDK (естественно, вы уже должны располагать стандартным набором Android-инструментов: JDK, Android SDK, ADT, Eclipse).
Следующий шаг — это добавление папки с NDK в системные пути, на Mac OS X это делаюется добавлением следующих строчек в файл .profile:
Для проверки запустите (или перезапустите терминал если он был запущен) и попробуйте ввести «ndk» после чего нажать клавишу tab, если при этой вы наблюдаете примерно следующий вывод в консоли:
то вы все сделали правильно
С установкой мы завершили, теперь я рекомендую вам зайти в папочку с NDK и ознакомится с файлом documentation.html, после чего можно глянуть папку samples с поучительными примерами кода.
Дорога из Java в натив и обратно. Некоторые правила движения по этой дороге
Следующий 2 раздела опишут правила описания нативных методов как со стороны Java, так и со стороны C/C++ кода.
Описание нативных методов в Java
В учебном проекте мы определим 3 нативных метода, заниматься они будут большей часть бесполезной но показательной работой, а именно:
Эти методы примечательны следующим:
- Отсутсутвует реализация (тело метода)
- При объявлении метода используется модификатор native
Жизненно важной часть является вот эта часть кода:
Этот код выполнит загрузку модуля «tinymath» — нативной библиотеки, в которой и будут реализованы методы. Название этого модуля задается в файле Android.mk , но об этом позже.
Описание нативных методов в C/C++
Самая интересная и самая жуткая (на первый взгляд!) часть работы.
Для того чтобы связать Java-методы с нативными создадим в папке проекта папку jni , в ней создайте следующие файлы:
- Android.mk — основные параметры для сборки приложения с нативным кодом
- Application.mk — дополнительные параметры
- by_idev_jni_NativeUtils.h — хэдеры нативных функций (методов)
- tinymath.cpp — реализация нативных методов на C++
Мы не будем углубляться в суть первых двух, я приведу лишь их содержимое с небольшими комментариями, но очень рекомендую почитать документацию к NDK о которой говорил выше.
И так, файл by_idev_jni_NativeUtils.h будет выглядеть так:
Некисло… особенно если писать руками. Но мы рыками писать не будем, вы ведь заметили комментарий /* DO NOT EDIT THIS FILE — it is machine generated */ ? Так вот генерирует этот файл утилита javah (входит в стандартную поставку JDK), почитайте о ней вот тут, которой нужно скормить .class-файл. Вызов ее будет выглядеть вот так:
А вот конкретный пример:
Получаем готовый файл и радуемся, что есть такая полезная утилита как javah.
Теперь давайте разберемся в содержимом этого файла.
Этот самый extern «C» нужем потому, что компилятор C++ любит менять имена объявленных функций. После его вмешательства приложение не будет, поэтому мы запрещаем компилятору заниматься самодеятельностью с именами функций при помощи extern «C»
JNIEXPORT — необходимый для JNI модификатор. Типы данных с префиксом «j»: jdouble, jobject, jstring etc — это «отражения» объектов и типов Java в C/C++.
Дам подсказку, если вы откроете файл jni.h, то узнаете много интересного, в частности об этих самых типах:
Из описания следует, что работать с примитивными типами Java можно также как с примитивными типами C/C++. С объектами и массивами другая история и для нее нужна другая статья
Обратим внимание, что в каждой функции в качесте аргумента имеется JNIEnv* — интерфейс для работы с Java, при помощи него можно вызывать Java-методы, создавать Java-объекты и делать еще много всяких полезных Java-штук. Второй обязательный параметр — jobject или jclacc — в зависимости от того, является ли метод статическим. Если метод статический, то аргумент будет типа jclass (ссылка на класс объекта, в котором объявлен метод), если не статический — jobject — ссылка на объект, у которого был вызван метод.
Перейдем к реализации и файлу tinymath.cpp:
Если вы знакомы и с C, и с С++, то наверное заметили, что код написан с испозованием С++ специфичных вещей (string — часть STL). Обычно примеры работы с NDK приводят на C-коде, может быть из соображения простоты. Но как вы увидите далее, для того чтобы использовать C++ с элементами STL (к сожалению он поддерживается не полностью) не нужно прикладывать много усилий.
Давайте посмотрим на Android.mk:
И на Application.mk:
Надеюсь комментариев к коду будет достаточно, если у вас возникнут вопросы, вы запросто можете задать их на форуме или в комментариях к статье.
Вот почти и все, осталось собрать приложение.
Сборка нативного кода при помощи ndk-build
В начале статьи мы добавляли директорую с NDK в системные пути как раз для ускорения доступа к ndk-build.
Для сборки приложения в терменали выполните слеюдующие инструкции:
В ответ должны получить примерно следующее:
Если так и есть — то все в порядке, вас можно поздравить с первым NDK в папке проекта должны появится директории obj и libs с набором .a (статические библиотеки) и .so (динамические библиотеки) файлов.
Живой пример
Вы можете скачать исходники приложения SimpleJNI.
Запустив его вы сможете лицезреть это:
На этом все. Вернее конечно не все. Очень многое осталось за кадром (в том числе очень много вкусного), но я обязательно постараюсь освятить еще несколько темных углов JNI и NDK в будущих статьях
Полезные и очень полезные ссылки
На пути рыцаря-NDK возникнет немало трудностей, с которыми проще будет справиться, если почитать инфу, доступную по ссылкам ниже
- JNI 1.5 guide http://docs.oracle.com/javase/1.5.0/docs/guide/jni/
- JNI Design http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/intro.html
- JNI Tips for Android http://developer.android.com/guide/practices/design/jni.html
- Референс по C и С++ http://www.cplusplus.com/reference/
Вакантное место: ведущий Android разработчик в компании Softeq Development
Что будете делать Вы?
- разрабатывать приложения для мобильных Android устройств
- работать с заказчиками мирового уровня
Что нужно от Вас?
- опыт разработки под Android от одного года
- отличное знание основ Java
- отличное знание основ Android
- хорошее знание С/С++ и опыт работы с NDK
- знание принципов ООП и способность эффективно применять их в архитектуре приложения
- знание и умение применять на практике шаблоны проектирования
- английский язык: уметь уверенно читать и писать, разговорный приветствуется
Большим плюсом будет:
- опыт кросс-платформенного программирования
Сайт: www.softeq.by, www.softeq.com
Cтраничка в Facebook: http://www.facebook.com/pages/Softeq/110374298801
Страничка в VK: http://vk.com/club21079655
Контактная информация:
Ждем Ваше резюме на jobs@softeq.by!
Если вы хотите узнать о вакансии и нашей компании больше, Вы можете связаться с менеджером по персоналу Ириной Протащик:
Источник
8 лучших редакторов кода для мобильных устройств
Зачем нужен редактор кода в смартфоне? Это свобода писать код когда и где угодно. Предугадать, когда в голову придет гениальная идея (или понадобится срочно внести исправление в проект), невозможно. Зато вполне можно заранее установить приложение-редактор в смартфоне и в случае необходимости набирать код с большим удобством, чем в блокноте.
Dcoder
Как утверждается на сайте Dcoder, это самая быстрая мобильная IDE. Она доступна в веб-версии, а также в виде приложений для iOS и Android. Поддерживает большое количество языков (больше 35), включая HTML, CSS, JavaScript, C, C++, Python и Java.
В Dcoder есть автоматическое проставление парных скобок и создание отступов, подсветка синтаксиса. Также вы сможете выбрать тему оформления приложения.
Разработчики Dcoder гордятся маленьким весом своего приложения: всего 6MB. Такую легковесность удалось достичь благодаря использованию облачных компиляторов и облачного хранилища для кода. Но тут есть и обратная сторона: чтобы использовать приложение, нужно непременно быть онлайн.
Turbo Editor
Простой, но при этом мощный текстовый редактор для Android. Имеет открытый исходный код (т. е., при желании и должном умении вы сможете его усовершенствовать по своему вкусу). В этом редакторе вы найдете подсветку синтаксиса для HTML, XHTML, CSS, LESS, JavaScript, PHP, Python и многих других языков, а также режим чтения, автосохранение файлов при выходе из приложения, просмотр результатов работы в браузере.
Quoda
Quoda это простой в использовании редактор кода для Android. Как и другие редакторы в нашем списке, Quoda поддерживает много языков, включая C, C++, C#, CSS, HTML, Java, JavaScript, Lua, Markdown, PHP, Python, Ruby. Есть подсветка синтаксиса, расширенная клавиатура, функционал поиска и замены с применением регулярных выражений и учетом регистра.
В платной версии доступны автодополнение кода, интеграция SFTP/FTP(S) и облачных хранилищ, а также предпросмотр страниц в разметке HTML/Markdown (на планшетах).
QuickEdit
Быстрый, надежный редактор, в котором есть функционал для работы как с простым текстом, так и с кодом. Как утверждают разработчики этого приложения, к его отличительным особенностям можно отнести скорость работы и отзывчивость. По этим критериям QuickEdit превосходит многие аналогичные приложения.
В этом приложении вы найдете подсветку синтаксиса для 50 с лишком языков, возможность включать и выключать нумерацию строк, поддержку физической клавиатуры, плавную прокрутку, автоматическое определение кодировки, возможность отмены действий (без ограничений). Поддерживается доступ к файлам в облачных хранилищах.
Our Code Editor Free
Как следует из названия, этот редактор бесплатный (но есть показ рекламы). А как указано в описании на Google Play, это целая IDE для Android. Причем она может работать без подключения к интернету. Правда, в таком случае вам не удастся поработать с файлами в облачных хранилищах (а вообще такая возможность есть).
Android Web Developer (AWD)
AWD — это IDE для веб-разработки. Языков и форматов поддерживает не много: PHP, CSS, JS, HTML, JSON. Есть возможность дистанционной работы с проектами (по протоколам FTP, FTPS, SFTP, WebDAV).
В AWD вы найдете (среди прочего) подсветку синтаксиса, автодополнение кода, автоопределение кодировки файла, интеграцию Git (в платной версии), функционал поиска и замены с применением регулярных выражений, поддержку физической клавиатуры.
Android Interactive Development Environment (AIDE)
AIDE — это интегрированная среда разработки для создания Android-приложений прямо на Android-устройствах. Поддерживает Java, C/C++, HTML5, CSS и JavaScript.
В этом приложении вы найдете автодополнение кода, проверку ошибок, подсветку синтаксиса для Java и XML. Есть интеграция с Dropbox. Благодаря совместимости с Eclipse можно открывать Eclipse-проекты. Для профессиональной разработки поддерживается Git.
Отличительная черта этого приложения — интерактивные уроки кодинга с пошаговыми инструкциями (курс программирования на Java, Android-разработки, создания игр).
Казалось бы, все просто отлично, но в комментариях люди жалуются на невозможность сохранять файлы в бесплатной версии и на навязчивые предложения перейти на платный вариант.
Codeanywhere
IDE для работы на Android-устройствах. Включает в себя редактор кода, FTP-клиент и терминал. Поддерживает огромное количество языков (больше 100). Есть возможность подключения к сторонним сервисам (Dropbox, Google Drive, OneDrive, Amazon S3, Github, Bitbucket).
Если у вас нет собственного сервера, Codeanywhere может запустить для вас Linux-контейнер, в котором будут доступны, к примеру, WordPress, Drupal, Magento.
По мотивам статьи «Top 8 Code Editors for Mobile Application Development».
Источник