NDK Android: यह क्या है, नेटिव डेवलपमेंट किट और C++ के लिए JNI

लेखक: IT Sectr प्रकाशित: 2026-02-09 पढ़ने का समय: 10 मिनट

NDK (नेटिव डेवलपमेंट किट) Android के तहत C और C++ में एप्लिकेशन के भाग लिखने के लिए एक टूलकिट है। सामान्य Android SDK के विपरीत, NDK कोड को नेटिव लाइब्रेरीज़ (.so) में कंपाइल करता है जो वर्चुअल मशीन की परत के बिना सीधे प्रोसेसर के साथ काम करती हैं। Google NDK Guides, 2026 के अनुसार, NDK का उपयोग उच्च-प्रदर्शन कंप्यूटिंग, गेम्स, ऑडियो प्रोसेसिंग और मौजूदा C/C++ प्रोजेक्ट्स के पुन: उपयोग के लिए किया जाता है। JNI (जावा नेटिव इंटरफ़ेस) नेटिव कोड को Kotlin और Java से जोड़ता है।

मुख्य बातें

  • NDK — Android के लिए C/C++ कोड को नेटिव लाइब्रेरीज़ में कंपाइल करने का टूलकिट।
  • JNI — Java/Kotlin वर्चुअल मशीन और नेटिव कोड के बीच इंटरैक्शन का इंटरफ़ेस।
  • CMake — NDK प्रोजेक्ट्स के लिए मुख्य बिल्ड सिस्टम, CMakeLists.txt के माध्यम से कॉन्फ़िगर किया जाता है।
  • ABI — लक्ष्य प्रोसेसर आर्किटेक्चर (arm64-v8a, armeabi-v7a, x86_64) जिसके लिए लाइब्रेरी बनाई जाती है।
  • NDK अधिकांश Android एप्लिकेशन के लिए आवश्यक नहीं है और केवल उच्च प्रदर्शन आवश्यकताओं वाले कार्यों में उपयोग किया जाता है।

NDK क्या है

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 की प्रमुख क्षमताएँ

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 वर्षों का विकास समय बचाता है।

घटकउद्देश्य
ClangC++20 समर्थन के साथ C/C++ कंपाइलर
libc++मानक C++ लाइब्रेरी (NDK r27 में एकमात्र)
CMakeनेटिव लाइब्रेरीज़ के लिए बिल्ड सिस्टम
LLDBAndroid Studio में नेटिव कोड डिबगर
ndk-buildपुराना बिल्ड सिस्टम (CMake द्वारा प्रतिस्थापित)

NDK बनाम SDK: नेटिव कोड कब चाहिए

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 और NDK की तुलना

मानदंडSDK (Kotlin/Java)NDK (C/C++)
प्रदर्शनमध्यम (JIT/AOT कंपाइलेशन)उच्च (मशीन कोड)
ऑडियो विलंबता50–200 मिलीसेकंडOboe के माध्यम से 5–15 मिलीसेकंड
3D ग्राफ़िक्सCanvas/OpenGL Kotlin API के माध्यम सेVulkan/OpenGL सीधे
विकास जटिलताकमउच्च (मेमोरी प्रबंधन, JNI)
कोड पोर्टेबिलिटीकेवल AndroidLinux, Windows, macOS, iOS
APK आकारन्यूनतम+1–10 MB प्रति लाइब्रेरी

NDK आर्किटेक्चर: उपकरण और लाइब्रेरीज़

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 निर्देशिका संरचना

text
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 टूलचेन फ़ाइल

नेटिव Android API

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: Kotlin C++ को कैसे कॉल करता है

JNI (जावा नेटिव इंटरफ़ेस) Java/Kotlin वर्चुअल मशीन से नेटिव कोड को कॉल करने का मानक तंत्र है। डेवलपर Kotlin में external कीवर्ड के साथ एक बाहरी फ़ंक्शन घोषित करता है और System.loadLibrary के माध्यम से .so लाइब्रेरी लोड करता है। C++ पक्ष पर, फ़ंक्शन JNI नामकरण परंपरा का उपयोग करके घोषित किया जाता है, जो पैकेज और वर्ग नाम को एन्कोड करता है।

Kotlin में नेटिव फ़ंक्शन घोषित करना

kotlin
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++"

C++ में JNI फ़ंक्शन कार्यान्वयन

cpp
#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;
}

NDK के लिए CMakeLists.txt सेटअप करना

CMake NDK के लिए प्राथमिक बिल्ड सिस्टम है, जिसने पुराने ndk-build को बदल दिया है। CMakeLists.txt फ़ाइल स्रोत फ़ाइलों, लाइब्रेरीज़ और कंपाइलेशन फ़्लैग्स का वर्णन करती है। Android Studio प्रोजेक्ट बनाते समय स्वचालित रूप से CMake को कॉल करता है यदि build.gradle में externalNativeBuild कॉन्फ़िगर किया गया है। CMake प्रत्येक लक्ष्य ABI के लिए मेकफ़ाइल्स जनरेट करता है और नेटिव कोड को समानांतर में कंपाइल करता है।

नेटिव लाइब्रेरी के लिए CMakeLists.txt उदाहरण

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

NDK के लिए build.gradle कॉन्फ़िगरेशन

groovy
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 और मल्टी-प्लेटफ़ॉर्म बिल्ड

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 वितरण कॉन्फ़िगर करने की अनुमति देता है।

नेटिव कोड में डिवाइस ABI निर्धारित करना

cpp
#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-v8aARMv8-A64-बिटलगभग सभी आधुनिक फ़ोन
armeabi-v7aARMv7-A32-बिटपुराने उपकरण (2020 से पहले)
x86_64x86-6464-बिटएमुलेटर, Chromebook
x86x86 IA-3232-बिटपुराने एमुलेटर

C++ में नेटिव कोड के उदाहरण

आइए एक व्यावहारिक उदाहरण देखें: फ़्लोटिंग-पॉइंट संख्याओं के साथ काम करने के लिए एक गणितीय लाइब्रेरी। C++ में नेटिव कोड ARM NEON निर्देशों तक सीधी पहुँच और रनटाइम पर ऐरे बाउंड्स जाँच की अनुपस्थिति के कारण Kotlin की तुलना में अधिक कुशलता से गणना करता है। यह उदाहरण NDK उपयोग के एक विशिष्ट पैटर्न को प्रदर्शित करता है — भारी गणनाओं को नेटिव परत में स्थानांतरित करना।

नेटिव कोड में गणितीय संचालन

cpp
#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) संदेशों को फ़िल्टर करने में मदद करता है।

cpp
#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");
}

अक्सर पूछे जाने वाले प्रश्न

क्या Android डेवलपमेंट के लिए NDK का उपयोग अनिवार्य है?

नहीं। अधिकांश एप्लिकेशन के लिए, Kotlin SDK पर्याप्त है। NDK की आवश्यकता उच्च-प्रदर्शन कार्यों के लिए है: रीयल-टाइम ऑडियो/वीडियो प्रोसेसिंग, 3D ग्राफ़िक्स, क्रिप्टोग्राफी या मौजूदा C/C++ प्रोजेक्ट्स का पुन: उपयोग।

NDK किस कंपाइलर का उपयोग करता है?

NDK LLVM टूलचेन से Clang का उपयोग करता है। NDK r23 से, GCC पूरी तरह से हटा दिया गया है। Clang सभी Android ABI: arm64-v8a, armeabi-v7a, x86_64, x86 के लिए क्रॉस-कंपाइल करता है।

NDK के संदर्भ में ABI क्या है?

ABI (एप्लिकेशन बाइनरी इंटरफ़ेस) मशीन कोड का प्रारूप है जो प्रोसेसर के साथ संगतता निर्धारित करता है। NDK प्रत्येक ABI के लिए अलग-अलग .so लाइब्रेरी बनाता है। arm64-v8a आधुनिक Android उपकरणों के लिए प्राथमिक ABI है।

क्या NDK के माध्यम से C++ कोड डीबग किया जा सकता है?

हाँ। Android Studio LLDB का समर्थन करता है — एक नेटिव कोड डीबगर। आप C++ फ़ाइलों में ब्रेकपॉइंट सेट कर सकते हैं, वेरिएबल्स और कॉल स्टैक देख सकते हैं। इसके लिए NDK और LLDB प्लगइन की आवश्यकता है।

NDK APK आकार को कैसे प्रभावित करता है?

प्रत्येक नेटिव लाइब्रेरी APK में 100 KB से कई MB तक जोड़ती है। प्रत्येक ABI को एक अलग .so लाइब्रेरी की आवश्यकता होती है। Android App Bundle उपयोगकर्ता को केवल उपयुक्त आर्किटेक्चर भेजता है, जिससे स्थापना आकार कम होता है।

सारांश

  • NDK — Clang कंपाइलर का उपयोग करके C/C++ कोड को Android के लिए नेटिव लाइब्रेरीज़ में क्रॉस-कंपाइल करने के लिए उपकरणों का एक सेट।
  • JNI — external कीवर्ड और फ़ंक्शन नामकरण परंपराओं के माध्यम से Kotlin/Java को नेटिव कोड से जोड़ने वाला इंटरफ़ेस।
  • CMake — NDK का प्राथमिक बिल्ड सिस्टम, CMakeLists.txt और Gradle में externalNativeBuild के माध्यम से कॉन्फ़िगर किया जाता है।
  • ABI प्रोसेसर आर्किटेक्चर को परिभाषित करता है — arm64-v8a, armeabi-v7a, x86_64। प्रत्येक ABI को अलग लाइब्रेरी बिल्ड की आवश्यकता होती है।
  • NDK का उपयोग केवल उच्च प्रदर्शन की आवश्यकता वाले कार्यों के लिए करें: गेम्स, ऑडियो, ग्राफ़िक्स, क्रिप्टोग्राफी, डिवाइस पर मशीन लर्निंग।
  • Google Play App Bundle के माध्यम से ABI विभाजन का समर्थन करता है: उपयोगकर्ता को केवल उसके डिवाइस आर्किटेक्चर के लिए लाइब्रेरी मिलती है।
  • नेटिव लाइब्रेरीज़ APK आकार को काफी बढ़ाती हैं लेकिन महत्वपूर्ण संचालन के लिए अधिकतम प्रदर्शन और कम विलंबता प्रदान करती हैं।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें