C++ একটি মাল্টি-প্যারাডাইম প্রোগ্রামিং ভাষা যাতে ম্যানুয়াল মেমোরি ব্যবস্থাপনা রয়েছে, যা প্রক্রিয়াগত, অবজেক্ট-ওরিয়েন্টেড এবং জেনেরিক প্রোগ্রামিংকে একত্রিত করে। মোবাইল ডেভেলপমেন্টে, C++ ব্যবহার করা হয় Android NDK-এর মাধ্যমে লাইব্রেরি পোর্ট করার জন্য এবং ক্রস-প্ল্যাটফর্ম গেম তৈরির জন্য Unity এবং Unreal Engine গেম ইঞ্জিনের মাধ্যমে। TIOBE (2026) অনুসারে, C++ পেশাদার ডেভেলপারদের মধ্যে শীর্ষ ৫টি সবচেয়ে জনপ্রিয় ভাষার মধ্যে একটি।
মূল বিষয়
C++ একটি প্রোগ্রামিং ভাষা যা ১৯৮৫ সালে বিয়ার্ন স্ট্রস্ট্রুপ C ভাষার扩展 হিসাবে ক্লাস সমর্থন সহ তৈরি করেছিলেন। C++ পয়েন্টারের মাধ্যমে প্রত্যক্ষ মেমোরি অ্যাক্সেস, টেমপ্লেট মেটাপ্রোগ্রামিং এবং একাধিক ইনহেরিটেন্স প্রদান করে। C++17 এবং C++20 মান কোরুটিন, কনসেপ্ট এবং রেঞ্জ যোগ করেছে।
Java এবং Kotlin-এর বিপরীতে, C++-এ গার্বেজ কালেক্টর নেই — ডেভেলপার new এবং delete অপারেটরের মাধ্যমে ম্যানুয়ালি মেমোরি বরাদ্দ এবং মুক্তি পরিচালনা করে। এটি কর্মক্ষমতার ওপর পূর্ণ নিয়ন্ত্রণ দেয় কিন্তু শৃঙ্খলা প্রয়োজন। JetBrains Developer Survey (2025) অনুসারে, ৪২% 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 ৫ মিলিয়নেরও বেশি বার ডাউনলোড হয়েছে।
একটি সাধারণ 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 (৬৪-বিট ARM ডিভাইস, ৯৯% আধুনিক স্মার্টফোন), armeabi-v7a (৩২-বিট 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 — একটি ভিজুয়াল স্ক্রিপ্টিং সিস্টেম — এর সাথে একীকরণের জন্য। ক্লাসগুলি উপসর্গ অক্ষর U, A, F সহ বেস টাইপ AActor, UObject, UGameInstance থেকে ইনহেরিট করে।
// 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++ SDK সংযুক্ত করা যায় বা ডেস্কটপ গেম থেকে 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) সমর্থন করে: বিভিন্ন অপ্টিমাইজেশন ফ্ল্যাগ সহ debug, release, profile। 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 কোডের চেয়ে ৩–১০ গুণ দ্রুত চলে।
মোবাইল প্ল্যাটফর্মে C++ কর্মক্ষমতার মূল কারণ: ক্যাশে লোকালিটি (সংলগ্ন মেমোরি বিন্যাস), ARM-এর জন্য NEON SIMD নির্দেশ, বার্তা সারির মাধ্যমে অ্যাসিঙ্ক্রোনাস JNI যোগাযোগ। NEON হল ARM-এর SIMD এক্সটেনশন, যা একটি নির্দেশে ১২৮ বিট ডেটা প্রসেস করে, যা অডিও, ভিডিও এবং ইমেজ প্রসেসিংয়ের জন্য অপরিহার্য।
// 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 মেমোরি থেকে ১২৮-বিট NEON রেজিস্টারে ৪টি float লোড করে। vmulq_f32 একটি চক্রে সমস্ত ৪টি উপাদানকে ০.৫ দিয়ে গুণ করে। vst1q_f32 ফলাফল ফিরিয়ে রাখে। SIMD ছাড়া, একই লুপ ক্রমিকভাবে ৪টি গুণন করবে — NEON এই ধরনের অপারেশনের জন্য 4x পর্যন্ত স্পিডআপ দেয়।
| অপারেশন | C++ (মি.সে.) | Java/Kotlin (মি.সে.) | স্পিডআপ |
|---|---|---|---|
| 1920x1080 ইমেজ প্রসেসিং | ১২ | ৪৫ | ৩.৭৫x |
| ফাস্ট ফুরিয়ার ট্রান্সফর্ম (FFT) | ৮ | ৩৪ | ৪.২৫x |
| ১MB ব্লকের AES-256 এনক্রিপশন | ৩ | ১৮ | ৬x |
| ZLIB ডেটা কম্প্রেশন | ৫ | ২২ | ৪.৪x |
প্রথম এবং সবচেয়ে বিপজ্জনক ভুল হল মেমোরি লিক। প্রতিটি new-এর সাথে delete থাকতে হবে, প্রতিটি new[]-এর সাথে delete[] থাকতে হবে। সীমিত RAM-যুক্ত মোবাইল ডিভাইসে, যেকোনো লিক OOM (মেমোরি শেষ) এবং অ্যাপ ক্র্যাশের কারণ হয়। স্মার্ট পয়েন্টারের মাধ্যমে RAII ব্যবহার করুন: std::unique_ptr, std::shared_ptr, std::weak_ptr।
দ্বিতীয় ভুল হল ABI সামঞ্জস্য উপেক্ষা করা। armeabi-v7a-র জন্য কম্পাইল করা লাইব্রেরি ARM64 ডিভাইসে লোড হবে না। build.gradle-এ সর্বদা abiFilters নির্দিষ্ট করুন এবং শুধু x86_64 এমুলেটর নয়, বাস্তব ডিভাইসে পরীক্ষা করুন। স্বয়ংক্রিয় ABI ফিল্টারিংয়ের জন্য Android App Bundle ব্যবহার করুন।
তৃতীয় সাধারণ ভুল হল ঘন ঘন JNI কল। Java এবং C++-এর মধ্যে প্রতিটি স্থানান্তরে প্রায় ৫০–১০০ ns খরচ হয়। যদি আপনি JNI-এর মাধ্যমে একবারে ১০০০০ উপাদানের একটি অ্যারে প্রসেস করেন, ওভারহেড কার্যকর কাজকে ছাড়িয়ে যায়। সম্পূর্ণ অ্যারে একবারে পাস করুন এবং 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++ লাইব্রেরি পোর্ট করা এবং বিজ্ঞাপন ও বিশ্লেষণের জন্য নেটিভ SDK সংহত করতে ব্যবহৃত হয়।
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।