Contoh: hello-jni

Contoh ini membantu Anda memahami hello-jni, aplikasi C/C++ minimal yang dibuat dengan NDK. Contoh ini ada dalam direktori hello-jni pada repositori contoh ndk, di cabang android-mk.

Android.mk

Dua baris berikut menunjukkan nama file sumber native, beserta nama library bersama yang akan dibuat. Nama lengkap dari library yang dibuat adalah libhello-jni.so, setelah sistem build menambahkan awalan lib dan ekstensi .so.

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

Untuk mengetahui informasi selengkapnya tentang fungsi file Android.mk dan penggunaannya, lihat Android.mk.

Application.mk

Baris ini memberitahukan CPU dan arsitektur yang menjadi dasar pembuatan build kepada sistem build. Dalam contoh ini, sistem build membuat build untuk semua arsitektur yang didukung.

APP_ABI := all

Untuk mengetahui informasi selengkapnya tentang file Application.mk dan penggunaannya, lihat Application.mk.

Implementasi sistem Java

File helloJNI.java terletak di hellojni/src/com/example/hellojni/. File ini memanggil fungsi untuk mengambil string dari sistem native, lalu menampilkannya di layar.

Sumber kodenya terdiri dari tiga baris yang diperlukan oleh pengguna NDK. Baris tersebut ditampilkan di sini sesuai urutan penggunaannya, bukan berdasarkan urutan baris.

Panggilan fungsi ini akan memuat file .so saat aplikasi dimulai.

Kotlin

System.loadLibrary("hello-jni")

Java

System.loadLibrary("hello-jni");

Kata kunci native dalam deklarasi metode ini memberi tahu mesin virtual (VM) bahwa fungsi tersebut berada di library bersama (diimplementasikan di sistem native).

Kotlin

external fun stringFromJNI(): String

Java

public native String stringFromJNI();

Framework Android memanggil fungsi yang dimuat dan dideklarasikan pada langkah sebelumnya, lalu menampilkan string tersebut di layar.

Kotlin

tv.text = stringFromJNI()

Java

tv.setText( stringFromJNI() );

Implementasi sisi C

File hello-jni.c terletak di hello-jni/jni/. File tersebut berisi fungsi yang menampilkan string yang diminta oleh sistem Java). Deklarasi fungsinya adalah sebagai berikut:

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

Deklarasi ini berhubungan dengan fungsi native yang dideklarasikan pada kode sumber Java. Jenis yang ditampilkan, jstring, adalah jenis data yang ditetapkan dalam Spesifikasi Antarmuka Native Java. Data ini sebenarnya bukan string, melainkan pointer ke string Java.

Setelah jstring muncullah nama fungsi, yang didasarkan pada nama fungsi Java dan jalur ke file yang memuatnya. Buatlah menurut aturan berikut:

  • Awali dengan Java_.
  • Deskripsikan jalur file yang terkait dengan direktori sumber level teratas.
  • Gunakan garis bawah sebagai pengganti garis miring ke depan.
  • Hapus ekstensi file .java.
  • Setelah garis bawah terakhir, tambahkan nama fungsi.

Dengan mengikuti aturan ini, contoh ini menggunakan nama fungsi Java_com_example_hellojni_HelloJni_stringFromJNI. Nama ini merujuk ke sebuah fungsi Java yang disebut stringFromJNI(), yang berada di hellojni/src/com/example/hellojni/HelloJni.java.

JNIEnv* adalah pointer ke VM, dan jobject adalah pointer ke objek this implisit yang diteruskan dari sistem Java.

Baris berikut memanggil VM API (*env) dan meneruskan nilai yang ditampilkan, yaitu string yang diminta oleh fungsi pada sistem Java.

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