C++ ایک کثیر نمونہ پروگرامنگ زبان ہے جس میں دستی میموری کا انتظام ہوتا ہے، جو طریقہ کار، آبجیکٹ اورینٹڈ اور عام پروگرامنگ کو یکجا کرتی ہے۔ موبائل ڈویلپمنٹ میں، C++ کو Android NDK کے ذریعے لائبریریاں منتقل کرنے اور Unity اور Unreal Engine گیم انجنوں کے ذریعے کراس پلیٹ فارم گیمز بنانے کے لیے استعمال کیا جاتا ہے۔ TIOBE (2026) کے مطابق، C++ پیشہ ور ڈویلپرز میں سرفہرست 5 مقبول ترین زبانوں میں شامل ہے۔
اہم نکات
C++ ایک پروگرامنگ زبان ہے جو 1985 میں بیارن سٹراسٹرپ نے C زبان کی توسیع کے طور پر کلاس سپورٹ کے ساتھ بنائی تھی۔ C++ پوائنٹرز کے ذریعے براہ راست میموری تک رسائی، ٹیمپلیٹ میٹاپروگرامنگ اور متعدد وراثت فراہم کرتا ہے۔ C++17 اور C++20 معیارات نے کوروٹین، کانسپٹس اور رینجز شامل کیے۔
Java اور Kotlin کے برعکس، C++ میں کوڑا کرکٹ جمع کرنے والا نہیں ہے — ڈویلپر new اور delete آپریٹرز کے ذریعے دستی طور پر میموری کی تقسیم اور آزادی کا انتظام کرتا ہے۔ یہ کارکردگی پر مکمل کنٹرول دیتا ہے لیکن نظم و ضبط کی ضرورت ہے۔ JetBrains Developer Survey (2025) کے مطابق، 42% C++ ڈویلپرز گیمنگ انڈسٹری میں زبان استعمال کرتے ہیں۔
C++ معیارات ہر تین سال میں تیار ہوتے ہیں: C++11 (لیمبڈا، auto، unique_ptr)، C++14 (عام لیمبڈا)، C++17 (if constexpr، filesystem)، C++20 (ماڈیولز، کوروٹین، کانسپٹس)۔ Clang اور GCC کمپائلرز تمام موجودہ معیارات کو سپورٹ کرتے ہیں، اور Android NDK، LLVM ٹول چین سے Clang استعمال کرتا ہے۔
C++ اور JVM زبانوں کے درمیان بنیادی فرق دستی میموری کا انتظام اور براہ راست مشین کوڈ میں کمپائلیشن ہے۔ Java اور Kotlin خودکار کوڑا کرکٹ جمع کرنے کے ساتھ ورچوئل مشین پر چلتے ہیں۔ C++ کوڈ ایک مخصوص آرکیٹیکچر — ARM، x86 یا RISC-V — کے لیے مقامی بائنری میں کمپائل ہوتا ہے۔
| معیار | C++ | Java / Kotlin |
|---|---|---|
| میموری کا انتظام | دستی (new/delete، RAII) | خودکار (کوڑا کرکٹ جمع کرنے والا) |
| کمپائلیشن | مقامی مشین کوڈ | JVM / ART بائٹ کوڈ |
| کارکردگی | زیادہ سے زیادہ (zero-cost abstractions) | GC تعطل کے ساتھ اعلی |
| موبائل ڈویلپمنٹ میں استعمال | NDK، گیمز، لائبریریاں | UI ایپس، کاروباری منطق |
| بلڈ | CMake، NDK Build، Gradle + NDK | Gradle، Maven |
| کراس پلیٹ فارم | ہر پلیٹ فارم کے لیے کمپائل | ہر جگہ JVM / ART |
Android NDK (Native Development Kit) Google کا ایک ٹول کٹ ہے جو Android ایپلیکیشنز کے حصے C اور C++ میں لکھنے کے لیے ہے۔ NDK میں Clang پر مبنی ٹول چین، Android سسٹم ہیڈر فائلیں، اور ڈیبگنگ اور پروفائلنگ لائبریریاں شامل ہیں۔ ورژن r27 (2025) C++20 کو سپورٹ کرتا ہے اور LLVM 18 استعمال کرتا ہے۔
NDK، C++ کوڈ کو ARM64، ARM32، x86 اور x86_64 آرکیٹیکچرز کے لیے متحرک .so لائبریریوں میں کمپائل کرتا ہے۔ ایک Java یا Kotlin ایپلیکیشن System.loadLibrary() کے ذریعے ان لائبریریوں کو لوڈ کرتی ہے اور JNI کے ذریعے مقامی فنکشنز کال کرتی ہے۔ Google کے مطابق، NDK 5 ملین سے زیادہ بار ڈاؤن لوڈ کیا جا چکا ہے۔
ایک عام Android NDK پروجیکٹ میں C++ سورس فائلوں کے ساتھ app/src/main/cpp/ فولڈر، بلڈ کے لیے CMakeLists.txt اور مقامی طریقوں کے اعلان کے ساتھ Java کلاس ہوتی ہے۔ Gradle، build.gradle میں externalNativeBuild بلاک کے ذریعے NDK کو جوڑتا ہے۔
// native-lib.cpp — Android کے لیے سادہ JNI طریقہ
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_app_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /*thiz*/) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}کوڈ مکمل نام Java_com_example_app_MainActivity_stringFromJNI کے ساتھ ایک JNI فنکشن کا اعلان کرتا ہے — یہ JNI نام رکھنے کا قاعدہ ہے۔ فنکشن JNIEnv (عملدرآمد کا ماحول) اور jobject (کال کرنے والی کلاس مثال) کے لیے ایک پوائنٹر لیتا ہے۔ env->NewStringUTF C++ سٹرنگ سے Java سٹرنگ بناتا ہے۔
Android متعدد ABI (ایپلیکیشن بائنری انٹرفیس) سپورٹ کرتا ہے: arm64-v8a (64 بٹ ARM آلات، جدید اسمارٹ فونز کا 99%)، armeabi-v7a (32 بٹ ARM، پرانے آلات)، x86_64 (ایمولیٹر)۔ NDK، build.gradle میں ABI فلٹرز کے ذریعے ہر آرکیٹیکچر کے لیے .so بنانے کی اجازت دیتا ہے۔
android {
defaultConfig {
ndk {
abiFilters "arm64-v8a", "armeabi-v7a"
}
}
externalNativeBuild {
cmake {
path "src/main/cpp/CMakeLists.txt"
version "3.22.1"
}
}
}C++ گیم انجنوں کی بنیادی زبان ہے۔ Unreal Engine تمام گیم کوڈ کے لیے C++ استعمال کرتا ہے، جبکہ Unity رینڈرنگ اور فزکس کے لیے انجن کور میں C++ استعمال کرتا ہے۔ چاہے ایک ڈویلپر Unity میں C# میں لکھے، پردے کے پیچھے C++ گرافکس، آواز اور فزکس کیلکولیشنز کا انتظام کرتا ہے۔
Unreal Engine شروع سے C++ پر بنایا گیا ہے۔ گیم منطق کوڈ UHT (Unreal Header Tool) میکروز کا استعمال کرتے ہوئے C++ میں لکھا جاتا ہے Blueprints — ایک بصری اسکرپٹنگ سسٹم — کے ساتھ انضمام کے لیے۔ کلاسیں بنیادی اقسام AActor، UObject، UGameInstance سے سابقہ حروف U، A، F کے ساتھ وراثت پاتی ہیں۔
// Unreal Engine میں C++ استعمال کرتے ہوئے کیریکٹر کلاس
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"
UCLASS()
class AMyCharacter : public ACharacter
{
GENERATED_BODY()
public:
AMyCharacter();
virtual void BeginPlay() override;
virtual void Tick(float DeltaTime) override;
UPROPERTY(EditAnywhere, Category = "Movement")
float MoveSpeed = 600.0f;
protected:
void SetupPlayerInputComponent(UInputComponent *PlayerInputComponent) override;
};UCLASS() اور UPROPERTY() میکروز Unreal Engine ریفلیکشن سسٹم کا حصہ ہیں۔ UHT (Unreal Header Tool) سیریلائزیشن، بلیو پرنٹس اور نیٹ ورک ریپلیکیشن کے لیے ہیڈر فائلوں سے C++ کوڈ جنریٹ کرتا ہے۔ MoveSpeed، UPROPERTY(EditAnywhere) کے ذریعے ایڈیٹر میں ظاہر ہوتا ہے۔
Unity گیم منطق کے لیے C# استعمال کرتا ہے، لیکن C++ مقامی پلگ انز — Android کے لیے .so لائبریریاں اور iOS کے لیے .bundle — میں استعمال ہوتا ہے۔ Android NDK کے ذریعے، اشتہاری نیٹ ورکس، تجزیہ کے لیے C++ SDKs کو ضم کیا جا سکتا ہے یا ڈیسک ٹاپ گیمز سے C++ لائبریریاں منتقل کی جا سکتی ہیں۔
using System.Runtime.InteropServices;
using UnityEngine;
public class NativeBridge : MonoBehaviour
{
const string LIB_NAME = "native_plugin";
[DllImport(LIB_NAME, CallingConvention = CallingConvention.Cdecl)]
private static extern int ProcessFrame(
int width, int height,
IntPtr pixelData
);
void Update()
{
int result = ProcessFrame(Screen.width, Screen.height, IntPtr.Zero);
Debug.Log("Frame processed: " + result);
}
}اس مثال میں، C#، P/Invoke کے ذریعے C++ فنکشن ProcessFrame کو کال کو مارشل کرتا ہے۔ DllImport وصف .so لائبریری کا نام بتاتا ہے۔ C++ فنکشن ریئل ٹائم میں فریم پراسیس کرتا ہے اور نتیجہ لوٹاتا ہے۔ یہ طریقہ پوسٹ ایفیکٹس اور کمپیوٹر وژن کے لیے استعمال ہوتا ہے۔
JNI (Java Native Interface) Java یا Kotlin سے C/C++ کوڈ کال کرنے کا معیاری طریقہ کار ہے۔ Android میں، JNI، ART ورچوئل مشین اور مقامی لائبریری کے درمیان ڈیٹا منتقل کرنے کا واحد طریقہ ہے۔ ہر JNI کال میں اوور ہیڈ ہوتا ہے، لہذا ڈیٹا ایک وقت میں ایک فیلڈ کے بجائے بیچوں میں منتقل کیا جانا چاہیے۔
JNIEnv JNI فنکشن ٹیبل کا ایک پوائنٹر ہے۔ env->FindClass ایک Java کلاس لوڈ کرتا ہے، env->GetMethodID ایک طریقہ شناخت کنندہ حاصل کرتا ہے، env->CallVoidMethod اسے کال کرتا ہے۔ سٹرنگز کے لیے GetStringUTFChars اور ReleaseStringUTFChars استعمال کریں۔ JNI، Java اشیاء کے لیے عالمی اور کمزور حوالہ جات بھی سپورٹ کرتا ہے۔
// JNI کے ذریعے C++ سے Java میں بائٹ ایرے منتقل کرنا
extern "C" JNIEXPORT void JNICALL
Java_com_example_app_ImageProcessor_processArray(
JNIEnv *env, jobject /*thiz*/,
jbyteArray input, jint length) {
jbyte *buffer = env->GetByteArrayElements(input, nullptr);
jsize size = env->GetArrayLength(input);
for (jsize i = 0; i < size; ++i) {
buffer[i] = buffer[i] ^ 0xFF; // بائٹس کو الٹائیں
}
env->ReleaseByteArrayElements(input, buffer, JNI_COMMIT);
}GetByteArrayElements Java بائٹ ایرے کے لیے ایک پوائنٹر حاصل کرتا ہے۔ ReleaseByteArrayElements میں JNI_COMMIT، میموری آزاد کیے بغیر تبدیلیاں واپس Java ایرے میں کاپی کرتا ہے۔ فار لوپ پروسیسنگ، GC تعطل کے بغیر زیادہ سے زیادہ C++ کارکردگی کے ساتھ CPU پر چلتی ہے۔
JNI کا بنیادی خطرہ عالمی حوالہ جات کا رساؤ ہے۔ ہر NewGlobalRef کو DeleteGlobalRef کے ذریعے آزاد کیا جانا چاہیے۔ مقامی حوالہ جات (FindClass، NewStringUTF کے ذریعے لوٹائے گئے) مقامی فنکشن سے واپسی پر خود بخود جاری ہو جاتے ہیں۔ گہری کالز کے لیے، PushLocalFrame / PopLocalFrame استعمال کریں۔
CMake Android NDK میں C++ کے لیے بنیادی بلڈ ٹول ہے۔ CMakeLists.txt بلڈ اہداف، لائبریریوں اور انحصار کو بیان کرتا ہے۔ Gradle، externalNativeBuild کے ذریعے CMake کو کال کرتا ہے، NDK اور ٹول چین کو راستے بھیجتا ہے۔ ایک متبادل Android.mk اور Application.mk پر مبنی NDK Build ہے۔
CMake 3.22+ مختلف کنفیگریشنز (ڈیبگ، ریلیز، پروفائل) کے لیے مختلف اصلاحی جھنڈوں کے ساتھ پری سیٹ (CMakePresets.json) کو سپورٹ کرتا ہے۔ Android کے لیے، NDK سے android.toolchain.cmake ٹول چین استعمال ہوتی ہے، جو بلڈ کے دوران Gradle کے ذریعے خود بخود فراہم کی جاتی ہے۔
# Android NDK پروجیکٹ کے لیے CMakeLists.txt
cmake_minimum_required(VERSION 3.22)
project("native-lib")
add_library(
native-lib
SHARED
src/main/cpp/native-lib.cpp
src/main/cpp/image_utils.cpp
)
target_include_directories(
native-lib PRIVATE
src/main/cpp/include
)
target_link_libraries(
native-lib
android
log
${CMAKE_SOURCE_DIR}/libs/libjpeg.a
)
set_target_properties(
native-lib PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
)add_library(SHARED) ایک .so لائبریری بناتا ہے۔ target_link_libraries سسٹم لائبریریاں android (JNI کے لیے) اور log (__android_log_print کے لیے) کو لنک کرتا ہے۔ جامد لائبریری libjpeg.a JPEG تصویری ہینڈلنگ کے لیے لنک کی جاتی ہے۔ CXX_STANDARD 20، C++20 سپورٹ فعال کرتا ہے۔
vcpkg Microsoft کا C++ پیکیج مینیجر ہے جو Android NDK کو ہدف پلیٹ فارم کے طور پر سپورٹ کرتا ہے۔ vcpkg کے ذریعے، Android ABI کے لیے کمپائل کردہ Boost، OpenCV، SQLite، nlohmann-json اور دیگر لائبریریاں انسٹال کی جا سکتی ہیں۔ Vcpkg، CMAKE_TOOLCHAIN_FILE کے ذریعے CMake کے ساتھ ضم ہوتا ہے۔
C++ مقامی ARM کوڈ میں کمپائلیشن اور کوڑا کرکٹ جمع کرنے والے کی عدم موجودگی کی وجہ سے موبائل آلات پر زیادہ سے زیادہ کارکردگی فراہم کرتا ہے۔ Google ٹیسٹ (Android Performance Patterns، 2024) کے مطابق، حسابی کاموں کے لیے C++ میں JNI کوڈ مساوی Java کوڈ سے 3–10 گنا تیزی سے چلتا ہے۔
موبائل پلیٹ فارمز پر C++ کارکردگی کے اہم عوامل: کیش لوکلٹی (مسلسل میموری لے آؤٹ)، ARM کے لیے NEON SIMD ہدایات، میسج قطاروں کے ذریعے غیر مطابقت پذیر JNI مواصلات۔ NEON ARM کی SIMD توسیع ہے، جو ایک ہدایت میں 128 بٹ ڈیٹا پراسیس کرتی ہے، آڈیو، ویڈیو اور تصویری پروسیسنگ کے لیے ناگزیر ہے۔
// NEON intrinsics کے ذریعے SIMD ایرے پروسیسنگ
#include <arm_neon.h>
void process_audio_neon(float *data, size_t n) {
for (size_t i = 0; i < n; i += 4) {
float32x4_t vec = vld1q_f32(&data[i]);
float32x4_t result = vmulq_f32(vec, vdupq_n_f32(0.5f));
vst1q_f32(&data[i], result);
}
}vld1q_f32 میموری سے 128 بٹ NEON رجسٹر میں 4 float لوڈ کرتا ہے۔ vmulq_f32 ایک سائیکل میں تمام 4 عناصر کو 0.5 سے ضرب دیتا ہے۔ vst1q_f32 نتیجہ واپس محفوظ کرتا ہے۔ SIMD کے بغیر، وہی لوپ ترتیب وار 4 ضرب لگائے گا — NEON ایسی کارروائیوں کے لیے 4x تک کی رفتار فراہم کرتا ہے۔
| عمل | C++ (ملی سیکنڈ) | Java/Kotlin (ملی سیکنڈ) | رفتار |
|---|---|---|---|
| 1920x1080 تصویری پروسیسنگ | 12 | 45 | 3.75x |
| تیز فوئیر ٹرانسفارم (FFT) | 8 | 34 | 4.25x |
| 1MB بلاک کی AES-256 خفیہ کاری | 3 | 18 | 6x |
| ZLIB ڈیٹا کمپریشن | 5 | 22 | 4.4x |
پہلی اور سب سے خطرناک غلطی میموری کا رساؤ ہے۔ ہر new کے ساتھ delete ہونا چاہیے، ہر new[] کے ساتھ delete[] ہونا چاہیے۔ محدود RAM والے موبائل آلات پر، کوئی بھی رساؤ OOM (میموری ختم) اور ایپ کریش کا سبب بنتا ہے۔ سمارٹ پوائنٹرز (std::unique_ptr، std::shared_ptr، std::weak_ptr) کے ذریعے RAII استعمال کریں۔
دوسری غلطی ABI مطابقت کو نظر انداز کرنا ہے۔ armeabi-v7a کے لیے کمپائل کردہ لائبریری ARM64 ڈیوائس پر لوڈ نہیں ہوگی۔ build.gradle میں ہمیشہ abiFilters بتائیں اور صرف x86_64 ایمولیٹر پر نہیں بلکہ حقیقی آلات پر ٹیسٹ کریں۔ خودکار ABI فلٹرنگ کے لیے Android App Bundle استعمال کریں۔
تیسری عام غلطی بار بار JNI کالز ہے۔ Java اور C++ کے درمیان ہر منتقلی میں تقریباً 50–100 ns لگتے ہیں۔ اگر آپ JNI کے ذریعے 10000 عناصر کی ایک ایرے کو ایک ایک کرکے پراسیس کرتے ہیں، اوور ہیڈ مفید کام سے زیادہ ہو جاتا ہے۔ پوری ایرے ایک بار میں پاس کریں اور C++ طرف پراسیس کریں۔
تھریڈنگ کے مسائل ایک اور عام غلطی ہے۔ C++ std::thread شروع کر سکتا ہے، لیکن JNI تک صرف Java کے بنائے ہوئے تھریڈ سے رسائی ممکن ہے۔ C++ تھریڈ سے Java طریقوں کو کال کرنے کے لیے، JNI کے ذریعے AttachCurrentThread / DetachCurrentThread استعمال کریں۔
// C++ تھریڈ سے Java کو صحیح طریقے سے کال کرنا
JavaVM *g_vm; // JNI_OnLoad پر حاصل کردہ عالمی پوائنٹر
void background_task() {
JNIEnv *env;
jint res = g_vm->AttachCurrentThread(&env, nullptr);
if (res == JNI_OK) {
jclass clazz = env->FindClass("com/example/App");
jmethodID mid = env->GetStaticMethodID(clazz, "onProgress", "(I)V");
env->CallStaticVoidMethod(clazz, mid, 100);
g_vm->DetachCurrentThread();
}
}اکثر پوچھے گئے سوالات
Android NDK (Native Development Kit) ایپلیکیشنز کے حصے C یا C++ میں لکھنے کے لیے ایک ٹول کٹ ہے۔ یہ کارکردگی کے لحاظ سے اہم کاموں، C/C++ لائبریریوں کو Android پر منتقل کرنے اور Unity اور Unreal Engine کے لیے کراس پلیٹ فارم کوڈ لاگو کرنے کے لیے استعمال ہوتا ہے۔
Unity میں، گیم منطق کوڈ C# میں لکھا جاتا ہے، لیکن C++ Android NDK کے ساتھ پلگ انز، ہارڈویئر ایکسلریشن، اپنی C++ لائبریریاں منتقل کرنے اور اشتہارات اور تجزیہ کے لیے مقامی SDKs کو ضم کرنے کے لیے استعمال ہوتا ہے۔
CMakeLists.txt سورس فائلیں، لائبریریاں اور کمپائلیشن جھنڈے بیان کرتی ہے۔ کم سے کم ترتیب میں .so بنانے کے لیے add_library اور Android log اور دیگر سسٹم لائبریریوں کو لنک کرنے کے لیے target_link_libraries شامل ہے۔
JNI (Java Native Interface) Android ایپ کے Java/Kotlin کوڈ اور C++ لائبریری کے درمیان پرت ہے۔ اگر C++ کو Java سے کال کیا جاتا ہے، JNI لازمی ہے۔ آپ NDK کے ذریعے مکمل طور پر C++ کوڈ لکھ سکتے ہیں، لیکن داخلے کا نقطہ عام طور پر ایک Java Activity ہے جو مقامی فنکشنز کال کرتی ہے۔
C++ گیمز، ریئل ٹائم آڈیو/ویڈیو پروسیسنگ، کمپیوٹر وژن، کرپٹوگرافی، فزکس سمولیشنز اور دیگر پلیٹ فارمز سے لائبریریاں منتقل کرنے کے لیے جائز ہے۔ ایک عام UI ایپلیکیشن کے لیے، Kotlin زیادہ موثر اور آسان ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔