ANDROID NDK

ANDROID NDK

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.

android ndk 65e4b5685ebee

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.

android ndk 65e4b568e8253

Ro’yxatdan SDK menejerini tanlang.

android ndk 65e4b56977912

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.

android ndk 65e4b57400149

3. Loyiha nomi, package nomi va boshqa tegishli ma’lumotlarni kiriting va keyingiga bosing.

android ndk 65e4b5748c2ff

4. C ++ kodi uchun ishlatmoqchi bo’lgan kompilyatorni tanlashingiz mumkin. Biz standart sozlamalardan foydalanmoqdamiz. Finish tugmasini bosing.

android ndk 65e4b575128dd

Quyida C ++ shablonini tanlaganingizdan so’ng yaratiladigan loyiha tuzilishi keltirilgan.

android ndk 65e4b5759fd83

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):

  1. Qo’shish
  2. Ayirish
  3. Ko’paytirish
  4. 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