JNI(Java Native Interface)는 자바 프로그램이 네이티브 메서드를 호출하는 기술을 말한다.
네이티브 메서드의 주요 쓰임
첫 번째, 레지스트리나 파일 락과 같은 플랫폼 특화 기능을 사용할 수 있다.
자바 버전이 올라가면서 필요성이 줄어들 고 있다. 특히 Java 9에서는 Process API를 추가하여 OS 프로세스에도 접근할 수 있다. 하지만 대체할만한 자바 라이브러리가 없다면 네이티브 라이브러리를 사용해야 한다.
두 번째, 네이티브 코드로 작성된 기존 라이브러리를 사용한다.
세 번째, 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.
그런데 대부분 성능 개선 목적으로 네이티브 메서드의 사용을 권장하지 않는다.
예를 들어 java.math가 처음 추가된 JDK 1.1 시절 BigInteger는 C언어로 작성된 라이브러리에 의지했지만
JDK 1.3 버전부터 순수 자바로 구현, 세심한 튜닝을 통해 원래의 네이티브 구현보다도 더 빨라졌다.
네이티브 메서드의 단점
안전하지 않다. 네이티브 메서드를 사용하는 애플리케이션도 메모리 훼손 오류로부터 안전하지 않다. #50
자바보다 플랫폼 종속성이 높아 이식성도 낮고 디버깅도 어렵다.
주의하지 않으면 오히려 속도가 더 느릴 수 있다.
가비지 컬렉터가 네이티브 메모리는 자동 회수하지 못한다. 심지어 추적도 안된다.
자바 코드와 네이티브 메서드의 경계를 넘나들 때 비용도 발생한다.
네이티브 메서드와 자바 코드를 잇는 코드를 작성하는 것도 귀찮고 가독성도 떨어진다.
Low 레벨 자원이나 네이티브 라이브러리를 사용해야만 하는 경우가 아니라면 네이티브 코드는 지양하자.
사용하더라도 최소한만 사용하고 테스트를 철저히하자.
네이티브 메서드
네이티브 메서드의 주요 쓰임
네이티브 메서드의 단점