नमूना: hello-jni

यह नमूना आपको हैलो-जेनी के बारे में बताता है, जो कि एक न्यूनतम NDK के साथ बनाया गया C/C++ ऐप्लिकेशन. यह सैंपल hello-jniडायरेक्ट्री में है android-mk ब्रांच में मौजूद ndk-सैंपल रेपो की जानकारी.

Android.mk

नीचे दी गई दो लाइनों में, नेटिव सोर्स फ़ाइल का नाम दिया गया है. जिसमें शेयर की गई लाइब्रेरी का नाम जोड़ा जा सकता है. बिल्डिंग का पूरा नाम लाइब्रेरी libhello-jni.so है, जब बिल्ड सिस्टम lib प्रीफ़िक्स और .so एक्सटेंशन.

LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE    := hello-jni

Android.mk फ़ाइल क्या काम करती है और इसका इस्तेमाल कैसे किया जाता है, इस बारे में ज़्यादा जानने के लिए, यह लेख पढ़ें Android.mk.

ऐप्लिकेशन.एमके

यह लाइन बिल्ड सिस्टम को सीपीयू और आर्किटेक्चर के बारे में बताती है, जिसे बनाना है. इसमें उदाहरण के लिए, बिल्ड सिस्टम इसके साथ काम करने वाले सभी आर्किटेक्चर के लिए बनाया गया है.

APP_ABI := all

Application.mk फ़ाइल और इसे इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, यहां देखें Application.mk.

Java-साइड लागू करना

helloJNI.java फ़ाइल, hellojni/src/com/example/hellojni/ में मौजूद है. यह कॉल करता है नेटिव साइड से स्ट्रिंग वापस पाने के लिए एक फ़ंक्शन है. इसके बाद, उसे स्क्रीन पर दिखाता है.

सोर्स कोड में, एनडीके (NDK) उपयोगकर्ता की दिलचस्पी वाली तीन लाइनें होती हैं. उन्हें यहां दिए गए क्रम में नहीं, बल्कि उसी क्रम में दिखाया जाता है जिस क्रम में उनका इस्तेमाल किया जाता है लाइन ऑर्डर.

यह फ़ंक्शन कॉल, ऐप्लिकेशन शुरू होने पर .so फ़ाइल लोड करता है.

Kotlin

System.loadLibrary("hello-jni")

Java

System.loadLibrary("hello-jni");

इस तरीके के एलान में मौजूद native कीवर्ड से यह पता चलता है वर्चुअल मशीन, जिसमें फ़ंक्शन शेयर की गई लाइब्रेरी में है (यानी, नेटिव पर लागू किया गया है) साइड).

Kotlin

external fun stringFromJNI(): String

Java

public native String stringFromJNI();

Android फ़्रेमवर्क, उस फ़ंक्शन को कॉल करता है जो पिछले चरण में, स्क्रीन पर स्ट्रिंग दिखा रहा हो.

Kotlin

tv.text = stringFromJNI()

Java

tv.setText( stringFromJNI() );

सी-साइड लागू करना

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. यह नाम Java को दर्शाता है stringFromJNI() नाम का फ़ंक्शन, जो इसमें होता है hellojni/src/com/example/hellojni/HelloJni.java.

JNIEnv*, वीएम का पॉइंटर है और jobject, इंप्लिसिट this ऑब्जेक्ट का पॉइंटर है जिसे यहां से पास किया गया है Android का उपयोग करने के लिए प्रोत्साहित करते हैं.

नीचे दी गई लाइन, VM API को (*env) कॉल करती है और इसे रिटर्न वैल्यू पास करती है: यानी वह स्ट्रिंग जिसका Java साइड पर फ़ंक्शन ने अनुरोध किया था.

return (*env)->NewStringUTF(env, "Hello from JNI !
Compiled with ABI " ABI ".");