article thumbnail image
Published 2022. 11. 6. 19:52

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

참고 문헌

 

JNI programming

The Java Development Kit (JDK) provides tools and library routines that help the Java programmer interface with native code. Microsoft and Sun both provide their own implementations of the JDK, and are incompatible with each other. All of the examples and

home.pacifier.com

 

JNI(Java Native Interface) 이해

이 JNI(Java™ Native Interface)에 대한 설명은 JNI 오퍼레이션과 관련된 문제점을 진단하는 데 도움이 되는 배경 정보를 제공합니다. JNI(Java Native Interface)의 스펙은 Oracle Corporation에서 유지보수합니다.

www.ibm.com

 

Java Native Interface Specification Contents

Java Native Interface Specification Contents Contents | Previous | Next 1. Introduction 2. Design Overview 3. JNI Types and Data Structures 4. JNI Functions 5. The Invocation API Contents | Previous | Next

docs.oracle.com

복사했습니다!