Mengakses Librari Dinamis C menggunakan JAVA Melalui JNI

“Tutorial ini merupakan latihan penulis pada zaman kuliah dulu, mudah2an gak terlalu basi n kuno yaks😀 . Semoga bermanfaat🙂 “

Pada tutorial kali ini saya akan mengetengahkan bagaimana cara mengakses rutin-rutin/fungsi yang ditulis dalam bahasa C dari program JAVA dengan memanfaatkan tools dari Java Development Kit yaitu JNI (Java Native Interface) . Saya berasumsi bahwa para pembaca sekalian sudah cukup familiar dengan Java dan C😀 . Mengapa perlu mengakses rutin-rutin bahasa C atau mesin/Assembler ? Pengaksesan rutin-rutin dalam bahasa C (biasanya berbentuk dynamic library/dll) kadang diperlukan jika JAVA membutuhkan akses yang spesifik terhadap Sistem Operasi seperti pengaksesan hardware atau rutin kernel OS.

Pada contoh artikel ini saya menggunakan Sistem Operasi Windows XP . Tools yang digunakan yaitu untuk IDE C saya gunakan DevCpp, dan Java saya gunakan JDK 1.4 dan Editornya Gel. Contoh dalam program ini masih sangat sederhana. Saya akan membuat rutin dalam bahasa C untuk melakukan perhitungan aritmatika sederhana dan menampilkan message box. Kemudian rutin ini akan dikompile menjadi dll yang akan diakses oleh program JAVA sederhana yang sebelumnnya telah dijembatani oleh JNI.

Baiklah mari kita mulai😀 . Pertama buatlah class baru di Java yang diperlukan untuk memanggil library yang akan kita buat, misalnya contoh02.dll dan nama class yang akan kita buat adalah aksesdll.java . Kode lengkapnya seperti di bawah ini:

class contoh02 {
public native void displayHello();
public native int hitungMat(int x, int y);

static {
System.loadLibrary(“contoh02”);
}
}

Simpan source code diatas dengan nama contoh02.java (nama file sama dengan class publicnya) dalam sebuah folder cobaJNI02. Compile source code diatas seperti biasa <di command prompt bisa gunakan javac aksesdll.java> ( Pastikan path java installation telah di-set ke sistem Anda ). Jika anda menggunakan IDE yang telah mensetting binary Java secara otomatis seperti Gel, maka bisa Anda lakukan langkah berikut: Pilih Menu Build -> Compile File (CTRL+F9) .

Kemudian masuk ke Command Prompt dan masuk ke direktori kerja (tempat disimpan file class yang baru kita buat) dan ketikan perintah:
javah -jni contoh02 –> (tanpa ekstensi)

Output dari perintah diatas adalah sebuah file pustaka C dengan nama contoh02.h . File inilah yang akan digunakan untuk mengompile library C anda agar bisa diakses oleh program Java Anda. Kode yang ada pada file contoh02.h adalah sebagai berikut:

/* DO NOT EDIT THIS FILE – it is machine generated */
#include <jni.h>
/* Header for class contoh02 */

#ifndef _Included_contoh02
#define _Included_contoh02
#ifdef __cplusplus
extern “C” {
#endif
/*
* Class: contoh02
* Method: displayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_contoh02_displayHello
(JNIEnv *, jobject);

/*
* Class: contoh02
* Method: hitungMat
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_contoh02_hitungMat
(JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

Sekarang kita beralih ke IDE C yaitu DevCpp. New Project -> DLL -> <Pilih C sebagai bahasa yang digunakan> . Beri nama project “contoh02” dan simpan dalam folder contoh02_dll. Skenarionya kita akan bikin dua buah rutin sederhana yaitu rutin untuk menampilkan Message Box yang bernama Java_contoh02_displayHello(JNIEnv *, jobject) dan perhitungan Aritmatika sederhana JNIEXPORT void JNICALL Java_contoh02_hitungMat(JNIEnv *, jobject, jint, jint) <perhatikan bahwa nama dan parameter fungsi sama dengan nama yang telah dideklarasikan di contoh02.h yang telah dibuat dengan JNI > . Beri nama file yang berisi dua rutin tersebut dengan contoh02.c simpan ke folder contoh02_dll . Adapun list lengkap conoth02.c adalah sebagai berikut:

/* “contoh02.h” is the name of header from JNI*/
#include “contoh02.h”
#include <windows.h>
#include <stdio.h>

/* Rutin Menampilkan Message Box */
JNIEXPORT void JNICALL
Java_contoh02_displayHello (JNIEnv *Env, jobject obj) {
MessageBox (0, “Hello C from DLL!\n”, “Contoh02”, MB_ICONINFORMATION);
}

/* Rutin Menghitung Aritmatika sederhana */
JNIEXPORT jint JNICALL
Java_contoh02_hitungMat (JNIEnv *Env, jobject obj, jint opd1, jint opd2) {
int opdtemp1, opdtemp2;

opdtemp1 = opd1 + opd2;
opdtemp2 = opdtemp1 * opd1;

return opdtemp2;
}

/*System routine:: Generate by DevCpp*/
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}

Hapus isi kode pada main.c hasil generate DevCpp dan ganti dengan kode contoh02.c di atas. Buang dll.h dan copy-kan file contoh02.h di atas dalam folder contoh02_dll dan add ke project contoh02.
Compile project Anda, jika tidak ada kesalahan syntax maka dalam folder contoh02_dll akan dihasilkan file library dinamis terkompile contoh02.dll. Jika masih ada error dan kesalahan syntax, maka perbaiki kesalahan tersebut dan compile ulang. Saya sendiri telah mencoba tuk kode di atas dan berhasil tanpa masalah🙂 .

Kembalilah ke Editor JAVA anda. Sekarang kita telah memiliki library C yang akan diakses oleh program Java kita yaitu: contoh02.dll. File ini bisa kita masukan dalam satu folder dengan program Java yang mengakses libary tersebut (dalam hal ini folder cobaJNIo2). Setelah itu Buat sebuah program Java (misal aksesdll2.java) tuk mengakses rutin-rutin dalam dll tersebut dengan tahapan:

  1. Buat Object dari class contoh02
    contoh02 insContoh = new contoh02();
  2. Panggil method yang ada di class contoh02 yang secara otomatis akan memanggil rutin dll yang bersesuaian. Misal:
    insContoh.displayHello(); //menampilkan message box dan
    insContoh.hitungMat(int 3, int 5); //menghasilkan keluaran integer 24 hasil perhitungan aritmatika rutin C
  3. Contoh kode sederhana pemakaian kedua rutin di atas:
    public class aksesdll2 {
    public static void main(String[] args) {
    int hasil;
    contoh02 inscontoh = new contoh02();

    hasil = inscontoh.hitungMat(4,5);
    if (hasil > 30)
    inscontoh.displayHello();
    else
    System.out.println(“Hasil perhitungan: ” + hasil);
    }
    }

Contoh program diatas akan menghitung nilai yang di-passing dari method hitungMat(), kemudian hasilnya akan diliahat apakah lebih besar dari 30. Jika iya maka akan di tampilkan message box. Jika tidak akan ditampilkan printout ke consol hasil perhitungan hitungMat() . Silahkan ubah nilai parameter hitungMat() dan jalankan program yang telah Anda buat sendiri…

Nah sekian contoh sederhana cara mengakses pustaka C dari Java menggunakan JNI. Selamat berkreasi dengan pemrograman🙂 .
Ada pertanyaan atau ide yang lebih bagus🙂 ?

5 Responses to Mengakses Librari Dinamis C menggunakan JAVA Melalui JNI

  1. april says:

    ass….
    saya mau tanya bagai mana sih cara membuat6 program dengan menggunakan java.
    contohnya cara membuat program luas lingakaran

  2. aniz says:

    saya mau tanya, punya contoh codingan java yang bisa akses file dalam suatu direktori ga?
    terima kasih

  3. supriman says:

    @all:
    Ditunggu yah uploadannya.. Makllum masih sibuk nih… Belum sempet oprek2 data lama tentang source code yang kalian minta🙂

  4. adi newbie says:

    assalamu alaykum.

    mas, mau nanya nih. kalo JNI ini bisa dipake buat mengakses hardware ga? misalnya untuk mengakses webcam dan barrier gate. kalo bisa gimana langkah-langkahnya? kalo bisa sama tutorialnya.😀 Maklum masih newbie.

    ditunggu jawabannya. terimakasih.

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

%d bloggers like this: