Bosh sahifa Wiki NDK

NDK

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

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:

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:

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