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 — C/C++ کوڈ کو Android کے لیے نیٹیو لائبریریوں میں مرتب کرنے کا ٹول کٹ۔
  • 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 کو تبدیل نہیں کرتا بلکہ اسے مکمل کرتا ہے۔ تمام یوزر انٹرفیس، لائف سائیکل اور نظام خدمات 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 ms تاخیر کے ساتھ، جبکہ Oboe کے ذریعے نیٹیو لائبریری تاخیر کو 5–15 ms تک کم کر دیتی ہے۔

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 msOboe کے ذریعے 5–15 ms
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 یوزر انٹرفیس کے ساتھ تعامل کے لیے اب بھی JNI درکار ہے۔ یہ ہائبرڈ آرکیٹیکچر گیم انجنوں میں عام ہے: C++ میں گرافکس اور طبیعیات (Vulkan کے ذریعے)، Kotlin میں مینیو اور یوزر انٹرفیس (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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں