Örnek: hello-jni

Bu örnek, NDK ile oluşturulmuş minimal bir C/C++ uygulaması olan hello-jni'de size yol gösterir. Bu örnek, ndk-samples deposunun android-mk şubesi içindeki hello-jni dizinindedir.

Android.mk

Aşağıdaki iki satırda, yerel kaynak dosyanın adı ve derlenecek paylaşılan kitaplığın adı sağlanır. Derleme sistemi lib önekini ve .so uzantısını ekledikten sonra, derleme kitaplığının tam adı libhello-jni.so olur.

LOCAL_SRC_FILES := hello-jni.c
LOCAL_MODULE    := hello-jni

Android.mk dosyasının işlevi ve nasıl kullanılacağı hakkında daha fazla bilgi için Android.mk dosyasını inceleyin.

Application.mk

Bu satır, derleme sistemine derlemenin hangi CPU ve mimariye göre yapılacağını söyler. Bu örnekte, derleme sistemi desteklenen tüm mimariler için derleme oluşturur.

APP_ABI := all

Application.mk dosyası ve dosyanın nasıl kullanılacağı hakkında daha fazla bilgi için Application.mk adresine bakın.

Java tarafında uygulama

helloJNI.java dosyası hellojni/src/com/example/hellojni/ konumundadır. Yerel taraftan bir dize almak için bir işlev çağırır ve ardından bu dizeyi ekranda gösterir.

Kaynak kodu, NDK kullanıcısının özellikle ilgilendiği üç satır içerir. 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ılırken .so dosyasını yükler.

Kotlin

System.loadLibrary("hello-jni")

Java

System.loadLibrary("hello-jni");

Bu yöntem beyanında yer alan native anahtar kelimesi, sanal makineye işlevin paylaşılan kitaplıkta (yani yerel tarafta) olduğunu 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ğırır ve 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 bir işlev içerir.) İşlev bildirimi aşağıdaki gibidir:

JNIEXPORT jstring JNICALL
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )

Bu beyan, Java kaynak kodunda tanımlanan 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, Java dizesine işaret eden bir işaretçidir.

jstring'den sonra işlev adı gelir. Bu ad, Java işlev adından ve bu işlevi içeren dosyanın yolundan türetilir. Aşağıdaki kurallara göre oluşturun:

  • Başına Java_ ekleyin.
  • Üst düzey kaynak dizine göre dosya yolunu açıklayın.
  • Açılı tırnak yerine alt çizgi kullanın.
  • .java dosya uzantısını çıkarın.
  • Son alt çizgiden sonra işlev adını ekleyin.

Bu kurallara uygun olarak bu örnekte 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 makinenin işaretçisidir ve jobject, Java tarafında iletilen örtülü this nesnesinin işaretçisidir.

Aşağıdaki satır, VM API'yi (*env) çağırır ve ona bir dönüş değeri (Java tarafındaki işlevin istediği dize) iletir.

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