نمونه: 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();

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

کاتلین

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 )

این اعلان با تابع بومی اعلام شده در کد منبع جاوا مطابقت دارد. نوع برگشتی، 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 ".");
،

این نمونه شما را از طریق 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();

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

کاتلین

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 )

این اعلان با تابع بومی اعلام شده در کد منبع جاوا مطابقت دارد. نوع برگشتی، 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 ".");