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이 동적 라이브러리를 호출한다. 네이티브 메소드에 대한 호출은 동적 라이브러리 내에서 구현된 호출에 의해 다루어진다.
'02.Development > Miscellaneous' 카테고리의 다른 글
[Miscellaneous] 아마존 앱스토어에 앱 등록하기 (0) | 2017.05.29 |
---|---|
[Miscellaneous] Visual Studio for Mac 출시 (0) | 2017.05.12 |
[Miscellaneous] 스마트폰 해상도별 대응을 위한 해상도 및 화면비율 표 (0) | 2017.01.19 |
[Miscellaneous] Manager, Handler, Controller (0) | 2016.07.11 |
[Miscellaneous] Mac OS에서 Unity 프로젝트 여러개 띄우기 (0) | 2016.02.04 |