Sample: hello-jni

এই স্যাম্পেল আপনাকে hello-jni-এর মাধ্যমে গাইড করে, যা NDK-এর মাধ্যমে তৈরি করা C/C++ অ্যাপ্লিকেশন। এই স্যাম্পেলটি ndk-samples রেপো-র hello-jni ডিরেক্টরিতে, android-mk ব্রাঞ্চের মধ্যে রয়েছে।

Android.mk

নিম্নলিখিত দুটি লাইনে নেটিভ সোর্স ফাইলের নাম এবং তৈরি করার জন্য শেয়ার করা লাইব্রেরির নাম দেওয়া আছে। বিল্ড সিস্টেম lib প্রিফিক্স এবং .so এক্সটেনশন যোগ করার পরে, বিল্ড লাইব্রেরির সম্পূর্ণ নাম হল libhello-jni.so।

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

Android.mk ফাইল কী করে এবং কীভাবে এটি ব্যবহার করতে হয় সেই সম্পর্কে আরও তথ্য পেতে, Android.mk দেখুন।

Application.mk

এই লাইনটি বিল্ড সিস্টেমকে CPU এবং আর্কিটেকচার সম্পর্কে জানায় যার বিপরীতে বিল্ড করতে হবে। এই উদাহরণে, বিল্ড সিস্টেম সব কাজ করে এমন আর্কিটেকচারের জন্য বিল্ড করে।

APP_ABI := all

Application.mk ফাইল এবং এটি কীভাবে ব্যবহার করতে হয় সেই সম্পর্কে আরও জানতে, Application.mk দেখুন।

জাভা-সাইড ইমপ্লিমেন্টেশন

helloJNI.java ফাইলটি hellojni/src/com/example/hellojni/-এ রয়েছে। এটি নেটিভ সাইড থেকে স্ট্রিং ফিরিয়ে আনতে একটি ফাংশনকে কল করে, তারপর স্ক্রিনে এটি দেখায়।

NDK ব্যবহারকারীর জন্য বিশেষ আগ্রহের তিনটি লাইন সোর্স কোডে রয়েছে। এগুলি এখানে লাইনের ক্রম অনুসারে নয়, বরং যে ক্রমে ব্যবহার করা হয়েছে সেই ক্রমে উপস্থাপন করা হয়েছে।

এই ফাংশন কল অ্যাপ্লিকেশন স্টার্টআপের সময় .so ফাইল লোড করে।

Kotlin

System.loadLibrary("hello-jni")

জাভা

System.loadLibrary("hello-jni");

এই পদ্ধতি ঘোষণার native কীওয়ার্ড ভার্চুয়াল মেশিনকে বলে যে ফাংশনটি শেয়ার করা লাইব্রেরিতে আছে (অর্থাৎ, নেটিভ সাইডে প্রয়োগ করা হয়েছে)।

Kotlin

external fun stringFromJNI(): String

জাভা

public native String stringFromJNI();

Android ফ্রেমওয়ার্ক আগের ধাপে লোড ও ঘোষণা করা ফাংশনে কল করে, স্ক্রিনে স্ট্রিং দেখায়।

Kotlin

tv.text = stringFromJNI()

জাভা

tv.setText( stringFromJNI() );

C-সাইড ইমপ্লিমেন্টেশন

hello-jni.c ফাইলটি hello-jni/jni/-এ রয়েছে। এতে এমন একটি ফাংশন আছে যা একটি স্ট্রিং রিটার্ন করে যা জাভা সাইড অনুরোধ করেছে)। ফাংশন ডিক্লারেশন নিচে উল্লেখ করা হল:

JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )

এই ঘোষণা Java সোর্স কোডে ঘোষিত নেটিভ ফাংশনের সাথে সম্পর্কিত। রিটার্ন টাইপ, jstring, হল Java Native Interface Specification-এ সংজ্ঞায়িত একটি ডেটা টাইপ। এটি আসলে কোনও স্ট্রিং নয়, বরং জাভা স্ট্রিংয়ের একটি পয়েন্টার।

jstring-এর পরে ফাংশনের নাম আসে, যা Java ফাংশনের নাম এবং এটি যে ফাইলে আছে তার পাথের উপর ভিত্তি করে তৈরি হয়। নিম্নলিখিত নিয়ম অনুযায়ী এটি তৈরি করুন:

  • এতে Java_ প্রিপেন্ড করুন।
  • টপ-লেভেল সোর্স ডিরেক্টরির সাপেক্ষে ফাইলপাথ বর্ণনা করুন।
  • ফরওয়ার্ড স্ল্যাশের পরিবর্তে আন্ডারস্কোর ব্যবহার করুন।
  • .java ফাইল এক্সটেনশন বাদ দিন।
  • শেষ আন্ডারস্কোরের পরে, ফাংশনের নাম যোগ করুন।

এই নিয়মগুলি মেনে, এই উদাহরণে ফাংশনের নাম Java_com_example_hellojni_HelloJni_stringFromJNI ব্যবহার করা হয়েছে। এই নাম stringFromJNI() নামক Java ফাংশনকে রেফার করে, যা hellojni/src/com/example/hellojni/HelloJni.java-এ থাকে।

JNIEnv* হল VM-এর পয়েন্টার এবং jobject হল জাভা সাইড থেকে পাস করা অন্তর্নিহিত this অবজেক্টের পয়েন্টার।

নিম্নলিখিত লাইনটি VM API (*env) কল করে এবং এটিকে একটি রিটার্ন ভ্যালু পাস করে: অর্থাৎ, Java-এর দিকে ফাংশনটি যে স্ট্রিংয়ের অনুরোধ করেছিল।

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