들어가며
자바 네이티브 인터페이스(JNI)는 자바 프로그램이 C나 C++같은 네이티브 프로그래밍 언어로 작성된 네이티브 메소드를 호출하는 기능이다. 네이티브 메소드의 주요 쓰임은 다음과 같다.
- 레지스트리 같은 플랫폼 특화 기능 사용
- 네이티브 코드로 작성된 기존 라이브러리 사용
- 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성
플랫폼 특화 기능을 사용하려면 네이티브 메소드를 사용해야한다. 하지만 자바가 발전하면서 하부 플랫폼의 기능들을 점차 흡수해가고 있기 때문에 네이티브 메소드를 사용할 필요가 줄어들고 있다. 또한 대체할만한 자바 라이브러리가 없는 네이티브 라이브러리를 사용해야 할 때에도 네이티브 메소드를 사용해야 한다.
성능 개선을 목적으로 네이티브 메소드를 사용하는것은 거의 권장하지 않는다. JVM이 발전하면서 성능 개선의 영역이 줄어들고 있기 때문이다. 하지만 네이티브 라이브러리 쪽은 GNU 다중 정밀 연산 라이브러리를 주축으로 지속적인 개선 작업이 이루어지고 있다. 고성능의 다중 정밀 연산이 필요한 경우라면 네이티브 메소드를 통해 GMP를 고려하는 것도 방안이다.
네이티브 메소드에는 단점이 있다. 네이티브 언어가 안전하지 않으므로 네이티브 메소드를 사용하는 어플리케이션도 메모리 훼손 오류로부터 더 이상 안전하지 않다. 네이티브 언어는 플랫폼을 많이 타서 이식성도 낮다. 디버깅도 어렵고 주의하지 않으면 속도도 느려진다. GC가 네이티브 메모리는 자동 회수하지 못하고 심지어 추적조차 할 수 없다. 자바 코드와 네이티브 코드를 넘나들며 비용도 추가된다. 네이티브 메소드와 자바 코드 사이에 접착 코드를 작성하는데 있어 가독성이 떨어지고 일이 많아진다.