Application이 완전히 java로 쓰여질 수 있지만, java 하나로는 application 요구사항을 충족시키지 못하는 경우가 있다. 이렇게 application이 java만으로 작성되지 못하는 경우, JNI을 사용하여 Java native methods를 작성한다.
VM을 제공하는 곳에서 각각 다른 native method interfaces를 제공했고, 개발자들은 platform에 따라 다양한 버전의 native method library를 만들어야 했다. 이에 통일된 표준 interface가 필요하게 되었다.
Java Virtual Machine(JVM)에서 돌아가는 java code가, C, C++ 등과 같은 다른 프로그래밍 언어로 쓰여있는 library와 application 간에 상호운용할 수 있도록 해준다.
JNI의 가장 중요한 장점은, 기본 JVM의 구현에 제한을 가하지 않는다는 것이다.
따라서 JVM에서는 다른 부분에 영향을 주지 않고 JNI에 대한 support를 추가할 수 있다.
Pros
VM 제공자들은 더 많은 native code를 제공할 수 있다.
Tool 개발자들은 여러 개의 native method interfaces를 관리할 필요가 없다.
Application 개발자들은 native code를 하나의 버전만 작성하면 되고, 그 버전은 다양한 VM에서 동작한다.
동작원리
JNI은 JVM 안에 들어있다.
Java bytecode를 JVM이 읽을 때, native call을 수행하는 java code가 있으면 JNI을 통해서 해당 java code와 native library에서 일치하는 native function을 mapping 한다.
JNI이 중간에서 동작함으로써, Java 모듈과 C/C++ 모듈이 상호 작용하며 서로 호출할 수 있다.