JNI (Java Native Interface) 란?






기본 개념

- JNI는 Java에서 native영역(C/C++)으로 들어가 호출 또는 native(C/C++)에서 Java로 호출하는 interface.

- Java와 Java 이외의 언어로 만들어진 어플리케이션이나 라이브러리가 상호작용할 수 있도록 연결시켜주는 인터페이스.

- JVM(Java Virtual Machine)이 네이티브 메소드(Native Method)를 적재(locate)하고 수행(invoke)할 수 있도록 함.

- JNI가 JVM 내에 포함됨으로써 JVM이 호스트 운영체제상의 입출력, 그래픽스, 네트워킹, 그리고 스레드와 같은 기능들을 작동하기 위한 

로컬시스템호출(local system calls)을 수행할 수 있도록 함.


* 쉽게 말해, JNI는 Java와 다른 언어를 연동하는 솔루션이다. (C/C++로 작성한 API를 Java에서 호출하게 해줌)

* 네이티브 메소드(Native Method)란 자바에서 특화된 메소드로써, 다른 언어로 구현되어 있으며 native 라는지시자(예약어)를 가지는 메소드를 말함.

* NDK(Native Development Kit)는 Java의 JNI 기술을 이용하여 안드로이드 App(Java)과 안드로이드 Library(C/C++) 계층을 연결해주는 역할을 함.


참조 : http://viiiin.tistory.com/11


네이티브 메소드를 이용하는 몇 가지 공통적인 이유

- 이미 다른 언어(c/c++)로 상당히 크고 중요한 코드를 작성했고, 자바로 동일한 코드를 재작성하기를 원치 않으며, 단지 기존 코드를 재사용하고 싶을 때 JNI를 사용한다.

- 시스템 디바이스에 접근할 필요가 있거나 자바의 성능을 넘어선 플랫폼 특정적인 작업을 수행할 경우에 JNI를 사용한다.

- 자바로 구현하기엔 어플리케이션이 매우 느릴 수 있으며, C++에서 time-critical 코드를 구현함으로써 성능의 향상을 가져올 수 있을 경우에 JNI를 사용한다.



JNI의 부정적인 측면

- 이식성(Portability)을 잃게 된다. 많은 자바 라이브러리가 네이티브 메소드를 사용하고 있는데, 새로 추가된 네이티브 메소드가 모든 플랫폼에서 호출 가능한 동일한 C++코드를 가진다면, 그 코드는 자바에서 가장 먼저 구현되어질 수 있다.

- 안정성(safety)을 잃게 된다. 네이티브 메소드는 자바 메소드처럼 동일한 보호를 보장받지 못한다. 일단 C++코드에 들어가게 되면, 자바에서의 모든 것이 백지화되고 메모리 추적, 포인터의 사용, 그리고 배열 바운딩에 의한 C++ 버그들이 발생할 수 있다.

- 네이티브 메소드의 구현은 .dll 및 .so 와 같은 동적 라이브러리들 내에서 이루어진다. 네이티브 메소드를 사용하는 자바 코드는 반드시 동적 라이브러리들을 호출하는데, 이는 자바 시큐리티 매니저에 반대되는 연산이다.

- 타이핑 오류와 같은 컴파일 오류에 종종 직면하게 되므로 코드 자체가 방해물이 될 수 있다. 



JNI를 사용하는 기본 절차

- native 예약어를 표시함으로써 자바로 구현되지 않는 특정 메소드들을 가지는 자바 클래스를 선언한다.

- JNI 프로토콜을 사용하여 네이티브 메소드를 구현하는 C/C++ 함수를 작성한다.

- C/C++ 함수를 컴파일하고 동적 라이브러리를 삽입한다.

- JVM이 동적 라이브러리를 호출한다. 네이티브 메소드에 대한 호출은 동적 라이브러리 내에서 구현된 호출에 의해 다루어진다.



+ Recent posts