Back end/Java 기본

JNI 와 PURE JAVA?

jinpark1992 2024. 6. 26. 15:00

JNI (Java Native Interface)

: JNI(Java Native Interface)**는 Java 애플리케이션에서 네이티브(플랫폼 특정) 코드를 호출할 수 있게 해주는 프로그래밍 프레임워크입니다. 이는 Java 프로그램이 C, C++ 등의 네이티브 언어로 작성된 라이브러리나 코드와 상호작용할 수 있도록 설계되었습니다.

주요 특징:

  1. 플랫폼 종속 코드 호출: JNI를 사용하면 Java 코드에서 특정 운영 체제 기능이나 하드웨어와 상호작용하는 코드(C, C++ 등)를 호출할 수 있습니다.
  2. 네이티브 라이브러리 로드: System.loadLibrary() 메서드를 통해 네이티브 라이브러리를 로드합니다.
  3. 메서드 선언: 네이티브 메서드를 Java에서 선언하고, 해당 메서드를 네이티브 언어로 구현합니다.
  4. JNI 환경 접근: 네이티브 코드에서 Java 환경(JVM) 및 객체에 접근할 수 있습니다.

예시:

Java 클래스에서 네이티브 메서드를 선언하는 예

public class MyClass {
    static {
        System.loadLibrary("mylibrary"); // 네이티브 라이브러리 로드
    }
    
    public native void myNativeMethod(); // 네이티브 메서드 선언
    
    public static void main(String[] args) {
        new MyClass().myNativeMethod(); // 네이티브 메서드 호출
    }
}

 

C/C++로 네이티브 메서드를 구현하는 예:

#include <jni.h> #include "MyClass.h" JNIEXPORT void JNICALL Java_MyClass_myNativeMethod(JNIEnv *env, jobject obj) { // 네이티브 코드 구현 printf("Hello from native code!\n"); }

Pure Java

 : Pure Java는 순수하게 Java 언어만을 사용하여 작성된 코드를 의미합니다. 즉, 네이티브 코드를 포함하지 않고, Java의 표준 라이브러리와 기능만을 사용합니다.

주요 특징:

  1. 이식성: Pure Java 코드는 JVM이 있는 모든 플랫폼에서 실행될 수 있습니다. 이는 Java의 "Write Once, Run Anywhere" 철학을 반영합니다.
  2. 안전성: 네이티브 코드와 달리, Pure Java 코드는 JVM의 메모리 관리 및 보안 모델에 의존하여 안전성을 보장합니다.
  3. 디버깅 용이성: Pure Java 코드는 JVM 내에서 실행되므로, Java 디버거를 사용하여 쉽게 디버깅할 수 있습니다.
  4. 플랫폼 비종속성: Pure Java 코드는 운영 체제나 하드웨어에 종속되지 않습니다.

예시:

public class PureJavaExample {
    public static void main(String[] args) {
        System.out.println("This is a pure Java example.");
    }
}

비교

  1. 의존성:
    • JNI: 네이티브 라이브러리에 의존하며, 해당 라이브러리는 특정 플랫폼에 종속될 수 있습니다.
    • Pure Java: Java 표준 라이브러리만 사용하며, 플랫폼에 종속되지 않습니다.
  2. 이식성:
    • JNI: 네이티브 코드 때문에 이식성이 제한될 수 있습니다.
    • Pure Java: JVM이 있는 모든 플랫폼에서 실행될 수 있어 이식성이 높습니다.
  3. 성능:
    • JNI: 성능이 중요한 경우 네이티브 코드를 사용하여 최적화를 할 수 있습니다.
    • Pure Java: JVM 위에서 실행되며, 네이티브 코드보다 성능이 떨어질 수 있습니다.
  4. 안전성:
    • JNI: 네이티브 코드의 버그나 보안 취약점이 JVM에 영향을 줄 수 있습니다.
    • Pure Java: JVM의 관리 및 보안 모델을 따르므로 안전성이 높습니다.
즉 JNI와 Pure Java를 나누는 이유는 각각의 장점과 적용 범위를 고려하여 최적의 솔루션을 선택하기 위함입니다. 성능이 중요하고 특정 플랫폼 기능을 활용해야 할 경우 JNI를 사용하여 네이티브 코드와 통합할 수 있습니다. 반면, 플랫폼 독립성과 안정성이 필요한 경우 Pure Java를 사용하여 이점을 활용할 수 있습니다. 개발 목표와 요구 사항에 따라 적절한 방법을 선택하여 코드를 설계하고 구현하는 것이 중요합니다.