NDK — Android ilovalarida C va C++ kabi native tillarda yozilgan kodni build qilish hamda Kotlin yoki Java qismi bilan bog‘lash uchun ishlatiladigan vositalar to‘plami. To‘liq nomi Native Development Kit. NDK odatda yuqori unumdor hisoblash, mavjud C/C++ kutubxonasini qayta ishlatish, multimedia, o‘yin dvigateli va hardware’ga yaqin vazifalarda qo‘llanadi.
NDK Android ilovasining barcha qismini native tilda yozish majburiyatini bermaydi. Ko‘p loyihalarda interfeys va platforma bilan ishlash Kotlin yoki Java’da, hisoblashga og‘ir qism esa C yoki C++ da bajariladi.
Native kod
Android Runtime DEX bytecode’ni bajaradi, native kod esa qurilma protsessoriga mos machine code ko‘rinishida ishlaydi. Native kutubxona odatda .so fayl shaklida build qilinadi.
Masalan:
libnative.so
Application processi uni runtime’da yuklaydi.
ABI
Application Binary Interface protsessor arxitekturasi, register, calling convention va binary format qoidalarini belgilaydi.
Androidda keng ABIlar:
arm64-v8a;armeabi-v7a;x86_64;- ayrim eski yoki maxsus variantlar.
APK yoki App Bundle kerakli ABI uchun alohida native library saqlaydi.
Build tizimi
NDK loyihalarida ko‘pincha:
ishlatiladi.
CMake source fayllar, compiler option, include directory va dependencylarni belgilaydi. Gradle Android build jarayoni bilan integratsiyani boshqaradi.
Clang compiler
NDK toolchain C va C++ kodini Android target uchun compile qiladi. Zamonaviy NDK versiyalarida Clang asosiy compiler hisoblanadi.
Toolchain:
kabi qismlarni o‘z ichiga oladi.
JNI bilan aloqa
Kotlin yoki Java kod native functionni JNI orqali chaqiradi.
Kotlin tomoni:
external fun sum(a: Int, b: Int): Int
Native tomoni mos functionni implement qiladi.
Method nomi automatic naming qoidasi yoki explicit registration orqali bog‘lanadi.
Native library yuklash
Application native kutubxonani yuklaydi:
System.loadLibrary("native")
Bu libnative.so faylini qidiradi.
Library topilmasa yoki ABI mos bo‘lmasa UnsatisfiedLinkError yuz beradi.
C++ standard library
NDK C++ standard library implementationini taqdim etadi. Project odatda bitta compatible runtime variantidan foydalanadi.
Bir process ichida turli librarylar mos kelmaydigan C++ runtime bilan build qilinsa exception, allocator yoki type boundary muammosi yuz berishi mumkin.
Memory boshqaruvi
Native kodda memory safety JVM yoki Kotlin bilan bir xil darajada avtomatik emas.
Xavflar:
- buffer overflow;
- use-after-free;
- double free;
- memory leak;
- invalid pointer;
- race condition.
RAII, smart pointer, sanitizer va code review ishlatiladi.
Exception
C++ exception JNI boundary orqali Kotlin yoki Java exceptioniga avtomatik aylanmaydi.
Native exception boundary’dan chiqib ketsa process to‘xtashi mumkin.
Exception native qismda ushlanib, mos Java exception tashlanadi yoki error code qaytariladi.
Thread
Native kod o‘z threadlarini yaratishi mumkin. JNI environment threadga bog‘liq.
Native threaddan JVM obyektlari bilan ishlash uchun thread virtual machine’ga attach qilinadi.
Local reference va global reference lifecycle’i to‘g‘ri boshqariladi.
Performance
NDK quyidagi vazifalarda foyda berishi mumkin:
- image processing;
- codec;
- signal processing;
- physics;
- cryptography;
- game engine;
- existing native library.
Oddiy business logicni nativega ko‘chirish har doim tezlik bermaydi. JNI call va data conversion overhead yaratadi.
Data almashish
Katta array yoki bitmap JNI orqali nusxalanishi mumkin.
Performance uchun:
qo‘llanadi.
Har kichik element uchun JNI chaqirig‘i samarasiz.
Debugging
Native crash Kotlin stack trace’dan farqli bo‘ladi.
Asboblar:
- LLDB;
- native debugger;
- tombstone;
- symbol file;
- AddressSanitizer;
- HWASan;
- UndefinedBehaviorSanitizer.
Release binary symbol stripping qilinsa alohida debug symbol saqlanadi.
Native crash
Segmentation fault yoki abort butun application processini to‘xtatadi.
Crash reportda:
bo‘lishi mumkin.
Symbolication offsetlarni function va source qatoriga aylantiradi.
API level
NDK platform APIlariga minimal Android API level orqali murojaat qiladi.
Yangi native API eski qurilmada mavjud bo‘lmasligi mumkin.
Build target va runtime availability birgalikda tekshiriladi.
Dynamic symbol lookup ayrim holatda ishlatilishi mumkin.
NativeActivity
Android ayrim o‘yin yoki full-screen native ilovalar uchun NativeActivity modelini taqdim etadi.
Shunda activity lifecycle native code bilan boshqarilishi mumkin.
Biroq permission, UI va platforma xizmatlari uchun Android framework bilan integration baribir kerak.
Hajm
Har ABI uchun .so fayl qo‘shish universal APK hajmini oshiradi.
App Bundle device’ga faqat kerakli ABI’ni tarqatishi mumkin.
Link-time optimization, symbol stripping va dependency cleanup native hajmni kamaytiradi.
Security
Native kod sandbox ichida ishlasa ham memory corruption orqali application ichidagi data va capability xavf ostida qoladi.
Untrusted input:
native parserga berilganda qat’iy validation qilinadi.
Compiler hardening va yangilangan kutubxona muhim.
NDKdan foydalanish chegarasi
NDK Android SDK o‘rnini bosmaydi. Camera, notification, activity, permission va storage kabi platforma APIlari ko‘pincha Kotlin yoki Java wrapper orqali ishlatiladi.
Native qatlam aniq performance yoki portability ehtiyoji bo‘lganda qo‘shiladi.
Bog‘liq tushunchalar
Native Development Kit, Android, C++, JNI, ABI, CMake, Clang, Shared library, Native crash, Android Runtime, Memory safety