자바 네이티브 액세스

자바 네이티브 액세스
Java Native Access
원저자토드 패스트(Todd Fast), 티모시 월(Timothy Wall), 리앙 첸(Liang Chen)
발표일2007년 5월 9일 (2007-05-09)
안정화 버전
5.13.0 / 2023년 1월 14일(22개월 전)(2023-01-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.com/java-native-access/jna

자바 네이티브 액세스(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]

같이 보기

[편집]

각주

[편집]
  1. “Release 5.13.0”. 《GitHub》. 2023년 1월 14일. 
  2. “Default Type Mappings”. jna.dev.java.net. 2011년 8월 2일에 확인함. 
  3. “JNI vs JNA performance”. 《Reddit》. 2023년 3월 30일에 확인함. 
  4. “JNI vs JNA benchmark”. 《Medium》. 2023년 3월 30일에 확인함. 
  5. “JNI vs JNA performance benchmark”. 《Stack Overflow》. Stack Overflow. 2023년 3월 30일에 확인함. 

외부 링크

[편집]