Contoh: hello-jni

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

Android.mk

Dua baris berikut menunjukkan nama file sumber native, beserta nama library bersama yang akan dibuat. Nama lengkap 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 informasi selengkapnya tentang fungsi file Android.mk dan cara menggunakannya, lihat Android.mk.

Application.mk

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

APP_ABI := all

Untuk informasi selengkapnya tentang file Application.mk dan cara menggunakannya, 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.

Kode sumber terdiri dari tiga baris khusus 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 sistem 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 dalam 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 ".");