JNI Tutorial (Java Native Interface)

Willy KR
Binar Academy
Published in
4 min readNov 27, 2018

~ Perkenalan

Java Native Interface (JNI) merupakan framework yang mengizinkan kode Java untuk memanggil atau dipanggil native language seperti C#, C++, dan asembly. JNI dibutuhkan untuk lebih mengoptimalkan memory management dan performa dalam Java.

JNI tidaklah mudah, karena harus menguasai dua bahasa sekaligus yaitu Java dan — setidaknya — satu native language. Sampai di sini, saya anggap Anda sudah familiar dengan Java dan C/C++.

Pastikan Anda memiliki semua yang dibutuhkan dalam tutorial ini:

1. JDK dan JRE (Download di sini kalau belum Install)

2. MinGW (Download di sini kalau belum install)

FYI: versi yang saya pakai versi 64-bit

~ Memulai JNI

Langkah 1: Buatlah Folder D:\JNI\HELLO JNI

Langkah 2: Buatlah file HelloJNI.java dalam folder \HELLO JNI

Langkah 3: Tulislah Java class dalam file HelloJNI.java

public class HelloJNI {
static {
System.loadLibrary("hello"); // meng-load native library
//saat runtime
// yaitu hello.dll (Windows)
}

// Mendeklarasikan sebuah method native sayHello()
private native void sayHello();

// Test Driver
public static void main(String[] args) {
new HelloJNI().sayHello(); // memanggil native method yang
//sudah di
//deklarasikan sebelumnya
}
}

Static initialer dibutuhkan untuk meng-load library native yang berisi native method, menggunakanSystem.loadLibraty(). Library yang dimaksud di sini nantinya akan terpetakan menjadi hello.dll (Windows).

Kemudian, deklarasi method sayHello() di sini sebagai native method, perintah native di sini menandakan bahwa method tersebut diimplementasi dalam bahasa lain. FYI, method ini juga dideklarasikan dalam library hello.dll. Method sayHello() tidak memiliki isi, nantinya isinya akan ditulis di file yang berbeda dalam bahasa lain yang akan dijelaskan lebih lanjut di langkah selanjutnya.

Method main, membuat instance baru kelas helloJNI dan memanggil native method sayHello().

Langkah 4: Compile HelloJNI.java untuk membuat file baru HelloJNI.class

Buka command prompt, kemudian arahkan pada Folder D:\JNI\HELLO JNI

Atau cara yang paling mudah:

Tahan shift, kemudian klik kanan folder HELLO JNI, pilih open command windows here

Jalankan perintah berikut:

> javac HelloJNI.java

Langkah 5: Buat file header C/C++ HelloJNI.h

Masih di command prompt, jalankan perintah berikut:

> javah HelloJNI

Output dari perintah di atas akan menghasilkan file HelloJNI.h yang berisi code berikut:

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

#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Header di atas mendeklarasikan method C yaitu Java_HelloJNI_sayHello sebagai berikut:

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *, jobject);

Penamaan method C dalam java adalah Java_{nama package dan class}_{nama method}(arguments). tanda titik (.) dalam nama package akan diganti dengan garis bawah( _ ).

Argumen JNIEnv* merupakan reference dari JNI_Enviroment yang di gunakan untuk mengakses semua fungsi JNI dan Argumen jobject merupakan objek dari objek Java sekarang yang memanggil Code native( this ) Dalam kasus ini, object Java yang dimaksud adalah object dari class HelloJNI di HelloJNI.java.

Untuk saat ini, kita tidak menggunakan argumen lain selain 2 di atas untuk menampilkan “Hello world,” nantinya dibutuhkan argumen lain di tutorial selanjutnya.

Extern “C” hanya akan dikenali oleh compiler C++ yang berfungsi untuk memberi tahu compiler C++ bahwa fungsi tersebut di-compile mengunakan protokol penamaan fungsi dalam C. C dan C++ mempunya protokol penamaan fungsi yang berbeda.

Langkah 6: Buatlah File baru HelloJNI.c dalam Folder \HELLO JNI

Langkah 7: Tulislah code berikut di HelloJNI.c:

#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"

// Implementasi method native sayHello() dari kelas HelloJNI
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}

Langkah 8: Compile Program

Kembali ke command prompt, lalu gunakan perintah di bawah. Ingat, periksa apakah JAVA_HOME sudah di set atau belum.

> echo %JAVA_HOME%

Jika output tidak menampilkan lokasi penyimpanan JDK, lakukan perintah berikut:

> set JAVA_HOME=C:\Program File\Java\jdk1.8.0_25

Ubahlah path sesuai di mana Anda menginstal JDK Anda. Kemudian, lakukan perintah berikut di command prompt:

> gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" 
-I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.c

-Wl; adalah opsi untuk pass linker, — add-stfcall-alias digunakan untuk menhindari linkerror.

-I; digunakan untuk menunjukan direktori header.

-shared; untuk membuat shared library secara otomatis.

-o; untuk memberi nama file output.

Setelah perintah di atas, nantinya akan meng-generate file hello.dll di folder HELLO JNI. Jika sudah begitu, itu tandanya program Anda sudah tercompile

Langkah 9: Run Program

Selanjutnya jalankan program Java menggunakan perintah berikut di command prompt:

> java HelloJNI

Voila! Anda berhasil membuat JNI pertama Anda!

Program di atas hanya akan menampilkan kata “Hello World!” di consol menggunakan JNI tapi cukup menjelaskan dasar awal dalam penerapan JNI.

Poin-poin yang penting dalam menerapkan JNI adalah:

  • Deklarasi native library dan native method
  • Mengonversi reference dan tipe data menjadi Tipe data Primitif JNI (ada di tutorial selanjutnya)

Terima kasih sudah membaca tutorial ini. Semoga bisa membantu kesulitan yang Anda temui!

--

--