JNI ?
- Java Native Interface의 약자로 Java 코드가 다른 언어(일반적으로는 C 또는 C++)로 작성된 코드와 상호 작용할 수 있도록 하는 API입니다.
왜 사용하나요?
- 이미 Java로 소프트웨어 코어단을 작성했고, 이 이후 코드들은 Java 코드로 재작성하기를 원치 않고, Java로 작성된 코어 코드만 재사용하고 싶을때 JNI를 많이 사용합니다.
- 우리가 시스템 디바이스에 접근할 필요가 있거나 혹은 Java의 성능을 넘어선 플랫폼 특징적인 작업을 수행할 경우에 JNI를 사용할 수 있습니다. (사실 많은 Java 라이브러리 루틴들이 결과적으로 내부(private) 네이티브 메소드를 이러한 목적으로 호출하고 있다. 예를 들면, I/O, Threading, Networking 패키지들 전부가 내부 네이티브 메소드를 포함한다.)
- Java로 구현하기엔 애플리케이션이 매우 느릴 수 있으며, C++에서 time-critical 코드를 구현함으로써 성능 향상을 가져올 수 있을 경우에도 JNI를 많이 사용합니다. (Java의 성능이 좋지않다는건 소프트웨어 엔지니어라면 누구나 아는 사실..)
JNI를 사용했을때 단점
이식성(Portability)을 잃게 된다.
- 많은 Java 라이브러리가 네이티브 메소드를 사용하고 있는데, 새로 추가된 네이티브 메소드가 모든 플랫폼에서 호출 가능한 동일한 C++코드를 가진다면, 그 코드는 Java에서 가장 먼저(in the first place) 구현되어질 수 있다.
안전성(Safety)을 잃게 된다.
- 네이티브 메소드는 Java 메소드처럼 동일한 보호를 보장받지 못한다. 일단 C++ 코드에 들어가게 되면, Java에서의 모든 것이 백지화 되고 메모리 추적, 포인터의 사용 그리고 배열 바운딩에 의한 C++ 버그들이 발생할 수 있다. (그래서.. 네이티브 메소드에서 버그가 발생하면 디버깅해서 추적하기가 매우 까다롭다.)
동적 라이브러리들 내에서 네이티브 메소드의 구현이 이루어진다.
- 네이티브 메소드의 구현은 .dll(Windows) 및 .so(UNIX 및 Windows) 같은 동적 라이브러리들 내에서 이루어진다.
- 네이티브 메소드를 사용하는 Java 코드는 반드시 동적 라이브러리들을 호출하는데, 이는 Java 서큐리티 매니저에 반대되는 연산이다. 일례로, 애플릿에서는 일반적으로 사용자 정의 네이티브 메소드를 호출할 수 없다.
JNI 시그니처
Java Type | Signature |
boolean | Z |
byte | B |
char | C |
double | D |
float | F |
int | I |
long | J |
void | V |
String | Ljava/lang/String; |
object | L전체 클래스 이름 |
type[] | [type |
method signature | (arg-types)ret_type |
예제
void Fly();
()V
int Fly(int, long);
(IJ)I
boolean Fly(int[]);
([I)B
double Fly(String, int);
(Ljava/lang/String;I)D
void Fly(int, String [], char);
(I[Ljava/lang/String;C)V
참고 문헌
'DevLog > JAVA' 카테고리의 다른 글
올바른 JDBC 프로그래밍 (0) | 2017.11.11 |
---|---|
Java에서 Immutable이란? (0) | 2017.11.08 |
JAVA와 C#의 차이점 (0) | 2017.11.02 |
List와 반복문(loop), 그리고 변수 선언 위치에 대해서 (0) | 2017.11.01 |
향상된 For문 (Enhanced For Loop) (0) | 2017.11.01 |