नेटिव एपीआई

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

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

NDK की लाइब्रेरी का इस्तेमाल करने के दो चरण हैं:

  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() के ज़रिए उनका इस्तेमाल करना होगा. आसान तरीके के लिए, नए एपीआई का इस्तेमाल करना लेख पढ़ें.

कोर C/C++

C लाइब्रेरी

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

ध्यान दें कि 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 कंप्रेसन लाइब्रेरी का इस्तेमाल किया जा सकता है.

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

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

लाइब्रेरी: libz

ग्राफ़िक्स

OpenGL ES 1.0 - 3.2

स्टैंडर्ड 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 के लिए ज़रूरी एलान शामिल होते हैं.

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

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

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

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

OpenGL ES के नए वर्शन सिर्फ़ उन Android डिवाइसों पर पूरी तरह काम करते हैं जिनमें ज़रूरी जीपीयू मौजूद होता है. हालांकि, लाइब्रेरी उन सभी डिवाइसों पर मौजूद होती हैं जो एपीआई के उस लेवल के साथ काम करती हैं जिस पर उन्हें लॉन्च किया गया था. लाइब्रेरी के साथ लिंक करना सुरक्षित है. हालांकि, किसी ऐप्लिकेशन को यह पता लगाने के लिए, 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 लाइब्रेरी, API को एक्सपोज़ करती है. इससे Java Bitmap ऑब्जेक्ट के पिक्सल बफ़र को ऐक्सेस किया जा सकता है. वर्कफ़्लो इस तरह का है:

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

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

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

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

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

लाइब्रेरी: libjnigraphics

रेफ़रंस: बिटमैप एपीआई का रेफ़रंस

Sync API

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

लाइब्रेरी: libsync

रेफ़रंस: Sync API का रेफ़रंस

कैमरा

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

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

लाइब्रेरी: libcamera2ndk

रेफ़रंस: Camera API का रेफ़रंस

मीडिया

libmediandk

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

लाइब्रेरी: libmediandk

रेफ़रंस: Media API का रेफ़रंस

OpenMAX AL

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

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

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

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

लाइब्रेरी: libOpenMAXAL

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

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

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

लाइब्रेरी: libandroid

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

पूरा रेफ़रंस: Android NDK API का रेफ़रंस

Binder API

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

लाइब्रेरी: libbinder_ndk

रेफ़रंस: Binder

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

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

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

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

ऑडियो

AAudio

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

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

लाइब्रेरी: libaaudio

गाइड: AAudio API की गाइड

रेफ़रंस: AAudio API का रेफ़रंस

OpenSL ES

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

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

लाइब्रेरी: libOpenSLES

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

Neural Networks API

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

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

लाइब्रेरी: libneuralnetworks

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

रेफ़रंस: न्यूरल नेटवर्क एपीआई का रेफ़रंस