{{위키데이터 속성 추적}}
{{소프트웨어 정보
| name = 자바 네이티브 액세스<br />Java Native Access
| logo = 
| screenshot = 
| caption = 
| developer = 
| released = {{시작 날짜|2007|05|09}}<!-- https://github.com/twall/jna/commits/master?page=35 as of May 2xxx

012 -->
| latest release version = 5.13.0
| latest release date = {{시작 날짜와 나이|2023|01|14}}<ref name="5.13.0">{{웹 인용
| url=https://github.com/java-native-access/jna/releases/tag/5.13.0
| title=Release 5.13.0
| website=[[GitHub]]
| date=2023-01-14}}</ref>
| latest preview version = 
| latest preview date = 
| operating system = Windows, macOS, Android, AIX, FreeBSD, [[Linux]], OpenBSD, Solaris, Windows Mobile
| platform = [[자바|Java]] 1.4 이상 (JNA 3.5.2 이하에서 지원), Java 1.6 for JNA 4.0.0 이상
| size = 1.83 MB (압축된 파일 기준)
| programming language = [[C (프로그래밍 언어)|C]] 및 [[자바]]
| genre = [[라이브러리|소프트웨어 라이브러리]]
| license = [[LGPL]] 버전 2.1 이상 및 (버전 4.0부터) 아파치 소프트웨어 라이선스, 버전 2.0
| website = {{url|https://github.com/java-native-access/jna}}
| author = 토드 패스트(Todd Fast), 티모시 월(Timothy Wall), 리앙 첸(Liang Chen)
}}
'''자바 네이티브 액세스'''(Java Native Access, '''JNA''')는 [[자바 네이티브 인터페이스]](JNI)를 직접 사용하지 않고도 [[자바 (소프트웨어 플랫폼)|자바]] 프로그램이 [[라이브러리 (컴퓨팅)|네이티브 공유 라이브러리]]에 쉽게 접근할 수 있도록 해주는 커뮤니티가 개발한 라이브러리이다. JNA의 디자인은 최소한의 노력으로 자연스러운 방법으로 네이티브한 접근을 가능케 하는 것이다. JNI와 달리 [[보일러플레이트]]나 [[글루 코드]] 생성이 필요하지 않다.

== 매핑 타입 ==
다음의 표는 자바와 네이티브 코드간 매핑 유형, 그리고 JNA 라이브러리가 지원하는 유형의 개요를 나타낸 것이다.<ref>{{웹 인용|url=https://github.com/twall/jna/blob/master/www/Mappings.md |title=Default Type Mappings |publisher=jna.dev.java.net|access-date=2011-08-02}}</ref>
{| class="wikitable"
!네이티브 타입
!크기
!자바 타입
!공통 윈도우 타입
|-
|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
|<abbr>NativeLong</abbr>
|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
|<abbr>Pointer</abbr>
|LPVOID, HANDLE, LPXXX
|}

== 예시 ==
다음 프로그램은 [[C 표준 라이브러리|C 표준 라이브러리]] 구현체를 불러와서 [[printf]] 함수를 호출한다.

다음 코드는 이식이 가능하며 [[마이크로소프트 윈도우]], POSIX([[리눅스]], [[유닉스]], [[macOS]]) 플랫폼에서 모두 동일하게 동작한다.

<syntaxhighlight lang="java">
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]);
        }
    }
}
</syntaxhighlight>

== 성능 ==
벤치마크에 따르면 JNA는 평균적으로 JNI에 비해 10배 속도가 더 느리다.<ref>{{웹 인용|title=JNI vs JNA performance |url=https://www.reddit.com/r/java/comments/xhlnsp/jna_vs_jni_performance_question/ |website=Reddit |access-date=30 March 2023}}</ref><ref>{{웹 인용|title=JNI vs JNA benchmark |url=https://dkomanov.medium.com/java-native-access-performance-cf4ce0d68ddb |website=Medium |access-date=30 March 2023}}</ref><ref>{{웹 인용|title=JNI vs JNA performance benchmark |url=https://stackoverflow.com/questions/22288909/jni-vs-jna-performance |website=Stack Overflow |publisher=Stack Overflow |access-date=30 March 2023}}</ref>

== 같이 보기 ==
* [[SWIG]]

== 각주 ==
{{각주}}

== 외부 링크 ==
* [https://github.com/java-native-access/jna#readme Java Native Access Web Page]
* [https://github.com/java-native-access/jna#download Java Native Access - Download page]
* [https://groups.google.com/group/jna-users/about Java Native Access - User Mailing List]

[[분류:자바 플랫폼]]