নমুনা: hello-jni

এই নমুনাটি আপনাকে হ্যালো-জেএনআই-এর মাধ্যমে গাইড করে, একটি ন্যূনতম C/C++ অ্যাপ্লিকেশন যা NDK-এর সাহায্যে তৈরি করা হয়েছে। এই নমুনাটি ndk-samples repo-এর hello-jni ডিরেক্টরিতে রয়েছে, android-mk শাখার ভিতরে।

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

জাভা-সাইড বাস্তবায়ন

helloJNI.java ফাইলটি hellojni/src/com/example/hellojni/ এ অবস্থিত। এটি নেটিভ সাইড থেকে একটি স্ট্রিং পুনরুদ্ধার করার জন্য একটি ফাংশনকে কল করে, তারপর এটি স্ক্রিনে প্রদর্শন করে।

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

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

কোটলিন

System.loadLibrary("hello-jni")

জাভা

System.loadLibrary("hello-jni");

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

কোটলিন

external fun stringFromJNI(): String

জাভা

public native String stringFromJNI();

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক পূর্ববর্তী ধাপে লোড এবং ঘোষিত ফাংশনটিকে কল করে, স্ক্রিনে স্ট্রিং প্রদর্শন করে।

কোটলিন

tv.text = stringFromJNI()

জাভা

tv.setText( stringFromJNI() );

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

hello-jni.c ফাইলটি hello-jni/jni/ এ অবস্থিত। এটিতে একটি ফাংশন রয়েছে যা একটি স্ট্রিং প্রদান করে যা জাভা পক্ষ অনুরোধ করেছিল )। ফাংশন ঘোষণা নিম্নরূপ:

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

এই ঘোষণাটি জাভা সোর্স কোডে ঘোষিত নেটিভ ফাংশনের সাথে মিলে যায়। রিটার্ন টাইপ, jstring হল জাভা নেটিভ ইন্টারফেস স্পেসিফিকেশনে সংজ্ঞায়িত একটি ডাটা টাইপ। এটা আসলে একটি স্ট্রিং নয়, কিন্তু একটি জাভা স্ট্রিং একটি পয়েন্টার.

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

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

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

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

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

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

এই নমুনাটি আপনাকে হ্যালো-জেএনআই-এর মাধ্যমে গাইড করে, একটি ন্যূনতম C/C++ অ্যাপ্লিকেশন যা NDK-এর সাহায্যে তৈরি করা হয়েছে। এই নমুনাটি ndk-samples repo-এর hello-jni ডিরেক্টরিতে রয়েছে, android-mk শাখার ভিতরে।

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

জাভা-সাইড বাস্তবায়ন

helloJNI.java ফাইলটি hellojni/src/com/example/hellojni/ এ অবস্থিত। এটি নেটিভ সাইড থেকে একটি স্ট্রিং পুনরুদ্ধার করার জন্য একটি ফাংশনকে কল করে, তারপর এটি স্ক্রিনে প্রদর্শন করে।

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

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

কোটলিন

System.loadLibrary("hello-jni")

জাভা

System.loadLibrary("hello-jni");

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

কোটলিন

external fun stringFromJNI(): String

জাভা

public native String stringFromJNI();

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক পূর্ববর্তী ধাপে লোড এবং ঘোষিত ফাংশনটিকে কল করে, স্ক্রিনে স্ট্রিং প্রদর্শন করে।

কোটলিন

tv.text = stringFromJNI()

জাভা

tv.setText( stringFromJNI() );

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

hello-jni.c ফাইলটি hello-jni/jni/ এ অবস্থিত। এটিতে একটি ফাংশন রয়েছে যা একটি স্ট্রিং প্রদান করে যা জাভা পক্ষ অনুরোধ করেছিল )। ফাংশন ঘোষণা নিম্নরূপ:

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

এই ঘোষণাটি জাভা সোর্স কোডে ঘোষিত নেটিভ ফাংশনের সাথে মিলে যায়। রিটার্ন টাইপ, jstring হল জাভা নেটিভ ইন্টারফেস স্পেসিফিকেশনে সংজ্ঞায়িত একটি ডাটা টাইপ। এটা আসলে একটি স্ট্রিং নয়, কিন্তু একটি জাভা স্ট্রিং একটি পয়েন্টার.

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

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

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

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

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

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