نمونه: hello-jni

این نمونه شما را در hello-jni راهنمایی می‌کند، یک برنامه C/C++‎ حداقلی که با NDK ساخته شده است. این نمونه در دایرکتوری hello-jni مخزن ndk-samples، داخل شاخه 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 را هنگام راه‌اندازی برنامه بار می‌کند.

کاتلین

System.loadLibrary("hello-jni")

جاوا

System.loadLibrary("hello-jni");

کلیدواژه native در این اعلان روش به ماشین مجازی می‌گوید که تابع در کتابخانه مشترک است (یعنی در سمت بومی پیاده‌سازی شده است).

کاتلین

external fun stringFromJNI(): String

جاوا

public native String stringFromJNI();

چارچوب Android تابع بارشده و اعلام‌شده در مراحل قبلی را فراخوانی می‌کند و رشته را روی صفحه نمایش می‌دهد.

کاتلین

tv.text = stringFromJNI()

جاوا

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* اشاره‌گر به VM است، و jobject اشاره‌گر به شیء this ضمنی است که از سمت Java ارسال شده است.

خط زیر VM API (*env) را فراخوانی می‌کند و مقدار برگشتی را به آن ارسال می‌کند: یعنی رشته‌ای که تابع در سمت Java درخواست کرده بود.

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