ANDROID NDK
Android NDK
Ko’pchiligimiz dasturlash tilini o’rganishni C yoki C++ dan boshlaganmiz. Shundan so’ng, ba’zilar Java yoki Python yoki umuman boshqa tilni o’rganib Web yoki Androidda davom etishi mumkin. Android haqida gapirganda, biz odatda Java yoki Kotlin tillaridan dasturlash uchun foydalanamiz. C yoki C++ tilllarinichi? Ularni Android ilovani yaratishda ishlata olamizmi? Ha, siz dasturlash tilini o’rganish bosqichida, ya’ni C yoki C ++ ni o’rganayotganda ishlatgan kodingizni Androidda ishlatishingiz mumkin.
Bu maqolada biz Android ilovalarini ishlab chiqishda native tildan foydalanishni o’rganamiz va quyidagi mavzularni ko’rib chiqamiz:
NDK o’zi nima va nima uchun ishlatiladi?
…
JNI nima?
…
Dastlabki o’rnatiladigan Uskunalar
…
«Hello World!» misoli Android NDK da
…
«Calculator App» dasturi Android NDK da
…
Native tilning foydalanishdagi kamchiliklari
Qani boshladik.
NDK o’zi nima va nima uchun ishlatiladi?
NDK yoki Native Development Kit — bu Android ilovasida C yoki C ++ kodidan foydalanish uchun Android tomonidan taqdim etilgan kutubxona to’plami. Agar siz Android Studio 2.2 yoki undan yuqori versiyasini ishlatayotgan bo’lsangiz, Android ilovangizda C yoki C ++ dan foydalanishingiz mumkin bo’ladi.
Ammo Android dasturlash uchun asosiy bo’lgan Java va Kotlin tillaridan foydalanish aksar holatlarda tavsiya etiladi. Xo’sh, unda nima uchun native tillaridan foydalanish kerak? Keling, Androidda native tillaridan foydalanishning afzalliklarini bilib olamiz:
1. Juda Tez: Barchangiz bilganingizdek, Java kodini kompyuter tushunadigan darajadagi kodga aylantirish uchun JVM ga, so’ngra JNI ga murojaat qilishimiz kerak. Kotlin bilan ham xuddi shunday jarayon takrorlanadi, chunki Kotlin ham Java ustiga qurilgan. Ammo, NDK .so faylini yaratish orqali to’g’ridan to’g’ri native kodni, ya’ni C yoki C ++ kodini kompyuter tushunadigan tilga olib kelish mumkin. Bu Java/Kotlin uchun zarur bo’lgan o’rtadagi bosqichlarni yo’lingizda olib tashlashga yordam beradi.
2. Koddan qayta foydalanish: Android ilovangizda C yoki C ++ da yozilgan kodni turli platformalar uchun qayta ishlatishingiz mumkin. Siz o’zingiz C yok C++ yozgan kodlaringizni yoki umuman boshqalarning kodlaridan Android ilovangizni yaratishda foydalanishingiz ham mumkin bo’ladi.
Demak har qanday vaqtda katta tezlikda ishlaydigan yuqori darajadagi ilovalarni yaratishni xohlasangiz yoki native tilda yozilgan biror bir kodni ishlatmoqchi bo’lsangiz, C yoki C ++ dan foydalanishingiz mumkin. Tezlik faktori tufayli game developer larning aksariyati o’z o’yinlarini yaratishda C yoki C++ tilllaridan foydalanadilar. Shuningdek, Android ilovada C yoki C++ kodlaridan foydalanish ular uchun ancha osonroq ishga aylanadi.
Agar siz dasturingizda Java/Kotlin hamda native tillaridan birgalikda foydalanmoqchi bo’lsangizchi? Bu eng ko’p ishlatiladigan holat. Java kodini C++ bilan ishlatish mumkinmi va aksincha? Java kodi native kod bilan qanday aloqa o’rnatadi? Aloqa JNI tomonidan amalga oshiriladi. JNI nima? Keling, uni ham o’rganamiz.
JNI nima?
JNI yoki Java Native Interface — bu sizning Java/Kotlin va C/C ++ kodingiz o’rtasidagi interfeys. U Android tomonidan ishlab chiqarilgan bayt kodining native kod bilan aloqa qilishiga imkoniyat yaratib beradi.
«Hello World!» ni yozishdan oldin, Android NDK tarkibidagi primitive data tiplarini o’rganib chiqamiz.
E’tibor bersangiz, har qanday ma’lumot turidan oldin «j» harfini qo’shishni o’zi kifoya. Masalan, int «jint», bayt «jbyte» va shu ko’rinishda davom etadi.
NDK ni qo’llab quvvatlash uchun Android Studio ga ba’zi SDK vositalarini qo’shish kerak bo’ladi. Keling, bu vositalar nima ekanligini va ularni qanday yuklab olishni ko’rib chiqamiz.
Dastlabki o’rnatiladigan vositalar
Android NDKni o’z ilovangizda foydalanishingiz uchun quyidagi 2ta vositani o’rnatishingiz kerak
1. NDK: C va C++ kodlarini yozish uchun ishlatiladigan Native Development Kit
2. CMake: Bu operatsion tizimda va kompilyatorga bog’liq bo’lmagan holda dastur yaratish
jarayonini boshqaradigan open source tizim.
Keling, yuqorida aytilganlarning barchasini Android Studio da qanday yuklab olishni ko’rib chiqamiz.
Quyida Android Studio ni ochganingizda ko’riladigan ekran paydo bo’ladi. Bosh ekranining pastki o’ng burchagida joylashgan Konfiguratsiya tugmasini bosing.
Ro’yxatdan SDK menejerini tanlang.
SDK tools qismida NDK va CMake tanlang. Bu iktasi tanlagandan so’ng, OK ni bosing va SDK tool lar yuklanishini kuting
SDK menejerini yoping va Android Studio ning bosh ekraniga qayting.
«Hello Word!» misoli Android NDK da
Mana endi biz Android NDK ni ishlatishga kerakli bo’lgan vositalarni yuklab oldik. Keling, tezda «Hello World!» ga o’tamiz. Loyiha yaratish uchun quyidagi bosqichlarni belgilab chiqamiz:
1. Android Studio ning bosh ekranini oching va yangi loyiha yarating.
2. Native C ++ shablonini tanlang va keyingisiga o’tkazing. Bu Android da native tilidan foydalanish uchun zarur bo’lgan barcha fayllarni o’z ichiga oladi.
3. Loyiha nomi, package nomi va boshqa tegishli ma’lumotlarni kiriting va keyingiga bosing.
4. C ++ kodi uchun ishlatmoqchi bo’lgan kompilyatorni tanlashingiz mumkin. Biz standart sozlamalardan foydalanmoqdamiz. Finish tugmasini bosing.
Quyida C ++ shablonini tanlaganingizdan so’ng yaratiladigan loyiha tuzilishi keltirilgan.
Bu yerda siz odatdagidek java katalogidan tashqari, cpp nomli yana bitta katalog mavjud bo’lib, unda barcha native fayllar va CMakeLists.txt fayli bor. Default holatda, bizda C ++ kodini o’z ichiga olgan bitta native-lib.cpp fayli bor. native-lib.cpp faylining kodi quyidagicha bo’ladi:
#include#include extern "C" JNIEXPORT jstring JNICALL Java_com_mindorks_androidndkexample_MainActivity_stringFromJNI( JNIEnv *env, jobject /* this */) { std::string hello = "Hello, World!"; return env->NewStringUTF(hello.c_str()); }
Yuqoridagi kodni o’rganib chiqamiz:
Bu C ++ kodi bo’lgani uchun ba’zi kutubxonalarni shu ko’rinishda belgilaymiz:
#include
Yuqoridagi misolda com_mindorks_androidndkexample package nomi, MainActivity activity nomi va stringFromJNI bu native koddan String qiymat qaytaradigan va Java/Kotlin kodda chaqiriladigan metod hisoblanadi.
Nihoyat, return orqali biz funktsiyadan salom satrini qaytarayotganimizni ko’rishingiz mumkin.
Hozircha biz native qismni tugatdik. Keling, Kotlin kodimiz orqali Nativeda yaratilgan funksiyalarni qanday chaqirishni ko’rib chiqamiz.
// Used to load the 'native-lib' library on application startup. init { System.loadLibrary("native-lib") }
Endi biz native-lib.cpp faylida ishlatilgan nomga ega bo’lgan Kotlin tashqi funktsiyasini e’lon qilishimiz kerak bo’ladi.
/** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ external fun stringFromJNI(): String
Nihoyat, native-lib.cpp faylida mavjud bo’lgan funktsiyadan quyidagi qiymatlarni olishingiz mumkin:
// Example of a call to a native method sample_text.text = stringFromJNI()
Yuqoridagi barcha kodlar sizning loyihangizda oldindan mavjud. Endi, shift+f10 tugmachalarini bosib ilovani ishga tushiring va natijani ko’ring.
«Calculator App» dasturi Android NDK da
Keling endi, foydalanuvchidan ma’lumot oladigan va quyidagi to’rtta amalni bajaradigan bitta kalkulyator ilovasini tuzamiz (biz faqat mantiqiy qismini qamrab olamiz):
- Qo’shish
- Ayirish
- Ko’paytirish
- Bo’lish
Xuddi «Hello, World!» misolida ko’rganimizdek biz birinchi o’rinda native-lib.cpp ichida metodlarimizni yaratishimiz kerak bo’ladi. Bunda «Calculator app» da biz yuqoridagi to’rtta operatsiyani bajarish uchun to’rt xil metodlarni yaratamiz.
//Addition function extern "C" JNIEXPORT jint JNICALL Java_com_mindorks_androidndkexample_MainActivity_add( JNIEnv *env, jobject, jint x, jint y) { //return an integer return x + y; } //Subtraction function extern "C" JNIEXPORT jint JNICALL Java_com_mindorks_androidndkexample_MainActivity_sub( JNIEnv *env, jobject, jint x, jint y) { //return an integer return x — y; } //Multiplication function extern "C" JNIEXPORT jint JNICALL Java_com_mindorks_androidndkexample_MainActivity_multiply( JNIEnv *env, jobject, jint x, jint y) { //return an integer return x * y; } //Division function extern "C" JNIEXPORT jint JNICALL Java_com_mindorks_androidndkexample_MainActivity_divide( JNIEnv *env, jobject, jint x, jint y) { //return an integer return x / y; }
Ko’rib turganingizdek yuqorida add(ikkita raqamni qo’shish uchun), sub(ayirish), multiply(ko’paytirish) va divide(bo’lish) nomli to’rtta funksiya keltirilgan. Har bir funktsiyani qaytuvchi qiymat tipi- jint. Bundan tashqari, har bir funksiya parametr sifatida ikkita integer ni oladi va ikkalasi ham jint tipiga kiradi.
Endi bizning keyingi vazifamiz Kotlin faylimizga native-lib faylini yuklash bo’ladi va bu uchun System.loadLibrary («native-lib») usuli bizga yordamga keladi.
// Used to load the 'native-lib' library on application startup. init { System.loadLibrary("native-lib") }
Endi, native-lib faylida ishlatilgan xuddi shu nomdagi to’rtta Kotlin tashqi metodlarini yaratamiz.
external fun add(x: Int, y: Int): Int external fun sub(x: Int, y: Int): Int external fun multiply(x: Int, y: Int): Int external fun divide(x: Int, y: Int): Int
Siz NDK uchun kerakli bo’lgan asosiy tushunchalarni barchasini ko’rib, to’rt funksiya orqali bajardingiz. Endi siz shu kabi funksiyalardan Java/Kotlin fayllarida ehtiyojingizga ko’ra foydalanishingiz mumkin bo’ladi.
Native tilning foydalanishdagi kamchiliklari
Native tilini ishlatishning kamchiliklari shundaki, agar siz APK Split yoki APK Bundle dan foydalanmasangiz, faqat NDK ning o’zidan foydalanish APK hajmini oshiradi. Ya’ni NDK Android arxitekturasiga asoslangan kompyuter o’qiydigan .so ko’rinishidagi faylni yaratadi. Misol uchun, agar bizda mips, x86, armeabi, armeabi-v7a, armeabi-v8a bo’lsa, u holda .so fayli barcha beshta arxitektura uchun alohida yaratilishiga tog’ri keladi. Agar bitta .so faylining o’lchami 5MB bo’lsa, shunda dastur hajmi 5MB bo’lishi kerak tog’rimi, yo’q, aslida u 5*5 = 25MB bo’ladi.
Agar siz APK Split yoki APK Bundle dan foydalanayotgan bo’lsangiz, siz har xil arxitektura uchun alohida, bizni misolimizda besh xil APK yaratasiz va beshta APK ning barchasini Play Store ga yuklaysiz. Shunda Play Store qurilmaning arxitekturasini o’zi aniqlab, so’ngra kerakli APK ni yuklab olish uchun taqdim etadi.
Xulosa
Biz bu maqolada Android ilovalarimizda C va C ++ kabi native tillaridan foydalanishni o’rgandik. Odatda, o’zaro cross-platform larda ilovalar bilan ishlayotganimizda yoki yuqori mahsuldorlikka ega bo’lgan ilovalarni yaratishimiz kerak bo’lsa, biz o’z dasturimizga native tillarni qo’shishimiz mumkin bo’ladi. Boshqa holatlarda, Java yoki Kotlin bilan ishlash tavsiya etiladi.
Manba:
Android Dasturlash
ANDROID NDK