자바 네이티브 액세스
자바 프로그램이 네이티브 공유 라이브러리에 쉽게 접근케 해주는 라이브러리
자바 네이티브 액세스(Java Native Access, JNA)는 자바 네이티브 인터페이스(JNI)를 직접 사용하지 않고도 자바 프로그램이 네이티브 공유 라이브러리에 쉽게 접근할 수 있도록 해주는 커뮤니티가 개발한 라이브러리이다. JNA의 디자인은 최소한의 노력으로 자연스러운 방법으로 네이티브한 접근을 가능케 하는 것이다. JNI와 달리 보일러플레이트나 글루 코드 생성이 필요하지 않다.
원저자 | 토드 패스트(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 |
매핑 타입
편집다음의 표는 자바와 네이티브 코드간 매핑 유형, 그리고 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]);
}
}
}
성능
편집같이 보기
편집각주
편집- ↑ “Release 5.13.0”. 《GitHub》. 2023년 1월 14일.
- ↑ “Default Type Mappings”. jna.dev.java.net. 2011년 8월 2일에 확인함.
- ↑ “JNI vs JNA performance”. 《Reddit》. 2023년 3월 30일에 확인함.
- ↑ “JNI vs JNA benchmark”. 《Medium》. 2023년 3월 30일에 확인함.
- ↑ “JNI vs JNA performance benchmark”. 《Stack Overflow》. Stack Overflow. 2023년 3월 30일에 확인함.