이 글에서는 jni를 이용해서 컴파일 시 사용하는 javah 툴과 javac -h의 차이에 대해서 설명합니다.
- JNI(Java Native Interface) 소개
- javah와 javac -h의 역사
- javah와 javac -h의 명령어 차이
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(); }
> javac SampleClass.java > javah SampleClass
javac -h 명령어:
> javac -h . SampleClass.java > javac -h "디렉토리" "java 소스파일" 형태로 사용해야합니다.