자바 네이티브 액세스

자바 네이티브 액세스(Java Native Access, JNA)는 자바 네이티브 인터페이스(JNI)를 직접 사용하지 않고도 자바 프로그램이 네이티브 공유 라이브러리에 쉽게 접근할 수 있도록 해주는 커뮤니티가 개발한 라이브러리이다. JNA의 디자인은 최소한의 노력으로 자연스러운 방법으로 네이티브한 접근을 가능케 하는 것이다. JNI와 달리 보일러플레이트나 글루 코드 생성이 필요하지 않다.

 매핑 타입 
다음의 표는 자바와 네이티브 코드간 매핑 유형, 그리고 JNA 라이브러리가 지원하는 유형의 개요를 나타낸 것이다.
네이티브 타입크기자바 타입공통 윈도우 타입char8-bit integerbyteBYTE, TCHARshort16-bit integershortWORDwchar_t16/32-bit charactercharTCHARint32-bit integerintDWORDintboolean valuebooleanBOOLlong32/64-bit integerNativeLongLONGlong long64-bit integerlong__int64float32-bit FPfloatdouble64-bit FPdoublechar*C stringStringLPCSTRvoid*pointerPointerLPVOID, 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배 속도가 더 느리다.

 같이 보기 
 SWIG

 각주 

 외부 링크 
 Java Native Access Web Page
 Java Native Access - Download page
 Java Native Access - User Mailing List

분류:자바 플랫폼