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 کو تبدیل نہیں کرتا بلکہ اسے مکمل کرتا ہے۔ تمام یوزر انٹرفیس، لائف سائیکل اور نظام خدمات 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 ms تاخیر کے ساتھ، جبکہ Oboe کے ذریعے نیٹیو لائبریری تاخیر کو 5–15 ms تک کم کر دیتی ہے۔
APK سائز ایک اور عنصر ہے۔ NDK شامل کرنے سے ایپلیکیشن کا سائز بڑھ جاتا ہے کیونکہ ہر ABI آرکیٹیکچر کو علیحدہ .so لائبریری درکار ہوتی ہے۔ تاہم، Android App Bundle (AAB) کا استعمال مسئلہ کم کرتا ہے: Google Play صارف کو صرف اس کے آرکیٹیکچر کے لیے لائبریری بھیجتا ہے۔ ایک عام نیٹیو منصوبہ فی ڈیوائس انسٹال سائز میں 1–10 MB اضافہ کرتا ہے۔
| معیار | SDK (Kotlin/Java) | NDK (C/C++) |
|---|---|---|
| کارکردگی | درمیانی (JIT/AOT تالیف) | اعلیٰ (مشین کوڈ) |
| آڈیو تاخیر | 50–200 ms | Oboe کے ذریعے 5–15 ms |
| 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 یوزر انٹرفیس کے ساتھ تعامل کے لیے اب بھی JNI درکار ہے۔ یہ ہائبرڈ آرکیٹیکچر گیم انجنوں میں عام ہے: C++ میں گرافکس اور طبیعیات (Vulkan کے ذریعے)، Kotlin میں مینیو اور یوزر انٹرفیس (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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں