Bu örnek, NDK ile geliştirilmiş minimal C/C++ uygulaması olan hello-jni konusunda size yol gösterir. Bu örnek, android-mk dalı içindeki ndk-samples deposunun hello-jni dizininde yer almaktadır.
Android.mk
Aşağıdaki iki satırda yerel kaynak dosyanın adı, derlenecek paylaşılan kitaplığın adıyla birlikte belirtilir. Derleme sistemi lib
önekini ve .so
uzantısını ekledikten sonra derleme kitaplığın tam adı libhello-jni.so
olur.
LOCAL_SRC_FILES := hello-jni.c LOCAL_MODULE := hello-jni
Android.mk
dosyasının ne yaptığı ve bu dosyanın nasıl kullanılacağı hakkında daha fazla bilgiyi Android.mk adresinde bulabilirsiniz.
Başvuru.mk
Bu satır, derleme sistemine temel olarak derleme için kullanılacak CPU'yu ve mimariyi bildirir. Bu örnekte, derleme sistemi desteklenen tüm mimariler için derlemektedir.
APP_ABI := all
Application.mk
dosyası ve bu dosyanın nasıl kullanılacağı hakkında daha fazla bilgi için Application.mk adresine bakın.
Java Tarafı Uygulama
helloJNI.java
dosyası, hellojni/src/com/example/hellojni/
konumunda bulunuyor. Yerel taraftan bir dize almak için bir işlev çağırır ve ardından bu dizeyi ekranda görüntüler.
Kaynak kodu NDK kullanıcısının ilgisini çeken üç satır içeriyor. Bunlar burada satır sırasına göre değil, kullanıldıkları sıraya göre sunulur.
Bu işlev çağrısı, uygulama başlatıldığında .so
dosyasını yükler.
Kotlin
System.loadLibrary("hello-jni")
Java
System.loadLibrary("hello-jni");
Bu yöntem bildirimindeki native
anahtar kelimesi, sanal makineye işlevin paylaşılan kitaplıkta olduğunu (yani yerel tarafta uygulandığını) bildirir.
Kotlin
external fun stringFromJNI(): String
Java
public native String stringFromJNI();
Android çerçevesi, önceki adımlarda yüklenen ve tanımlanan işlevi çağırarak dizeyi ekranda gösterir.
Kotlin
tv.text = stringFromJNI()
Java
tv.setText( stringFromJNI() );
C Tarafı Uygulama
hello-jni.c
dosyası, hello-jni/jni/
konumunda bulunuyor. Java tarafının istediği bir dizeyi döndüren işlev içerir). İşlev açıklaması aşağıdaki gibidir:
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
Bu bildirim, Java kaynak kodunda belirtilen yerel işleve karşılık gelir. Dönüş türü (jstring
), Java Yerel Arayüz Spesifikasyonu'nda tanımlanan bir veri türüdür. Aslında bir dize değil, bir Java
dizesi için işaretçidir.
jstring
ifadesinden sonra, Java işlev adını ve onu içeren dosyanın yolunu temel alan işlev adı gelir. Aşağıdaki kurallara göre
oluşturun:
- Başına
Java_
dizesini ekle. - Dosya yolunu üst düzey kaynak dizine göre açıklayın.
- Eğik çizgiler yerine alt çizgi kullanın.
.java
dosya uzantısını atlayın.- Son alt çizgiden sonra işlev adını ekleyin.
Bu örnekte, bu kurallara uygun olarak Java_com_example_hellojni_HelloJni_stringFromJNI
işlev adı kullanılmıştır. Bu ad, hellojni/src/com/example/hellojni/HelloJni.java
içinde bulunan stringFromJNI()
adlı bir Java işlevini ifade eder.
JNIEnv*
, sanal makineyi işaret eden, jobject
ise Java tarafından iletilen örtülü this
nesnesine işaret eden bir işaretçidir.
Aşağıdaki satır (*env)
VM API'sini çağırır ve bu API'ye bir dönüş değeri iletir: yani Java tarafındaki işlevin istediği dize.
return (*env)->NewStringUTF(env, "Hello from JNI ! Compiled with ABI " ABI ".");