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