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