원저자 | 토드 패스트(Todd Fast), 티모시 월(Timothy Wall), 리앙 첸(Liang Chen) |
---|---|
발표일 | 2007년 5월 9일 |
안정화 버전 | 5.13.0
/ 2023년 1월 14일[1] |
저장소 | |
프로그래밍 언어 | C 및 자바 |
운영 체제 | Windows, macOS, Android, AIX, FreeBSD, Linux, OpenBSD, Solaris, Windows Mobile |
플랫폼 | Java 1.4 이상 (JNA 3.5.2 이하에서 지원), Java 1.6 for JNA 4.0.0 이상 |
크기 | 1.83 MB (압축된 파일 기준) |
종류 | 소프트웨어 라이브러리 |
라이선스 | LGPL 버전 2.1 이상 및 (버전 4.0부터) 아파치 소프트웨어 라이선스, 버전 2.0 |
웹사이트 | github |
자바 네이티브 액세스(Java Native Access, JNA)는 자바 네이티브 인터페이스(JNI)를 직접 사용하지 않고도 자바 프로그램이 네이티브 공유 라이브러리에 쉽게 접근할 수 있도록 해주는 커뮤니티가 개발한 라이브러리이다. JNA의 디자인은 최소한의 노력으로 자연스러운 방법으로 네이티브한 접근을 가능케 하는 것이다. JNI와 달리 보일러플레이트나 글루 코드 생성이 필요하지 않다.
다음의 표는 자바와 네이티브 코드간 매핑 유형, 그리고 JNA 라이브러리가 지원하는 유형의 개요를 나타낸 것이다.[2]
네이티브 타입 | 크기 | 자바 타입 | 공통 윈도우 타입 |
---|---|---|---|
char | 8-bit integer | byte | BYTE, TCHAR |
short | 16-bit integer | short | WORD |
wchar_t | 16/32-bit character | char | TCHAR |
int | 32-bit integer | int | DWORD |
int | boolean value | boolean | BOOL |
long | 32/64-bit integer | NativeLong | LONG |
long long | 64-bit integer | long | __int64 |
float | 32-bit FP | float | |
double | 64-bit FP | double | |
char* | C string | String | LPCSTR |
void* | pointer | Pointer | LPVOID, HANDLE, LPXXX |
다음 프로그램은 C 표준 라이브러리 구현체를 불러와서 printf 함수를 호출한다.
다음 코드는 이식이 가능하며 마이크로소프트 윈도우, POSIX(리눅스, 유닉스, macOS) 플랫폼에서 모두 동일하게 동작한다.
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
/** Simple example of native library declaration and usage. */
public class HelloWorld {
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
(Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
void printf(String format, Object... args);
}
public static void main(String[] args) {
CLibrary.INSTANCE.printf("Hello, World\n");
for (int i = 0; i < args.length; i++) {
CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
}
}
}
벤치마크에 따르면 JNA는 평균적으로 JNI에 비해 10배 속도가 더 느리다.[3][4][5]