Type Here to Get Search Results !

jni javah와 javac -h의 차이 및 변경 jdk 버전

이 글에서는 jni를 이용해서 컴파일 시 사용하는 javah 툴과 javac -h의 차이에 대해서 설명합니다. 

  • JNI(Java Native Interface) 소개
  • javah와 javac -h의 역사
  • javah와 javac -h의 명령어 차이
jni javah and javac difference


JNI(Java Native Interface) 소개


JNI(Java Native Interface)는 자바 언어로 작성된 코드와 네이티브 언어(예: C, C++)로 작성된 코드 간의 상호작용을 제공하는 프레임워크입니다. JNI를 사용하여 자바 코드에서 네이티브 코드를 호출하거나, 네이티브 코드에서 자바 코드를 호출할 수 있습니다.


javah와 javac -h의 역사


글 JDK 10부터 javah 도구는 사용되지 않으며, 대신 javac에 -h 옵션이 도입되었습니다. javah와 javac -h는 모두 네이티브 인터페이스 코드를 생성하는 도구로 사용되었으나, javac -h는 javah보다 더욱 향상된 기능과 유연성을 제공합니다.


기존의 javah는 Java 소스 파일에 기반하여 JNI(Java Native Interface) 헤더 파일을 생성하는 도구였습니다. JNI를 사용하면 Java 언어와 네이티브 언어(예: C, C++) 간의 상호작용이 가능했습니다. javah는 Java 소스 코드에 특별한 주석을 추가하여 네이티브 메소드를 식별하고 해당 메소드에 대한 헤더 파일을 생성했습니다.


그러나 JDK 10부터는 javac에 -h 옵션이 추가되었습니다. javac -h 옵션은 소스 파일을 컴파일하는 동시에 JNI 헤더 파일을 자동으로 생성합니다. 즉, javac -h는 컴파일러 자체에 내장되어 있으므로 별도의 도구를 실행할 필요가 없습니다.


javac -h 옵션을 사용하면 javah와 비교하여 몇 가지 이점이 있습니다. 첫째, 빌드 프로세스를 단순화할 수 있습니다. 이제 네이티브 메소드를 사용하는 클래스를 컴파일할 때마다 javah를 따로 실행할 필요 없이 javac -h를 실행하기만 하면 됩니다. 둘째, javac -h는 소스 파일을 분석하고 헤더 파일을 생성하므로 네이티브 메소드와 일치하는지 확인할 수 있습니다. 이는 개발자가 일관된 인터페이스를 유지하고 버그를 방지하는 데 도움이 됩니다.


따라서 javah는 더 이상 사용되지 않으며, javac -h를 사용하여 네이티브 인터페이스 코드를 생성하는 것이 권장됩니다. 이 변경은 JDK 10 이후의 버전에서 계속 유지되고 있으며, Java 개발자는 이를 활용하여 네이티브 언어와의 상호작용을 보다 간편하게 처리할 수 있습니다.


javah와 javac -h의 명령어 차이 


javah와 javac -h는 JNI를 사용할 때 필요한 헤더 파일을 생성하는 데 사용되는 명령어입니다.


javah 명령어:

javah 명령어는 JDK(Java Development Kit)에 포함된 도구로, 자바 클래스의 네이티브 메서드에 대한 C/C++ 헤더 파일을 생성합니다. 네이티브 메서드는 자바 코드에서 선언되었지만, 실제 구현은 C/C++ 코드에서 이루어지는 메서드입니다. javah는 자바 클래스 파일을 입력으로 받고, 해당 클래스에 정의된 네이티브 메서드에 대한 헤더 파일을 생성합니다. 이 헤더 파일은 네이티브 코드에서 자바 메서드를 호출하기 위해 사용됩니다.


예를 들어, 다음과 같이 SampleClass라는 자바 클래스에 네이티브 메서드가 정의되어 있다고 가정해 봅시다.

public class SampleClass {
    public native void nativeMethod();
}

JDK 8 이전 에는 다음과 같이 javac전용 javah유틸리티를 사용 하여 Java 프로그램을 컴파일하고 C / C ++ 헤더를 생성 해야합니다. 이 javah유틸리티는 JDK 10에서 더 이상 사용할 수 없습니다.

> javac SampleClass.java 
> javah SampleClass 
    

javac -h 명령어:


JDK 8부터는 " javac -h"을 사용하여 Java 프로그램을 컴파일하고 HelloJNI.h다음과 같이 호출 되는 C / C ++ 헤더 파일을 생성 해야합니다. 이 과정은 한 번에 수행됩니다.

> javac -h . SampleClass.java
> javac -h "디렉토리" "java 소스파일" 형태로 사용해야합니다.