इस पेज पर, NDK में शामिल लाइब्रेरी के बारे में खास जानकारी दी गई है. साथ ही, NDK API रेफ़रंस के काम के हिस्सों और गाइड के लिंक भी दिए गए हैं.
नेटिव एपीआई का इस्तेमाल करना
NDK की लाइब्रेरी का इस्तेमाल करने के दो चरण हैं:
बिल्ड सिस्टम को लाइब्रेरी से लिंक करने के लिए कहें.
अगर ndk-build का इस्तेमाल किया जा रहा है, तो Android.mk में लाइब्रेरी को
LOCAL_LDLIBS
में जोड़ें. ध्यान दें कि आपने शुरुआत में मौजूदlib
को हटा दिया है और इसके बजाय-l
कहा है. उदाहरण के लिए,libfoo
औरlibbar
से लिंक करने के लिए, आपको यह लिखना होगा:makefile LOCAL_LDLIBS := -lfoo -lbar
LOCAL_LDLIBS
के बारे में ज़्यादा जानने के लिए, Android.mk दस्तावेज़ देखें.अगर CMake का इस्तेमाल किया जा रहा है, तो Studio के NDK API जोड़ें दस्तावेज़ में दिए गए निर्देशों का पालन करें.
#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
ऑब्जेक्ट के पिक्सल बफ़र को ऐक्सेस किया जा सकता है. वर्कफ़्लो इस तरह का है:
किसी बिटमैप हैंडल के बारे में जानकारी पाने के लिए,
AndroidBitmap_getInfo()
को कॉल करें. जैसे, चौड़ाई और ऊंचाई.पिक्सल बफ़र को लॉक करने और उसका पॉइंटर पाने के लिए,
AndroidBitmap_lockPixels()
को कॉल करें. ऐसा करने से यह पक्का होता है कि ऐप्लिकेशन केAndroidBitmap_unlockPixels()
को कॉल करने तक पिक्सल न हिलें.पिक्सल बफ़र के पिक्सल फ़ॉर्मैट, चौड़ाई, और अन्य विशेषताओं के हिसाब से उसमें बदलाव करें.
बफ़र को अनलॉक करने के लिए,
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 एपीआई रेफ़रंस का दस्तावेज़ देखें.
एपीआई में ये शामिल हैं:
- एसेट
- कोरियोग्राफर
- कॉन्फ़िगरेशन
- इनपुट
- Looper
- नेटिव गतिविधि
- नेटिव हार्डवेयर बफ़र
- नेटिव विंडो
- मेमोरी
- नेटवर्किंग
- सेंसर
- डिवाइस का स्टोरेज
- SurfaceTexture
लाइब्रेरी: 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
गाइड: न्यूरल नेटवर्क के बारे में गाइड
रेफ़रंस: न्यूरल नेटवर्क एपीआई का रेफ़रंस