नेटिव एपीआई

इस पेज पर, NDK में शामिल लाइब्रेरी के बारे में खास जानकारी दी गई है. साथ ही, NDK API के रेफ़रंस के काम के हिस्सों और गाइड के लिंक दिए गए हैं.

नेटिव एपीआई का इस्तेमाल करना

एनडीके की ओर से उपलब्ध कराई गई लाइब्रेरी का इस्तेमाल करने के लिए, ये दो चरण पूरे करें:

  1. बिल्ड सिस्टम को लाइब्रेरी के ख़िलाफ़ लिंक करने के लिए कहें.

    • अगर ndk-build का इस्तेमाल किया जा रहा है, तो अपनी Android.mk फ़ाइल में LOCAL_LDLIBS में लाइब्रेरी जोड़ें. ध्यान दें कि आपको lib को हटाकर, उसकी जगह -l लिखना होगा. उदाहरण के लिए, libfoo और libbar के ख़िलाफ़ लिंक करने के लिए, आपको यह लिखना होगा: makefile LOCAL_LDLIBS := -lfoo -lbar

      LOCAL_LDLIBS के बारे में ज़्यादा जानने के लिए, Android.mk दस्तावेज़ देखें.

    • अगर CMake का इस्तेमाल किया जा रहा है, तो Studio के NDK API जोड़ें दस्तावेज़ में दिए गए निर्देशों का पालन करें.

  2. #include अपने कोड से सही हेडर.

ध्यान दें कि आपके ऐप्लिकेशन के minSdkVersion से नए एपीआई डिफ़ॉल्ट रूप से कॉल नहीं किए जा सकेंगे. इसके बजाय, आपको उन्हें dlopen() और dlsym() के ज़रिए इस्तेमाल करना होगा. आसान तरीके से लागू करने के लिए, नए एपीआई का इस्तेमाल करना लेख पढ़ें.

Core C/C++

C लाइब्रेरी

स्टैंडर्ड C11 लाइब्रेरी के हेडर, जैसे कि <stdlib.h> और <stdio.h> हमेशा की तरह उपलब्ध हैं.

ध्यान दें कि Android पर, Linux के उलट कोई अलग libpthread या librt लाइब्रेरी नहीं होती है. यह सुविधा सीधे तौर पर libc में शामिल है. इसलिए, इसे साफ़ तौर पर लिंक करने की ज़रूरत नहीं है.

गणित के फ़ंक्शन के लिए एक अलग libm होता है (Unix की सामान्य परंपरा के मुताबिक), लेकिन libc की तरह, यह बिल्ड सिस्टम से अपने-आप लिंक हो जाता है.

<dlfcn.h> में डाइनैमिक लिंकर की सुविधा उपलब्ध है. जैसे, dlopen(3) और dlsym(3). हालांकि, आपको libdl के ख़िलाफ़ साफ़ तौर पर लिंक करना होगा.

लाइब्रेरी: libc / libm / libdl

C++ लाइब्रेरी

C++17 के साथ काम करता है. C++ लाइब्रेरी के साथ काम करने की सुविधा के बारे में ज़्यादा जानने के लिए, C++ लाइब्रेरी के साथ काम करने की सुविधा लेख पढ़ें.

लॉग इन हो रहा है

<android/log.h> में लॉगकेट में लॉग करने के लिए एपीआई शामिल हैं.

यह एपीआई लेवल 3 से उपलब्ध है.

लाइब्रेरी: liblog

रेफ़रंस: लॉगिंग

ट्रेस

नेटिव ट्रेसिंग एपीआई <android/trace.h>, Java प्रोग्रामिंग लैंग्वेज में android.os.Trace क्लास के नेटिव वर्शन को उपलब्ध कराता है. इस एपीआई की मदद से, सिस्टम ट्रेस बफ़र में ट्रेस इवेंट लिखकर, अपने कोड में काम की इकाइयों को ट्रेस किया जा सकता है. इसके बाद, Systrace टूल का इस्तेमाल करके, ट्रेस इवेंट इकट्ठा किए जा सकते हैं और उनका विश्लेषण किया जा सकता है.

यह एपीआई लेवल 23 से उपलब्ध है.

लाइब्रेरी: libandroid

गाइड: नेटिव ट्रेसिंग

zlib कंप्रेशन

<zlib.h> को शामिल करके और libz से लिंक करके, Zlib कंप्रेस करने वाली लाइब्रेरी का इस्तेमाल किया जा सकता है.

एनडीके में रिलीज़ के समय, हमेशा zlib की नई हेडर फ़ाइलें शामिल होती हैं. साथ ही, एनडीके में स्टैटिक लिंकिंग के लिए शामिल किया गया libz.a हमेशा एक ही वर्शन होता है. हालांकि, डाइनैमिक लिंकिंग के लिए libz.so डिवाइस से मिलता है. साथ ही, यह उस डिवाइस पर रिलीज़ किया गया कोई भी वर्शन हो सकता है. खास तौर पर, इसका मतलब यह है कि आपने जिन हेडर के आधार पर लाइब्रेरी बनाई है वे डिवाइस पर मौजूद zlib के वर्शन से मेल नहीं खाते. इसलिए, लागू करने से जुड़ी जानकारी के बारे में अनुमान लगाने के ख़िलाफ़ दी जाने वाली सामान्य चेतावनियां यहां खास तौर पर मान्य हैं. हमें सार्वजनिक एपीआई से जुड़ी किसी समस्या के बारे में जानकारी नहीं है. हालांकि, समय के साथ-साथ स्ट्रक्चर लेआउट में बदलाव हुआ है और आने वाले समय में भी ऐसा हो सकता है. ध्यान दें कि zlib के बाद के वर्शन में मौजूद नया एपीआई, एपीआई से पहले के ओएस वर्शन पर उपलब्ध नहीं होगा. इन सभी समस्याओं से बचा जा सकता है. हालांकि, ऐसा करने पर APK का साइज़ बढ़ जाएगा. इसके लिए, हमेशा libz.so के बजाय स्टैटिक libz.a का इस्तेमाल करें.

यह एपीआई लेवल 3 से उपलब्ध है. हालांकि, ऊपर दिया गया नोट देखें.

लाइब्रेरी: libz

ग्राफ़िक्स

OpenGL ES 1.0 - 3.2

OpenGL ES के लिए ज़रूरी एलान, OpenGL ES 1.x के स्टैंडर्ड हेडर (<GLES/gl.h> और <GLES/glext.h>), 2.0 के हेडर (<GLES2/gl2.h> और <GLES2/gl2ext.h>), 3.0 के हेडर (<GLES3/gl3.h> और <GLES3/gl3ext.h>), 3.1 के हेडर (<GLES3/gl31.h> और <GLES3/gl3ext.h>), और 3.2 के हेडर (<GLES3/gl32.h> और <GLES3/gl3ext.h>) में शामिल होते हैं.

OpenGL ES 1.x का इस्तेमाल करने के लिए, अपने नेटिव मॉड्यूल को libGLESv1_CM से लिंक करें.

OpenGL ES 2.0 का इस्तेमाल करने के लिए, अपने नेटिव मॉड्यूल को libGLESv2 से लिंक करें.

OpenGL ES 3.x का इस्तेमाल करने के लिए, अपने नेटिव मॉड्यूल को libGLESv3 से लिंक करें.

Android पर काम करने वाले सभी डिवाइसों पर OpenGL ES 1.0 और 2.0 काम करता है.

सिर्फ़ ऐसे Android डिवाइसों पर OpenGL ES के नए वर्शन पूरी तरह से काम करते हैं जिनमें ज़रूरी जीपीयू मौजूद हो. हालांकि, ये लाइब्रेरी उन सभी डिवाइसों पर मौजूद होती हैं जिन पर एपीआई लेवल काम करता है. लाइब्रेरी से लिंक करना सुरक्षित है. हालांकि, किसी ऐप्लिकेशन को OpenGL ES वर्शन स्ट्रिंग और एक्सटेंशन स्ट्रिंग के बारे में क्वेरी करनी होगी, ताकि यह पता चल सके कि मौजूदा डिवाइस, ऐप्लिकेशन के लिए ज़रूरी सुविधाओं के साथ काम करता है या नहीं. इस क्वेरी को पूरा करने के तरीके के बारे में जानकारी पाने के लिए, OpenGL स्पेसिफ़िकेशन में glGetString() का ब्यौरा देखें.

इसके अलावा, आपको अपनी मेनिफ़ेस्ट फ़ाइल में <uses-feature> टैग डालना होगा, ताकि यह पता चल सके कि आपको OpenGL ES के किस वर्शन की ज़रूरत है.

OpenGL ES 1.0, एपीआई लेवल 4 से उपलब्ध है.

OpenGL ES 2.0, एपीआई लेवल 5 से उपलब्ध है.

OpenGL ES 3.0, एपीआई लेवल 18 से उपलब्ध है.

OpenGL ES 3.1, एपीआई लेवल 21 से उपलब्ध है.

OpenGL ES 3.2, एपीआई लेवल 24 से उपलब्ध है.

EGL

EGL, <EGL/egl.h> और <EGL/eglext.h> हेडर के ज़रिए नेटिव प्लैटफ़ॉर्म इंटरफ़ेस उपलब्ध कराता है. इसका इस्तेमाल OpenGL ES कॉन्टेक्स्ट और सर्फ़ेस को असाइन और मैनेज करने के लिए किया जाता है.

EGL की मदद से, नेटिव कोड से ये कार्रवाइयां की जा सकती हैं:

  • EGL के साथ काम करने वाले कॉन्फ़िगरेशन की सूची बनाएं.
  • OpenGL ES के लिए सर्फ़ेस असाइन और रिलीज़ करता है.
  • OpenGL ES कॉन्टेक्स्ट बनाना और उन्हें बंद करना.
  • सरफ़ेस स्वैप या फ़्लिप करें.

एपीआई लेवल 24 में, EGL_KHR_mutable_render_buffer, ANDROID_create_native_client_buffer, और ANDROID_front_buffer_auto_refresh एक्सटेंशन के लिए सहायता जोड़ी गई है.

यह एपीआई लेवल 9 से उपलब्ध है.

लाइब्रेरी: libEGL

गाइड: EGL नेटिव प्लैटफ़ॉर्म इंटरफ़ेस

Vulkan

Vulkan, कम ओवरहेड वाला क्रॉस-प्लैटफ़ॉर्म एपीआई है. इसका इस्तेमाल, हाई-परफ़ॉर्मेंस वाले 3D ग्राफ़िक रेंडर करने के लिए किया जाता है. Vulkan, Khronos Group का ओपन स्टैंडर्ड है. स्टैंडर्ड <vulkan/vulkan.h> हेडर फ़ाइल में, आपके कोड से Vulkan रेंडरिंग कॉल करने के लिए ज़रूरी एलान शामिल होते हैं.

कोड के सैंपल के लिए, GitHub पर LunarG के VulkanSamples और android-vulkan-tutorials प्रोजेक्ट देखें.

Vulkan लाइब्रेरी, एपीआई लेवल 24 या इसके बाद के वर्शन वाले सभी डिवाइसों पर मौजूद होती है. हालांकि, ऐप्लिकेशन को रनटाइम के दौरान यह जांच करनी होगी कि ज़रूरी जीपीयू हार्डवेयर सपोर्ट उपलब्ध है या नहीं. जिन डिवाइसों पर Vulkan काम नहीं करता है उन पर vkEnumeratePhysicalDevices से कोई डिवाइस नहीं दिखेगा.

यह एपीआई लेवल 24 से उपलब्ध है.

लाइब्रेरी: libvulkan

गाइड: Vulkan ग्राफ़िक्स एपीआई गाइड

बिटमैप

libjnigraphics लाइब्रेरी, एपीआई को इस तरह से उपलब्ध कराती है कि Java Bitmap ऑब्जेक्ट के पिक्सल बफ़र को ऐक्सेस किया जा सके. वर्कफ़्लो इस तरह होता है:

  1. किसी दिए गए बिटमैप हैंडल की चौड़ाई और ऊंचाई जैसी जानकारी पाने के लिए, AndroidBitmap_getInfo() को कॉल करें.

  2. पिक्सेल बफ़र को लॉक करने और उसका पॉइंटर पाने के लिए, AndroidBitmap_lockPixels() को कॉल करें. ऐसा करने से यह पक्का होता है कि ऐप्लिकेशन के AndroidBitmap_unlockPixels() को कॉल करने तक पिक्सल नहीं हिलते.

  3. पिक्सेल बफ़र में बदलाव करें, ताकि वह पिक्सेल फ़ॉर्मैट, चौड़ाई, और अन्य विशेषताओं के हिसाब से सही हो.

  4. बफ़र को अनलॉक करने के लिए, AndroidBitmap_unlockPixels() को कॉल करें.

यह एपीआई लेवल 8 से उपलब्ध है.

लाइब्रेरी: libjnigraphics

संदर्भ: बिटमैप एपीआई के बारे में जानकारी

Sync API

यह एपीआई लेवल 26 से उपलब्ध है.

लाइब्रेरी: libsync

संदर्भ: सिंक एपीआई के बारे में जानकारी

कैमरा

नेटिव कैमरा एपीआई, फ़ोटो को बारीकी से कैप्चर और प्रोसेस करते हैं. Java camera2 API के उलट, नेटिव कैमरा एपीआई, बंद किए गए कैमरा HAL 1.0 को लागू करने की सुविधा नहीं देता. इसका मतलब है कि नेटिव कैमरा एपीआई में उपलब्ध कैमरे की सूची में, ऐसे कैमरा डिवाइस शामिल नहीं होंगे जिनका हार्डवेयर लेवल LEGACY है.

यह एपीआई लेवल 24 से उपलब्ध है.

लाइब्रेरी: libcamera2ndk

संदर्भ: Camera API के बारे में जानकारी

मीडिया

libmediandk

मीडिया एपीआई, MediaExtractor, MediaCodec, और Java से जुड़े अन्य एपीआई की तरह ही, लो-लेवल नेटिव इंटरफ़ेस उपलब्ध कराते हैं.

लाइब्रेरी: libmediandk

संदर्भ: Media API के बारे में जानकारी

OpenMAX AL

Android में मल्टीमीडिया को मैनेज करने की सुविधा, Khronos Group OpenMAX AL 1.0.1 API पर आधारित है.

स्टैंडर्ड OpenMAX AL हेडर <OMXAL/OpenMAXAL.h> और <OMXAL/OpenMAXAL_Platform.h> में, Android के नेटिव साइड से मल्टीमीडिया आउटपुट देने के लिए ज़रूरी डिक्लेरेशन शामिल होते हैं.

OpenMAX AL के NDK डिस्ट्रिब्यूशन में, Android के लिए खास एक्सटेंशन भी उपलब्ध होते हैं. इन एक्सटेंशन के बारे में जानकारी पाने के लिए, <OMXAL/OpenMAXAL_Android.h> में मौजूद टिप्पणियां देखें.

यह एपीआई लेवल 14 से उपलब्ध है.

लाइब्रेरी: libOpenMAXAL

Android के नेटिव ऐप्लिकेशन एपीआई

ज़्यादा जानकारी के लिए, Android NDK API रेफ़रंस दस्तावेज़ देखें.

एपीआई में ये शामिल हैं:

लाइब्रेरी: libandroid

लाइब्रेरी: नेटिव विंडो की नई सुविधा के लिए libnativewindow

पूरी जानकारी: Android NDK API के बारे में जानकारी

Binder API

Binder API की मदद से, प्रोसेस के बीच कम्यूनिकेशन चैनल बनाए जा सकते हैं. यह Android इंटरप्रोसेस कम्यूनिकेशन का लो लेवल इंप्लीमेंटेशन है. जब भी हो सके, तब ज़्यादा अहमियत वाले कॉम्पोनेंट का इस्तेमाल करें. हालांकि, यह लाइब्रेरी ऐडवांस इस्तेमाल के उदाहरणों के लिए उपलब्ध है.

लाइब्रेरी: libbinder_ndk

रेफ़रंस: Binder

हार्डवेयर बफ़र एपीआई

दो नेटिव एपीआई उपलब्ध हैं. इनकी मदद से, अलग-अलग प्रोसेस के बीच बफ़र को मैनेज करने के लिए, अपनी पाइपलाइन बनाई जा सकती हैं.

नेटिव हार्डवेयर बफ़र एपीआई <android/hardware_buffer.h> की मदद से, बफ़र को सीधे तौर पर असाइन किया जा सकता है. इससे, क्रॉस-प्रोसेस बफ़र मैनेजमेंट के लिए अपनी पाइपलाइन बनाई जा सकती हैं. AHardwareBuffer को असाइन किया जा सकता है. साथ ही, eglGetNativeClientBufferANDROID एक्सटेंशन के ज़रिए EGLClientBuffer रिसॉर्स टाइप पाने के लिए इसका इस्तेमाल किया जा सकता है. eglCreateImageKHR को उस बफ़र को पास करके, EGLImage रिसॉर्स टाइप बनाया जा सकता है. इसके बाद, इसे glEGLImageTargetTexture2DOES के ज़रिए, सुविधा वाले डिवाइसों पर टेक्सचर से बाइंड किया जा सकता है. यह ऐसी बनावटें बनाने के लिए फ़ायदेमंद हो सकता है जिन्हें अलग-अलग प्रोसेस के बीच शेयर किया जा सकता है.

नेटिव हार्डवेयर बफ़र JNI API (<android/hardware_buffer_jni.h>) की मदद से, HardwareBuffer ऑब्जेक्ट पाया जा सकता है. यह एक Parcelable ऑब्जेक्ट होता है. इसलिए, इसे दो अलग-अलग प्रोसेस के बीच ट्रांसफ़र किया जा सकता है. इससे आपके ऐप्लिकेशन को SurfaceFlinger जैसी सुविधाएं मिलती हैं. जैसे, इंटरनल Android API को ऐक्सेस किए बिना, प्रोसेस के बीच बफ़र की अपनी क्यू बनाना.

ऑडियो

AAudio

AAudio, फ़िलहाल इस्तेमाल किया जा सकने वाला नेटिव ऑडियो एपीआई है. इसने OpenSL ES की जगह ली है. साथ ही, यह उन ऑडियो ऐप्लिकेशन के लिए बेहतर है जिनकी परफ़ॉर्मेंस अच्छी होती है और जिनमें कम समय में ऑडियो प्रोसेस करने की ज़रूरत होती है.

यह एपीआई लेवल 26 से उपलब्ध है.

लाइब्रेरी: libaaudio

गाइड: AAudio API गाइड

रेफ़रंस: AAudio API के बारे में जानकारी

OpenSL ES

OpenSL ES एक और नेटिव ऑडियो एपीआई है. यह भी काम करता है. हालांकि, यहां दी गई गाइड में मौजूद नोट देखें.

यह एपीआई लेवल 9 से उपलब्ध है. एपीआई लेवल 14 में पीसीएम सपोर्ट जोड़ा गया है.

लाइब्रेरी: libOpenSLES

गाइड: Android के लिए OpenSL ES गाइड

Neural Networks API

Neural Networks API (NNAPI), ऐप्लिकेशन को डिवाइस पर मशीन लर्निंग की कार्रवाइयों के लिए हार्डवेयर से तेज़ी लाने की सुविधा देता है. यह एपीआई, डिवाइस पर मॉडल बनाने, कंपाइल करने, और उसे लागू करने की सुविधा देता है. आम तौर पर, ऐप्लिकेशन सीधे तौर पर NNAPI का इस्तेमाल नहीं करते हैं. इसके बजाय, इस एपीआई को मशीन लर्निंग लाइब्रेरी, फ़्रेमवर्क, और टूल से कॉल किया जाता है. इनकी मदद से डेवलपर, अपने मॉडल को ट्रेन कर सकते हैं और उन्हें Android डिवाइसों पर डिप्लॉय कर सकते हैं.

यह एपीआई लेवल 27 से उपलब्ध है.

लाइब्रेरी: libneuralnetworks

गाइड: न्यूरल नेटवर्क गाइड

संदर्भ: Neural Networks API के बारे में जानकारी