NDK (नेटिव डेवलपमेंट किट) Android के तहत C और C++ में एप्लिकेशन के भाग लिखने के लिए एक टूलकिट है। सामान्य Android SDK के विपरीत, NDK कोड को नेटिव लाइब्रेरीज़ (.so) में कंपाइल करता है जो वर्चुअल मशीन की परत के बिना सीधे प्रोसेसर के साथ काम करती हैं। Google NDK Guides, 2026 के अनुसार, NDK का उपयोग उच्च-प्रदर्शन कंप्यूटिंग, गेम्स, ऑडियो प्रोसेसिंग और मौजूदा C/C++ प्रोजेक्ट्स के पुन: उपयोग के लिए किया जाता है। JNI (जावा नेटिव इंटरफ़ेस) नेटिव कोड को Kotlin और Java से जोड़ता है।
मुख्य बातें
NDK (नेटिव डेवलपमेंट किट) C और C++ कोड को Android के लिए निष्पादन योग्य लाइब्रेरीज़ में क्रॉस-कंपाइल करने के लिए उपकरणों का एक सेट है। NDK में Clang कंपाइलर, libc++ मानक लाइब्रेरी, Android API हेडर फ़ाइलें और बिल्ड उपयोगिताएँ शामिल हैं। डेवलपर C या C++ में नेटिव कोड लिखता है, इसे .so फ़ाइलों (शेयर्ड ऑब्जेक्ट्स) में कंपाइल करता है और JNI के माध्यम से एप्लिकेशन से जोड़ता है।
NDK Android SDK को प्रतिस्थापित नहीं करता, बल्कि इसे पूरक करता है। सभी UI, लाइफसाइकिल और सिस्टम सेवाएँ Kotlin या Java में रहती हैं। नेटिव कोड विशिष्ट कार्यों को हल करता है: गणितीय गणनाएँ, क्रिप्टोग्राफी, कोडेक्स, गेम्स में भौतिकी। Google अनुशंसा करता है कि NDK का उपयोग केवल तब करें जब SDK आवश्यक प्रदर्शन या हार्डवेयर क्षमताओं तक पहुँच प्रदान नहीं करता।
NDK का इतिहास 2009 (NDK r1) से शुरू होता है। इस समय में, टूलकिट प्रयोगात्मक स्क्रिप्ट्स के सेट से CMake, LLDB डिबगिंग और प्रोफाइलिंग के समर्थन वाली परिपक्व प्रणाली तक विकसित हुआ है। 2026 तक, वर्तमान संस्करण NDK r27 है जिसमें Clang 19, C++20 का पूर्ण समर्थन और libc++ एकमात्र मानक लाइब्रेरी के रूप में है।
NDK डेवलपर को नेटिव API के माध्यम से Android की निम्न-स्तरीय क्षमताओं तक पहुँच प्रदान करता है। मुख्य उपयोग के मामलों में शामिल हैं: 3D ग्राफ़िक्स के लिए OpenGL ES और Vulkan के साथ काम करना, Oboe के माध्यम से ऑडियो प्रोसेसिंग, BoringSSL के माध्यम से क्रिप्टोग्राफ़िक संचालन और ARM के लिए NEON ऑप्टिमाइज़ेशन। ये सभी API C/C++ से उपलब्ध हैं और कंपाइलेशन के लिए NDK की आवश्यकता होती है।
इसके अलावा, NDK मौजूदा C/C++ लाइब्रेरीज़ को Kotlin में पुनर्लेखन किए बिना पुन: उपयोग करने की अनुमति देता है। यह विशेष रूप से C++ में लंबे इतिहास वाली परियोजनाओं के लिए प्रासंगिक है — गेम इंजन (Unity, Unreal Engine), कंप्यूटर विज़न लाइब्रेरीज़ (OpenCV) या क्रिप्टोग्राफ़िक पैकेज (OpenSSL)। ऐसे मामलों में, NDK वर्षों का विकास समय बचाता है।
| घटक | उद्देश्य |
|---|---|
| Clang | C++20 समर्थन के साथ C/C++ कंपाइलर |
| libc++ | मानक C++ लाइब्रेरी (NDK r27 में एकमात्र) |
| CMake | नेटिव लाइब्रेरीज़ के लिए बिल्ड सिस्टम |
| LLDB | Android Studio में नेटिव कोड डिबगर |
| ndk-build | पुराना बिल्ड सिस्टम (CMake द्वारा प्रतिस्थापित) |
NDK और शुद्ध SDK के बीच चुनाव कार्य पर निर्भर करता है। Android SDK 90% परिदृश्यों के लिए तैयार Java/Kotlin API प्रदान करता है — नेटवर्किंग, फ़ाइलें, सूचनाएँ, कैमरा। NDK का उपयोग तब किया जाता है जब ये API आवश्यक प्रदर्शन या कार्यक्षमता प्रदान नहीं करते। उदाहरण के लिए, SDK के माध्यम से रीयल-टाइम ऑडियो प्रोसेसिंग संभव है लेकिन 50–200 मिलीसेकंड विलंबता के साथ, जबकि Oboe के माध्यम से नेटिव लाइब्रेरी विलंबता को 5–15 मिलीसेकंड तक कम कर देती है।
APK आकार एक अन्य कारक है। NDK जोड़ने से एप्लिकेशन का आकार बढ़ जाता है क्योंकि प्रत्येक ABI आर्किटेक्चर को एक अलग .so लाइब्रेरी की आवश्यकता होती है। हालाँकि, Android App Bundle (AAB) का उपयोग समस्या को कम करता है: Google Play उपयोगकर्ता को केवल उसके आर्किटेक्चर के लिए लाइब्रेरी भेजता है। एक विशिष्ट नेटिव प्रोजेक्ट प्रति डिवाइस स्थापना आकार में 1–10 MB जोड़ता है।
| मानदंड | SDK (Kotlin/Java) | NDK (C/C++) |
|---|---|---|
| प्रदर्शन | मध्यम (JIT/AOT कंपाइलेशन) | उच्च (मशीन कोड) |
| ऑडियो विलंबता | 50–200 मिलीसेकंड | Oboe के माध्यम से 5–15 मिलीसेकंड |
| 3D ग्राफ़िक्स | Canvas/OpenGL Kotlin API के माध्यम से | Vulkan/OpenGL सीधे |
| विकास जटिलता | कम | उच्च (मेमोरी प्रबंधन, JNI) |
| कोड पोर्टेबिलिटी | केवल Android | Linux, Windows, macOS, iOS |
| APK आकार | न्यूनतम | +1–10 MB प्रति लाइब्रेरी |
NDK SDK Manager के माध्यम से Android SDK से अलग स्थापित किया जाता है। NDK निर्देशिका के अंदर टूलचेन (कंपाइलर), प्लेटफ़ॉर्म लाइब्रेरीज़, हेडर फ़ाइलें और उपयोगिताएँ होती हैं। NDK टूलचेन में सभी लक्ष्य ABI: arm64-v8a, armeabi-v7a, x86_64 और x86 के लिए क्रॉस-कंपाइलेशन हेतु Clang शामिल है। कंपाइलर CMake या ndk-build फ़्लैग्स के आधार पर स्वचालित रूप से आवश्यक आर्किटेक्चर का चयन करता है।
नेटिव कोड के लिए Android API हेडर फ़ाइलों द्वारा sysroot/usr/include निर्देशिका में प्रदान किए जाते हैं। वहाँ नेटिव कोड में उपलब्ध सभी API की घोषणाएँ होती हैं: native_activity.h Activity लाइफसाइकिल के लिए, input.h इनपुट इवेंट्स के लिए, sensor.h सेंसर के लिए। इन हेडर्स को शामिल करने से JNI परत के बिना हार्डवेयर क्षमताओं तक पहुँच मिलती है।
ndk/
toolchains/
llvm/prebuilt/windows-x86_64/
bin/ // Clang, ld, llvm-profdata
sysroot/ // Android API हेडर फ़ाइलें
platforms/
android-26/ // API 26 के लिए libc, libm, libdl
android-34/
sources/
cxx-stl/ // libc++ हेडर
build/
cmake/ // CMake टूलचेन फ़ाइल
NDK के माध्यम से निम्नलिखित नेटिव API समूह उपलब्ध हैं: Native App Glue (C से Activity लाइफसाइकिल प्रबंधन), OpenGL ES 3.2 और Vulkan 1.3 (ग्राफ़िक्स), Oboe (कम-विलंबता ऑडियो), Neural Networks API (डिवाइस पर मशीन लर्निंग)। प्रत्येक API के पास NDK के भाग के रूप में एक हेडर फ़ाइल और स्थैतिक/गतिशील लाइब्रेरी है।
नेटिव API के साथ काम करने के लिए JNI की आवश्यकता नहीं है — फ़ंक्शन सीधे C/C++ कोड से कॉल किए जाते हैं। हालाँकि, Kotlin में UI के साथ इंटरैक्शन के लिए अभी भी JNI की आवश्यकता है। यह हाइब्रिड आर्किटेक्चर गेम इंजन में आम है: C++ में ग्राफ़िक्स और भौतिकी (Vulkan के माध्यम से), Kotlin में मेनू और UI (Jetpack Compose के माध्यम से)।
JNI (जावा नेटिव इंटरफ़ेस) Java/Kotlin वर्चुअल मशीन से नेटिव कोड को कॉल करने का मानक तंत्र है। डेवलपर Kotlin में external कीवर्ड के साथ एक बाहरी फ़ंक्शन घोषित करता है और System.loadLibrary के माध्यम से .so लाइब्रेरी लोड करता है। C++ पक्ष पर, फ़ंक्शन JNI नामकरण परंपरा का उपयोग करके घोषित किया जाता है, जो पैकेज और वर्ग नाम को एन्कोड करता है।
class NativeBridge {
companion object {
init {
System.loadLibrary("native-lib")
}
}
external fun stringFromJNI(): String
external fun fibonacci(n: Int): Long
external fun processBuffer(data: ByteArray): ByteArray
}
// कोड में उपयोग
val bridge = NativeBridge()
println(bridge.stringFromJNI()) // "Hello from C++"
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_app_NativeBridge_stringFromJNI(
JNIEnv* env, jobject /* this */) {
std::string hello = "Hello from C++ NDK";
return env->NewStringUTF(hello.c_str());
}
extern "C" JNIEXPORT jlong JNICALL
Java_com_example_app_NativeBridge_fibonacci(
JNIEnv* env, jobject /* this */, jint n) {
if (n <= 1) return n;
jlong a = 0, b = 1;
for (int i = 2; i <= n; i++) {
jlong temp = a + b;
a = b;
b = temp;
}
return b;
}
CMake NDK के लिए प्राथमिक बिल्ड सिस्टम है, जिसने पुराने ndk-build को बदल दिया है। CMakeLists.txt फ़ाइल स्रोत फ़ाइलों, लाइब्रेरीज़ और कंपाइलेशन फ़्लैग्स का वर्णन करती है। Android Studio प्रोजेक्ट बनाते समय स्वचालित रूप से CMake को कॉल करता है यदि build.gradle में externalNativeBuild कॉन्फ़िगर किया गया है। CMake प्रत्येक लक्ष्य ABI के लिए मेकफ़ाइल्स जनरेट करता है और नेटिव कोड को समानांतर में कंपाइल करता है।
cmake_minimum_required(VERSION 3.22.1)
project("nativelib")
# हेडर फ़ाइलें शामिल करें
include_directories(src/main/cpp/include)
# नेटिव लाइब्रेरी बनाएँ
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/math_utils.cpp
src/main/cpp/audio_processor.cpp
)
# Android सिस्टम लाइब्रेरीज़ को लिंक करें
target_link_libraries(
native-lib
android
log
OpenSLES
# libc++ स्वचालित रूप से लिंक होती है
)
# ऑप्टिमाइज़ेशन फ़्लैग्स
target_compile_options(native-lib PRIVATE -O3 -Wall -Wextra)
android {
defaultConfig {
ndk {
// बिल्ड के लिए लक्ष्य ABI
abiFilters "arm64-v8a", "armeabi-v7a", "x86_64"
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
version "3.22.1"
}
}
buildTypes {
release {
externalNativeBuild {
cmake {
arguments "-DCMAKE_BUILD_TYPE=Release"
}
}
}
}
}
ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) मशीन कोड का प्रारूप है जो डिवाइस के प्रोसेसर के साथ संगतता निर्धारित करता है। प्रत्येक ARM या x86 आर्किटेक्चर का अपना ABI होता है। NDK नेटिव कोड को प्रत्येक निर्दिष्ट ABI के लिए अलग-अलग कंपाइल करता है। 2026 तक सबसे आम ABI: arm64-v8a (99% आधुनिक उपकरण), armeabi-v7a (पुराने 32-बिट उपकरण), x86_64 (एमुलेटर और Chromebook)।
build.gradle में abiFilters निर्दिष्ट करना बिल्ड को केवल आवश्यक आर्किटेक्चर तक सीमित करता है, जिससे कंपाइलेशन समय कम होता है। Google Play के लिए, लाइब्रेरी द्वारा समर्थित सभी ABI शामिल करने की अनुशंसा की जाती है — यह सभी उपकरणों पर काम करने की गारंटी देता है। Google Play Console App Bundle के माध्यम से ABI-विशिष्ट APK वितरण कॉन्फ़िगर करने की अनुमति देता है।
#include <jni.h>
#include <android/api-level.h>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_app_NativeBridge_getABIInfo(
JNIEnv* env, jobject /* this */) {
#if defined(__arm__)
#if defined(__ARM_ARCH_7A__)
return env->NewStringUTF("armeabi-v7a");
#endif
#elif defined(__aarch64__)
return env->NewStringUTF("arm64-v8a");
#elif defined(__x86_64__)
return env->NewStringUTF("x86_64");
#elif defined(__i386__)
return env->NewStringUTF("x86");
#endif
return env->NewStringUTF("unknown");
}
| ABI | आर्किटेक्चर | बिटनेस | डिवाइस |
|---|---|---|---|
| arm64-v8a | ARMv8-A | 64-बिट | लगभग सभी आधुनिक फ़ोन |
| armeabi-v7a | ARMv7-A | 32-बिट | पुराने उपकरण (2020 से पहले) |
| x86_64 | x86-64 | 64-बिट | एमुलेटर, Chromebook |
| x86 | x86 IA-32 | 32-बिट | पुराने एमुलेटर |
आइए एक व्यावहारिक उदाहरण देखें: फ़्लोटिंग-पॉइंट संख्याओं के साथ काम करने के लिए एक गणितीय लाइब्रेरी। C++ में नेटिव कोड ARM NEON निर्देशों तक सीधी पहुँच और रनटाइम पर ऐरे बाउंड्स जाँच की अनुपस्थिति के कारण Kotlin की तुलना में अधिक कुशलता से गणना करता है। यह उदाहरण NDK उपयोग के एक विशिष्ट पैटर्न को प्रदर्शित करता है — भारी गणनाओं को नेटिव परत में स्थानांतरित करना।
#include <jni.h>
#include <cmath>
#include <vector>
extern "C" JNIEXPORT jfloatArray JNICALL
Java_com_example_app_NativeBridge_normalizeArray(
JNIEnv* env, jobject, jfloatArray input) {
jsize len = env->GetArrayLength(input);
jfloat* elements = env->GetFloatArrayElements(input, nullptr);
// माध्य और मानक विचलन की गणना करें
float sum = 0.0f, sumSq = 0.0f;
for (jsize i = 0; i < len; i++) {
sum += elements[i];
sumSq += elements[i] * elements[i];
}
float mean = sum / len;
float stddev = std::sqrt(sumSq / len - mean * mean);
// सामान्यीकरण: (x - mean) / stddev
jfloat* result = new jfloat[len];
for (jsize i = 0; i < len; i++) {
result[i] = (elements[i] - mean) / stddev;
}
env->ReleaseFloatArrayElements(input, elements, JNI_ABORT);
jfloatArray output = env->NewFloatArray(len);
env->SetFloatArrayRegion(output, 0, len, result);
delete[] result;
return output;
}
नेटिव कोड डीबग करने के लिए, android/log.h लाइब्रेरी से __android_log_print मैक्रो का उपयोग करें। संदेश Java/Kotlin लॉग के साथ Logcat में दिखाई देते हैं। लॉगिंग स्तर (ANDROID_LOG_DEBUG, ANDROID_LOG_ERROR) संदेशों को फ़िल्टर करने में मदद करता है।
#include <android/log.h>
#define LOG_TAG "NativeLib"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
extern "C" JNIEXPORT void JNICALL
Java_com_example_app_NativeBridge_processData(
JNIEnv* env, jobject, jint count) {
LOGD("Processing %d items", count);
for (int i = 0; i < count; i++) {
// भारी प्रसंस्करण
LOGD("Item %d processed", i);
}
LOGD("Processing complete");
}
अक्सर पूछे जाने वाले प्रश्न
नहीं। अधिकांश एप्लिकेशन के लिए, Kotlin SDK पर्याप्त है। NDK की आवश्यकता उच्च-प्रदर्शन कार्यों के लिए है: रीयल-टाइम ऑडियो/वीडियो प्रोसेसिंग, 3D ग्राफ़िक्स, क्रिप्टोग्राफी या मौजूदा C/C++ प्रोजेक्ट्स का पुन: उपयोग।
NDK LLVM टूलचेन से Clang का उपयोग करता है। NDK r23 से, GCC पूरी तरह से हटा दिया गया है। Clang सभी Android ABI: arm64-v8a, armeabi-v7a, x86_64, x86 के लिए क्रॉस-कंपाइल करता है।
ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) मशीन कोड का प्रारूप है जो प्रोसेसर के साथ संगतता निर्धारित करता है। NDK प्रत्येक ABI के लिए अलग-अलग .so लाइब्रेरी बनाता है। arm64-v8a आधुनिक Android उपकरणों के लिए प्राथमिक ABI है।
हाँ। Android Studio LLDB का समर्थन करता है — एक नेटिव कोड डीबगर। आप C++ फ़ाइलों में ब्रेकपॉइंट सेट कर सकते हैं, वेरिएबल्स और कॉल स्टैक देख सकते हैं। इसके लिए NDK और LLDB प्लगइन की आवश्यकता है।
प्रत्येक नेटिव लाइब्रेरी APK में 100 KB से कई MB तक जोड़ती है। प्रत्येक ABI को एक अलग .so लाइब्रेरी की आवश्यकता होती है। Android App Bundle उपयोगकर्ता को केवल उपयुक्त आर्किटेक्चर भेजता है, जिससे स्थापना आकार कम होता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें