Чому варто використовувати Android NDK у вашому наступному проекті

Android NDK (Native Development Kit) є дуже популярним інструментарієм, що використовується для розробки програм для мобільних пристроїв. Багато програм з магазину Android Market використовують компоненти, розроблені з використанням мов програмування, відмінних від Java, для досягнення максимальної продуктивності. Виходячи з цього NDK є інструментарієм, що допомагає розробникам створювати компоненти для своїх додатків з використанням компілюваних мов програмування для різних цілей, починаючи з досягнення оптимальної продуктивності і закінчуючи спрощенням коду, що використовується.
Для чого і як використовується бінарний код
Що стосується розробки програм для Android, описаний вище фактор є незначним недоліком. Але програмування на мові Java може виявитися досить складним через постійне ускладнення коду та утруднення його розуміння. Більше того, використання мультиплатформенного байткоду та віртуальної машини обумовлює значні витрати обчислювальних ресурсів пристрою.
Іншим важливим фактором, який потребує уваги, є мультиплатформний код. Якщо нам потрібно створити програму для безлічі апаратних платформ, ми можемо переписати більшу частину коду, що відноситься до контролера та відображення, для кожної з платформ, що є не найрозумнішим рішенням. Але весь код, що відноситься до контролера, повинен бути обов'язково портований мовами C і C + +, так як практично всі мобільні платформи підтримують їх; таким чином, якщо нам вдасться реалізувати логіку в рамках бібліотек мовами C та C++ та згодом використовувати її на кількох платформах, нам вдасться максимально скоротити втрати продуктивності програми. У таких випадках ми будемовикористовувати код мовами C і C++ разом із звичним кодом мовою Java або "мультиплатформним кодом".
При використанні компілюваної мови програмування вихідний код компілюється безпосередньо в машинний код для центрального процесора, а не в проміжне уявлення, таке, як у Java. Таким чином, розробники додатків можуть створювати додатки з оптимальною продуктивністю для різних Android-пристроїв. Фрагменти компілюваного коду можуть бути структуровані в рамках однієї бібліотеки, що розділяється, функції з якої можуть викликатися з коду на мові Java. Окрема бібліотека, що розділяється, повинна створюватися для кожної з підтримуваних архітектур центральних процесорів. Більшість її вихідного коду у своїй може залишатися незмінною. Скомпільовані бібліотеки, що розділяються, повинні бути додані у файл .apk вашої програми. З урахуванням всього вищесказаного, фундаментальна модель додатків Android не зміниться.
Використання Android NDK
Android NDK є інструментарієм, що дозволяє реалізовувати частини додатка для Android такими компільованими мовами програмування, як C і C++ і містить бібліотеки для управління активностями і доступу до фізичних компонентів пристрою, таким, як різні сенсори і дисплей.
Android NDK інтегрований з інструментами з набору компонентів для розробки програмного забезпечення (Android SDK), а також з інтегрованим середовищем розробки Android Studio або застарілим середовищем розробки Eclipse ADT. Однак, NDK не може використовуватися окремо.
Принцип роботи Android NDK
Ми можемо використовувати ключове слово native для того, щоб компілятор знав, що цей фрагмент реалізований в рамках коду, що компілюється. Наприклад:
Також у процесіСкладання проекту створюються бібліотеки, що розділяються (Native Shared Libraries, з розширенням .so ) і статичні бібліотеки (Native Shared Libraries, з розширенням .a ), які можуть зв'язуватися з іншими бібліотеками. Бінарний інтерфейс програми (Application Binary Interface, ABI) використовує бібліотеки, що розділяються з розширенням .so для виконання машинного коду в системі в процесі роботи програми.
Весь компилюваний код виконується за допомогою інтерфейсу під назвою Java Native Interface (JNI), який дозволяє зв'язати один з одним компоненти мовами Java та C/C++.
Для складання проекту за допомогою сценарію ndk-build нам доведеться створити два файли: Android.mk та Application.mk . Обидва ці файли повинні розміщуватися в директорії JNI. Файл Android.mk описує модуль та його ім'я, прапори збірки, використовувані бібліотеки, файли вихідного коду, які повинні компілюватися, а файл Application.mk - бінарні модулі, необхідні для роботи програми.
Встановлення та використання Android NDK в Ubuntu
Android NDK поставляється у форматі архіву, що саморозпаковується. З цієї причини нам доведеться лише встановити біт виконання та розпакувати його:
В результаті компоненти NDK будуть збережені у поточній робочій директорії.
Розпакування в ручному режимі
Зважаючи на те, що файл з розширенням .bin є нічим іншим, як архівом формату 7-Zip, що саморозпаковується, ми можемо витягти його вміст вручну за допомогою наступної команди:
Пакет із компонентами архіватора 7-Zip доступний з офіційного репозиторію Ubuntu і може бути встановлений, наприклад, за допомогою команди apt-get:
Встановлення за допомогою Android Studio
Ми можемо встановити Android NDK за допомогою SDK Manager безпосередньо з Android Studio.
Дляцього після відкриття проекту слід здійснити перехід у рамках головного меню вікна Tools > Android > SDK Manager. Після цього потрібно встановити прапорці навпроти назв компонентів LLDB, CMake та NDK. Далі потрібно просто застосувати зміни за допомогою відповідної кнопки.
Створення або імпорт проекту з бінарними компонентами
Після налаштування Android Studio ми можемо створити новий проект із підтримкою мов програмування C/C++. Однак, якщо нам потрібно додати або імпортувати існуючий код цими мовами в проект Android Studio, ми будемо змушені виконати наведені нижче дії.
Для початку слід створити нові файли вихідного коду з використанням згаданих мов програмування та додати їх до проекту, відкритого в Android Studio. Ми можемо пропустити цей крок, якщо в проекті вже є подібні файли або нам потрібно імпортувати попередньо скомпільовану бібліотеку.
Сценарій складання CMake дозволяє повідомити однойменну систему складання про те, як потрібно здійснювати компіляцію файлів вихідного коду та складання результуючої бінарної бібліотеки. Цей файл також необхідний для імпорту та зв'язування з нашою бібліотекою бібліотек, що існують або постачаються в комплекті NDK. Ми також можемо без будь-яких наслідків пропустити цей крок у тому випадку, якщо в комплекті поставки нашої існуючої бінарної бібліотеки вже міститься файл сценарію збірки CMakeLists.txt або вона використовує компонент ndk-build і в комплекті поставки міститься файл сценарію збірки Android.mk .
Далі слід повідомити Gradle про існування нашої бінарної бібліотеки, вказуючи шлях до файлу сценарію збірки CMake або ndk-build . Gradle використовує вказаний сценарій збирання для імпорту вихідного коду в проект Android Studio таупаковки результуючої бінарної бібліотеки (файла з розширенням .so) у файл пакету формату APK.
Важливе зауваження:якщо в рамках проекту використовується застарілий інструмент ndkCompile , нам доведеться відкрити файл build.poperties і видалити з нього наступний рядок коду перед налаштуванням Gradle з метою використання CMake або ndk-build:
Тепер ми можемо зібрати і виконати нашу програму шляхом натискання на кнопку Run. Gradle розглядатиме процес CMake або ndk-build як залежність, яка має бути зібрана, здійснювати складання бінарної бібліотеки та упаковувати її у файл пакету формату APK.
Після запуску програми на пристрої або емуляторі ми зможемо використовувати функції різних інтегрованих середовищ розробки, таких, як Android Studio, для його налагодження.
Все це свідчить про важливість Android NDK для розробників програм для платформи Android. Наприклад, даний набір програмних компонентів дозволяє творцям ігрових двигунів краще оптимізувати версії своїх продуктів для Android, в результаті чого вони будуть видавати більш вражаючі графічні ефекти, витрачаючи на них менше системних ресурсів.
Процес створення простої програми на основі Android NDK не пов'язаний з будь-якими складнощами. Однак, кожному розробнику слід усвідомити один важливий момент: набір програмних компонентів Android NDK розроблявся для використання у певних випадках і не повинен застосовуватись при розробці будь-яких програм.
Android NDK може допомогти в процесі розробки програми, так і максимально ускладнити його. Не є таємницею і те, що використання бінарного коду на платформі Android у деяких випадках не призводить до помітного підвищення продуктивності програми (хоча в більшості випадківйого продуктивність все ж таки підвищується), але при цьому воно в будь-якому випадку ускладнює його код. Зазвичай підвищення продуктивності додатків досягається завдяки використанню коду зі специфічними для використовуваного центрального процесора інструкціями. Але у загальному випадку рекомендується використовувати NDK лише тоді, коли продуктивність програми є критично важливим параметром, а чи не тоді, коли розробнику зручніше писати код мовами C/C++.
Як висновок слід сказати про те, що не існує непорушних правил, що регламентують можливі випадки використання NDK, тому вам завжди варто звертатися до своїх знань, досвіду та інтуїції.