يرشدك هذا النموذج خلال hello-jni، وهو تطبيق بسيط للغة C/C++ تم إنشاؤه باستخدام NDK. يتوفّر هذا النموذج في دليل hello-jni في مستودع عيّنات ndk، داخل فرع 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
يوضح هذا السطر لنظام الإنشاء وحدة المعالجة المركزية (CPU) والبنية التي سيتم البناء عليها. في هذا المثال، يتم إنشاء نظام الإنشاء لجميع البنى المدعومة.
APP_ABI := all
للحصول على مزيد من المعلومات عن ملف Application.mk
وكيفية استخدامه، يمكنك الاطّلاع على Application.mk.
التنفيذ من جهة جافا
يقع الملف 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 Native. وهي ليست سلسلة في الواقع،
بل مؤشر إلى سلسلة Java.
بعد jstring
، يظهر اسم الدالة، الذي يعتمد على اسم دالة Java والمسار إلى الملف الذي يحتوي عليها. أنشِئها وفقًا
للقواعد التالية:
- إضافة
Java_
إليها - صِف مسار الملف المرتبط بدليل المصدر ذي المستوى الأعلى.
- استخدم الشرطات السفلية بدلاً من الشرطات المائلة للأمام.
- احذف امتداد الملف
.java
. - بعد الشرطة السفلية الأخيرة، أضف اسم الدالة.
باتباع هذه القواعد، يستخدم هذا المثال اسم الدالة
Java_com_example_hellojni_HelloJni_stringFromJNI
. يشير هذا الاسم إلى دالة Java تُسمى stringFromJNI()
، موجودة في hellojni/src/com/example/hellojni/HelloJni.java
.
JNIEnv*
هو مؤشر الجهاز الافتراضي (VM)، وjobject
هو مؤشر لكائن this
الضمني الذي تم تمريره من جهة Java.
يستدعي السطر التالي واجهة برمجة التطبيقات VM API (*env)
، ويمرّر لها قيمة معروضة، أي السلسلة التي طلبتها الدالة على جهة Java.
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");