[Java Native Interface] Berkenalan dengan Java Native Interface

Java (maksudnya bahasa pemrograman Java) termasuk salah satu bahasa pemrograman yang berparadigma berorientasi objek (OOP atau Object Oriented Programming). Bahasa Java ini termasuk bahasa yang cukup populer di kalangan open source. Ini karena Java bersifat multiplatform. Jadi sekali kita bikin kode di Java, bisa jalan di berbagai tempat yang punya Java Virtual Machine, misalnya Windows, Fedora, Ubuntu, ataupun Android. Oleh karena itu Java cukup populer.

Nah, apa jadinya kalo kita mau menggunakan fitur-fitur native (yang disediakan oleh sistem operasinya sendiri) tapi ga disediain oleh Java? Atau kita punya library yang ditulis dalam bahasa C atau C++ terus ingin make di Java? Sebenernya kita bisa bikin binding atau wrapper kode library tersebut ke Java. Caranya pake Java Native Interface (JNI). Tapi sebenernya dengan menggunakan JNI, kita harus hati-hati dan tetap menjaga agar kode Java kita tetap kompatibel di platform lain (agar tetap multiplatform). Karena, dengan menggunakan JNI berarti kita membuat kode Java yang tergantung platform. Jadi kapan mesti pake JNI? Pakailah JNI jika:

  • Anda terpaksa banget harus menggunakan kode low-level hardware yang tidak disediakan Java. Misalnya grafis untuk bikin game atau audio.
  • Anda mau bikin aplikasi yang multiplatform, tapi implementasinya beda-beda tiap platform. Misalnya kita mau bikin game di Windows dan di Android dengan kode java yang sama, tapi kan implementasi grafisnya beda antara di Windows dengan di Android (misalnya game engine LibGdx)
  • Anda emang pengen pake JNI apapun yang terjadi (Mungkin Anda bilang, “Brisik! Cepetan gua mau make JNI, kasih tau caranya!!!!”, waktu baca tulisan ini)
  • Anda emang iseng aja pengen nyobain JNI (Mungkin Anda bilang, “Cepetan woy, jangan ngomong aja….”)
Oke buat orang yang emang butuh ato emang iseng, mari kita lanjutin aja. Sebelum melanjutkan, periksa dulu apakah Anda memiliki software-software yang dibutuhkan untuk tutorial ini. Yaitu:
  • Java SDK atau JDK. Pastikan JDK sudah terinstall dengan benar. Caranya, buka command prompt, terus ketik: “echo %JAVA_HOME%” tanpa tanda kutip. Kalo keluar tulisan yang menjadi lokasi instalasi JDK Anda, berarti JDK sudah diinstall.
  • Compiler C/C++. Anda bisa pake compiler GNU atau MinGW atau VisualC++. Sebenarnya ini buat bikin library native-nya, jadi saya asumsikan Anda sudah tahu cara meng-compile dengan output library. Di sini ga akan dijelasin cara ngompile, lho, ntar tutorialnya kepanjangan. Tapi, saya sediakan cara meng-compile menggunakan VisualC++. Buat yang punya Microsoft Visual Studio pasti ada. Misalnya, saya pake Visual Studio 2010, jadi compiler visualC++ ada di: “C:\Program Files\Microsoft Visual Studio 10.0\VC\bin”, namanya “cl.exe”.
Hmm… setelah dibaca-baca lagi, ko kayaknya jadi tutorial yang tidak semua orang bisa mencoba, terutama gara-gara Visual Studio-nya sih. Tapi bikin library di Linux cukup mudah. Sayang pake Linux, kebanyakan orang pake Windows kayaknya. Yah, buat yang masih ingin mencoba, (kalo bingung tanya-tanya aja…) kita langsung lanjut aja. Baca aja file tutorial yang saya buat dibawah.
Buat yang merasa inetnya sapi. Kita langsung bahas disini aja deh…
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("HoiJNI");
 }

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" -I"%JAVA_HOME%\include\win32" -MD -LD "NamaKodeC" -Fe"NamaLibrari"

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, Voila! akan muncul tulisah “HoiJNI” di konsol (command prompt) Anda.

Bagaimana? Masih kurang puas? Saya sendiri baca-baca tentang JNI sebenarnya karena penasaran dengan JOGL (Java  OpenGL) dan LWJGL (Lightweight Java Game Library). Untuk referensi lebih lanjut, silahkan baca langsung manual JNI resminya di :

5 thoughts on “[Java Native Interface] Berkenalan dengan Java Native Interface

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s