Tutorial Hello JNI Tutorial ini akan menjelaskan dengan singkat cara menggunakan JNI, dan cara membuat kode Java yang menggunakan JNI. Kita akan membuat sebuah program Java yang menuliskan kata "Hoi JNI" di konsol, tapi menggunakan fungsi printf di C. Hehehe.... ga praktis banget kan? Tapi ya biarlah. Namanya juga coba-coba. 1. Oke, pilihlah sebuah folder yang akan jadi tempat untuk mengcompile. Untuk selanjutnya folder ini akan kita sebut root folder. Terus buat file, namanya "HoiJNI.java". Terus isinya sebagai berikut: class HoiJNI { static { System.loadLibrary("HoiJNI"); } public static native void fungsiNative(); public static void main(String[] args) { HoiJNI.fungsiNative(); } } 2. Jadi intinya saat bikin JNI itu begini. Dalam kelas wrapper yang bersangkutan (dalam contoh ini kelas HoiJNI) mesti ada blok static, isinya: static { System.loadLibrary("NamaLibrari"); }
3. Perhatikan, “NamaLibrari” yang di load, tergantung dari nama librari yang digunakan dan posisinya relatif terhadap kode java-nya. Jadi misalkan nama librarinya: “HoiJNI.dll”, berarti “NamaLibrari” kita ganti jadi “HoiJNI” (tanpa ekstensi .dll). Jika posisinya relatif terhadap kode java-nya, misalkan di folder librari\HoiJNI.dll (untuk Windows) atau librari/HoiJNI.so (di Linux), berarti “NamaLibrari” kita ganti jadi “librari/HoiJNI”. Mudah bukan?
4. Hal penting yang lain adalah mendeklarasikan fungsi native tersebut di kode java-nya, tapi tidak perlu di implementasi (ya iyalah, kan diimplementasinya pake kode C…). Ini ditulis pake baris berikut: public static native void fungsiNative();
5. Perhatikan, ada kata kunci “native” sebelum tipe keluaran void. Artinya, kode yang ditulis itu kode native, dan diload dari librari. Kata kunci static berfungsi seperti biasa. Oiya, hebatnya JNI, kita bisa mengoverride fungsi native dengan fungsi java, fungsi java dengan native, ataupun native dengan native lagi (kalo java dengan java udah jelas lah, ya…). 6. Kemudian, fungsi tersebut bisa digunakan seperti fungsi Java biasa. Contohnya seperti di baris main berikut (ini hanya kode main biasa, tidak ada yang aneh-aneh: public static void main(String[] args) { HoiJNI.fungsiNative(); }
7. Langkah berikutnya tentu saja meng-compile kode java tersebut. Misalnya kita kompilasi menggunakan command prompt Windows, maka ketikkan perintah berikut (dari root folder): > javac “NamaKelas” Seperti biasa, “NamaKelas” yang dimaksud itu lokasi kelas yang ingin dikompilasi (relatif terhadap root folder). Untuk kelas kita, tentunya “NamaKelas” diganti jadi HoiJNI.java. Jika lokasi kelasnya di “src\HoiJNI.java” (Windows) atau “src/HoiJNI.java” (Linux”) maka tulis saja lokasinya. Jadi kalau di Windows di tulis “src\HoiJNI.java”. Oya, jika lokasi file-nya seperti ini, itu artinya kelas HoiJNI ada di package “src”. Tentunya untuk tutorial ini, “NamaKelas” diganti jadi “HoiJNI.java”. 8. Nah, kita telah meng-compile kode java-nya. Sekarang saatnya bikin kode native-nya. Pertama, generate dulu header file kode native yang akan ditulis. Ketikkan perintah berikut di prompt: > javah “NamaPackageKelas” Hampir mirip dengan nomor tujuh, hanya saja sekarang yang digunakan adalah “NamaPackageKelas”. Kebetulan di tutorial ini, kelas kita ga masuk package mana-mana, jadi ganti “NamaPackageKelas” menjadi “HoiJNI” (tanpa ekstensi .class). Seandainya kelas HoiJNI ini ada di package src, berarti ganti “NamaPackageKelas” menjadi “src.HoiJNI”. Lalu
apa yang terjadi? Perintah ini hanya berfungsi untuk men-generate header file kode native yang akan ditulis. Jika dilihat di root folder, akan ada file baru dengan format nama: “NamaKelas.h” (untuk tutorial ini berarti : “HoiJNI.h”). Buka aja file ini, dan liat-liat sebentar. 9. Isi dari file HoiJNI.h ada di bawah. Oya, karena ini di-generate oleh javah, jadi file ini jangan diubah. /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HoiJNI */ #ifndef _Included_HoiJNI #define _Included_HoiJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HoiJNI * Method: fungsiNative * Signature: ()V */ JNIEXPORT void JNICALL Java_HoiJNI_fungsiNative (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif Apaan tuh maksudnya? Hoho… ga penting…. Kita abaikan juga tidak apa-apa, yang penting yang ini: JNIEXPORT void JNICALL Java_HoiJNI_fungsiNative (JNIEnv *, jclass); Ini adalah prototype fungsi yang akan kita implementasi. Simbol-simbol dan makro itu memang memusingkan, tapi ga usah dipikirin aja lah ya…. Saya bingung juga ngejelasinnya. Intinya, kita buat kode C (atau C++ yang berupa fungsi bernama “Java_HoiJNI_fungsiNative” dengan parameter “JNIEnv” dan “jclass” 10. Buat implementasi kode C/C++ dari file HoiJNI.h tadi. Buat tutorial ini, letakkan di root folder, dan beri nama “HoiJNI.c”. Kemudian isi file dengan kode sebagai berikut: #include "HoiJNI.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HoiJNI_fungsiNative (JNIEnv * env, jclass cls)
{ }
printf("Hoi JNI...");
Isi kode-nya emang ga aneh-aneh. Tapi perhatikan: JNIEXPORT void JNICALL Java_HoiJNI_fungsiNative (JNIEnv * env, jclass cls) Baris ini adalah penjelasan fungsi dari prototype: JNIEXPORT void JNICALL Java_HoiJNI_fungsiNative (JNIEnv *, jclass); Perhatikan ada variabel “env” dan “cls” (ini boleh Anda ganti dengan yang lain). Ini ga ada bedanya dengan implementasi prototype fungsi biasa. 11. Langkah selanjutnya yang sulit dijelaskan adalah, meng-compile kode C/C++ tersebut menjadi librari. Ya mestinya sih ini udah ga perlu dijelasin lagi sih. Tapi buat jaga-jaga, saya jelasin contohnya yang menggunakan Visual C++ compiler. Buat yang punya Visual Studio, coba cari di folder VisualC++ milik Visual Studio-nya. Contohnya saya dengan Microsoft Visual Studio 2010, lokasinya di: “C:\Program Files\Microsoft Visual Studio 10.0\VC”. Oke, mas, gimana kalo saya ga punya MVS 2010, tapi punya yang 9? Ya udah ganti aja angka 10.0 jadi 9.0. Gimana kalo ga ada? Ya pokoknya cari sendiri folder VC. Ini tentunya kalo Anda menginstall Visual Studio. Nah, di folder VC tersebut ada file “vcvarsall.bat”, jalankan file tersebut, ini maksudnya biar Anda bisa menggunakan compiler VisualC++. Anda juga dapat memasukkan folder VC ini ke Path di Environment Variables. 12. Setelah menjalankan “vcvarsall.bat”, kita akan compile kode C tadi. Pindah ke root folder dan ketik perintah berikut (Anda harus sudah menginstall JDK) untuk meng-compile kode C tersebut. > cl -I"%JAVA_HOME%\include" "NamaKodeC" -Fe"NamaLibrari"
-I"%JAVA_HOME%\include\win32"
-MD
-LD
Ganti “NamaKodeC” dengan nama file kode C yang Anda implementasi, dalam tutorial ini berarti “HoiJNI.c”. Sedangkan “NamaLibrari” diganti dengan nama librari yang Anda inginkan, yang sudah disepakati sebelumnya, dalam tutorial ini berarti “HoiJNI.dll”. Jika kompilasi gagal, coba cek: > echo “%JAVA_HOME%” Apakah ada hasilnya atau tidak, misalnya kalau di saya hasilnya: “C:\Program Files\Java\jdk1.6.0_13” ini adalah lokasi root folder JDK yang Anda install.
13. Hore… Selamat, jika di folder ada tiba-tiba ada banyak file seperti “HoiJNI.dll”, “HoiJNI.lib”, dan lain-lain, artinya Anda sudah berhasil meng-compile librari tersebut. Jika belum, ulangi langkah sebelumnya dengan teliti. Kalo masih bermasalah, tanya aja. 14. Selanjutnya, jalankan program Java anda dengan mengetikkan perintah berikut: Java “NamaPackageKelas” Ganti “NamaPackageKelas” dengan nama package kelas yang ingin di jalankan. Dalam contoh ini, berarti “NamaPackageKelas” diganti “HoiJNI”. Jika nama package-nya di “src.HoiJNI” ganti dengan nama tersebut. 15. Jika sudah berhasil, akan muncul tulisah “HoiJNI” di konsol (command prompt) Anda.
Referensi http://java.sun.com/docs/books/jni/download/jni.pdf