Overview

JNI (Java Native Interface) is used to call C/C++ libraries by Java code.

The C/C++ library is known as SO library in Linux and is known as DLL in windows.

Environment Requirment
  • Linux
  • GCC
  • G++
  • Java 1.8+

If you have not prepared for the environment, you can install them by commands below:

yum -y install gcc
yum -y install gcc+ gcc-c++
yum -y install java-1.8.0-openjdk-devel.x86_64
Let’s Start

First, I prepared a Java file called JniDemo.java and its content is below:

[root@snail jni_helloworld]# cat JniDemo.java 
public class JniDemo{

  public static void main(String[] args){
    System.out.println("Hello, I'm Java!");
    new JniDemo().hello();
  }

  public native void hello(); // Native key word tell Jvm that the method is from SO libraries instead of Java.

  static{
    System.loadLibrary("cpp_lib_demo"); // Loading the C library.
  }
}

Second, use javah tool to generate JniDemo.h file.

[root@snail jni_helloworld]# javah JniDemo
[root@snail jni_helloworld]# ls
JniDemo.h  JniDemo.java

Third, It’s time to code our cpp file.

[root@snail jni_helloworld]# cat cpp_demo.cpp 
#include "JniDemo.h" // Import generated header file.
#include "jni.h"
JNIEXPORT void JNICALL Java_JniDemo_hello
  (JNIEnv * env, jobject jb){
      printf("%s","Hello, I'm Cpp.\n");
}

To compile our cpp file, we need to make our Makefile file.

[root@ jni_helloworld]# cat Makefile 
libcpp_lib_demo.so : cpp_demo.cpp
	g++ -o $@ $+ -fPIC -shared -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/include/linux

.PHONY : clean
clean :
	rm libcpp_lib_demo.so

Note: You need to modify the java path to your java path.

And now, let’s us to compile our Java file to class and compile our cpp file to SO library.

 [root@snail jni_helloworld]# javac JniDemo.java 
 [root@snail jni_helloworld]# make
g++ -o libcpp_lib_demo.so cpp_demo.cpp -fPIC -shared -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/include -I/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.292.b10-1.el7_9.x86_64/include/linux
 [root@snail jni_helloworld]# ls
cpp_demo.cpp  JniDemo.class  JniDemo.h  JniDemo.java  libcpp_lib_demo.so  Makefile

Now, we can run our JNI program.

[root@snail jni_helloworld]# java -Djava.library.path='.' JniDemo
Hello, I'm Java!
Hello, I'm Cpp.