इस सैंपल में, hello-jni के बारे में बताया गया है. यह NDK की मदद से बनाया गया, कम से कम C/C++ ऐप्लिकेशन है. यह सैंपल, ndk-samples repo की hello-jni डायरेक्ट्री में, android-mk branch में मौजूद है.
Android.mk
यहां दी गई दो लाइनों में, नेटिव सोर्स फ़ाइल का नाम और शेयर की जाने वाली लाइब्रेरी का नाम दिया गया है. बनाई गई लाइब्रेरी का पूरा नाम libhello-jni.so
है. जब बिल्ड सिस्टम lib
प्रीफ़िक्स और .so
एक्सटेंशन जोड़ लेता है.
LOCAL_SRC_FILES := hello-jni.c LOCAL_MODULE := hello-jni
Android.mk
फ़ाइल क्या करती है और इसका इस्तेमाल कैसे किया जाता है, इस बारे में ज़्यादा जानने के लिए, Android.mk देखें.
Application.mk
यह लाइन बिल्ड सिस्टम को सीपीयू और आर्किटेक्चर के बारे में बताती है, जिसे बनाना है. इस उदाहरण में, बिल्ड सिस्टम इसके साथ काम करने वाले सभी आर्किटेक्चर के लिए बनाया गया है.
APP_ABI := all
Application.mk
फ़ाइल और उसका इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए,
Application.mk देखें.
Java-side Implementation
helloJNI.java
फ़ाइल, hellojni/src/com/example/hellojni/
में मौजूद है. यह नेटिव साइड से स्ट्रिंग वापस पाने के लिए फ़ंक्शन को कॉल करता है. इसके बाद, उसे स्क्रीन पर दिखाता है.
सोर्स कोड में, एनडीके (NDK) उपयोगकर्ता की दिलचस्पी वाली तीन लाइनें होती हैं. यहां उन्हें लाइन के क्रम के बजाय, इस्तेमाल किए जाने के क्रम में दिखाया गया है.
यह फ़ंक्शन कॉल, ऐप्लिकेशन के स्टार्टअप होने पर .so
फ़ाइल को लोड करता है.
इस तरीके के एलान में मौजूद native
कीवर्ड, वर्चुअल मशीन को बताता है कि फ़ंक्शन, शेयर की गई लाइब्रेरी में है. इसका मतलब है कि इसे नेटिव साइड पर लागू किया गया है.
Android फ़्रेमवर्क, पिछले चरणों में लोड किए गए और बताए गए फ़ंक्शन को कॉल करता है. साथ ही, स्क्रीन पर स्ट्रिंग दिखाता है.
C-साइड पर लागू करना
hello-jni.c
फ़ाइल, hello-jni/jni/
में मौजूद है. इसमें ऐसा फ़ंक्शन होता है जो Java साइड से अनुरोध किया गया वाली स्ट्रिंग दिखाता है. फ़ंक्शन का एलान इस तरह से किया जाता है:
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
यह एलान, Java सोर्स कोड में बताए गए नेटिव फ़ंक्शन से जुड़ा है. रिटर्न टाइप, jstring
एक ऐसा डेटा टाइप है जिसके बारे में Java नेटिव
इंटरफ़ेस स्पेसिफ़िकेशन में बताया गया है. यह असल में कोई स्ट्रिंग नहीं है, बल्कि Java स्ट्रिंग का एक पॉइंटर है.
jstring
के बाद, फ़ंक्शन का नाम आता है, जो
Java फ़ंक्शन के नाम और उसमें मौजूद फ़ाइल के पाथ पर आधारित होता है. इसे नीचे दिए गए नियमों के हिसाब से बनाएं:
- इसके आगे
Java_
जोड़ें. - टॉप-लेवल सोर्स डायरेक्ट्री के हिसाब से फ़ाइलपाथ के बारे में बताएं.
- फ़ॉरवर्ड स्लैश के बजाय अंडरस्कोर का इस्तेमाल करें.
.java
फ़ाइल एक्सटेंशन को हटाएं.- आखिरी अंडरस्कोर के बाद, फ़ंक्शन का नाम जोड़ें.
इन नियमों के मुताबिक, इस उदाहरण में Java_com_example_hellojni_HelloJni_stringFromJNI
फ़ंक्शन का इस्तेमाल किया गया है. यह नाम, stringFromJNI()
नाम के Java फ़ंक्शन को दिखाता है, जो hellojni/src/com/example/hellojni/HelloJni.java
में मौजूद है.
JNIEnv*
, वीएम का पॉइंटर है और
jobject
, Java साइड से पास किए गए this
ऑब्जेक्ट का पॉइंटर है.
नीचे दी गई लाइन, VM API को (*env)
कॉल करती है और इसे रिटर्न वैल्यू पास करती है:
यानी कि वह स्ट्रिंग जिसके लिए Java साइड पर फ़ंक्शन ने अनुरोध किया था.
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");