عيّنة: hello-jni

يرشدك هذا النموذج خلال 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 ".");