Örnek: hello-jni

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 ".");