This is a simple JNI example on Windows.
Tested with: MingW, Windows XP, Java 6
Create a java file Hello.java
public class Hello { static { System.loadLibrary("hello"); } public native void sayHello(); public static void main(String args[]) { Hello hello=new Hello(); hello.sayHello(); } }
Compile the file and get Hello.class file
Execute the command. This will find native methods in the class and create appropriate declaration in C language in Header file. This will generate Hello.h file
javah -jni Hello
Hello.h file looks like this
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class Hello */ #ifndef _Included_Hello #define _Included_Hello #ifdef __cplusplus extern "C" { #endif /* * Class: Hello * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_Hello_sayHello(JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
Now implement the header file's declared method. For that we have to create a C file.
Hello.c
#include <jni.h> #include <stdio.h> #include <conio.h> #include "Hello.h" JNIEXPORT void JNICALL Java_Hello_sayHello(JNIEnv * env, jobject jobj) { printf("Hello World"); }
We have implemented method in C which is declared as native in Java.
We will compile the C file and generate dll which will be used by Hello.class, see the line System.loadLibrary("hello");
Running the command will generate hello.dll file
gcc -Wl,--add-stdcall-alias -I <JAVA_HOME>/include -I <JAVA_HOME>/include/win32 Hello.c -shared -o hello.dll
"-Wl" is an option with which we can pass linker options to gcc separating by commas.
"--add-stdcall-alias" is a linker option.
The option prevents linker error like: "java.lang.UnsatisfiedLinkError: Hello.sayHello()V".
"-I" will search for included files in specified directories.
"-shared" will generate shared library.
"-o" specifies name of output file.
Now simply run the class file.
java Hello
You might get "Hello World" as output.