맨위로가기

자바 네이티브 액세스

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

자바 네이티브 액세스(JNA)는 자바 코드가 네이티브 코드를 호출할 수 있도록 하는 라이브러리이다. JNA는 libffi 라이브러리를 사용하여 네이티브 코드를 동적으로 호출하며, 개발자는 자바 인터페이스를 사용하여 네이티브 라이브러리의 함수와 구조를 설명한다. JNA는 macOS, Windows, Linux 등 다양한 운영 체제를 지원하며, 데이터 타입 매핑을 제공한다. JNA는 JNI에 비해 성능이 떨어지지만, JRuby, IntelliJ IDEA 등에서 사용되며, 네이티브 코드 호출을 위한 여러 대안 기술이 존재한다.

더 읽어볼만한 페이지

  • 자바 플랫폼 - 블루레이
    블루레이 디스크는 DVD 후속 매체로, 청색 레이저를 사용하여 고화질 영상과 음향을 제공하며 HD DVD와의 경쟁 후 고밀도 광디스크 표준으로 자리 잡았으나 스트리밍 서비스 성장으로 녹화용 디스크 생산이 중단되는 추세이다.
  • 자바 플랫폼 - 자바 플랫폼, 마이크로 에디션
    자바 ME는 임베디드 및 모바일 장치에서 자바 앱을 실행하는 플랫폼으로, 피처폰에서 주로 사용되었으며 다양한 프로파일과 에뮬레이터, 개발 도구를 제공하고 JSR을 통해 기능이 확장된다.
자바 네이티브 액세스 - [IT 관련 정보]에 관한 문서
일반 정보
이름자바 네이티브 액세스
영어 이름Java Native Access
개발
개발자토드 패스트(Todd Fast), 티모시 월(Timothy Wall), 리앙 첸(Liang Chen)
저자토드 패스트(Todd Fast), 티모시 월(Timothy Wall), 리앙 첸(Liang Chen)
릴리스 정보
최신 안정화 버전5.14.0
기술 정보
운영 체제Windows, macOS, Android, AIX, FreeBSD, 리눅스, OpenBSD, Solaris, Windows Mobile
플랫폼Java 1.4 이상 (JNA 3.5.2 이하), Java 1.6 (JNA 4.0.0 이상)
크기1.83 MB (압축 파일 크기)
프로그래밍 언어C, Java
장르소프트웨어 라이브러리
라이선스
라이선스LGPL 버전 2.1 이상 및 (버전 4.0부터) 아파치 라이선스 2.0
웹사이트
공식 웹사이트공식 웹사이트

2. 아키텍처

JNA 라이브러리는 외래 함수 인터페이스 라이브러리(libffi)라는 작은 네이티브 라이브러리를 사용하여 네이티브 코드를 동적으로 호출한다. JNA 라이브러리는 네이티브 함수를 사용하여 코드에서 이름으로 라이브러리를 로드하고 해당 라이브러리 내의 함수에 대한 포인터를 검색하며, libffi 라이브러리를 사용하여 이를 호출하는데, 이 모든 것이 정적 바인딩, 헤더 파일 또는 컴파일 단계 없이 이루어진다. 개발자는 대상 네이티브 라이브러리의 함수 및 구조를 설명하기 위해 자바 인터페이스를 사용한다. 이를 통해 JNI 코드를 구성하고 빌드하는 데 드는 높은 개발 오버헤드 없이 네이티브 플랫폼 기능을 활용하기가 매우 쉽다.

JNA는 macOS, Microsoft Windows, FreeBSD / OpenBSD, Solaris, Linux, AIX, Windows Mobile, 안드로이드에서 빌드 및 테스트되었다. 또한, 자바를 실행하는 대부분의 다른 플랫폼에서 작동하도록 네이티브 빌드 구성을 조정하고 다시 컴파일하는 것도 가능하다.

3. 매핑 타입

JNA는 자바와 네이티브 코드 간의 데이터 타입 매핑을 제공한다.[14][2][12] 다음은 JNA에서 지원하는 일반적인 타입 매핑 표이다.

네이티브 타입크기자바 타입공통 윈도우 타입
char8비트 정수byteBYTE, TCHAR
short16비트 정수shortWORD
wchar_t16/32비트 문자charTCHAR
int32비트 정수intDWORD
intboolean 값booleanBOOL
long32/64비트 정수NativeLongLONG
long long64비트 정수long__int64
float32비트 FPfloat
double64비트 FPdouble
char*C 문자열StringLPCSTR
void*포인터PointerLPVOID, HANDLE, LPXXX


3. 1. 데이터 구조에 대한 메모리 바이트 정렬

네이티브 라이브러리는 표준화된 메모리 바이트 정렬 방식을 가지고 있지 않다. JNA는 운영 체제 플랫폼에 특정한 설정을 기본값으로 사용하며, 이는 라이브러리별 사용자 지정 정렬을 통해 재정의될 수 있다. 네이티브 라이브러리 문서에 정렬에 대한 세부 정보가 제공되지 않는 경우, Java 래퍼 구현 과정에서 시행착오를 통해 올바른 정렬을 결정해야 한다.

4. 예시

다음은 JNA를 사용하여 C 표준 라이브러리의 printf 함수를 호출하는 예제이다.

```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]);

}

}

}

```

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

C POSIX 라이브러리의 mkdir 함수를 호출하는 예제는 다음과 같다.

```java

import com.sun.jna.Library;

import com.sun.jna.Native;

/** 네이티브 C POSIX 라이브러리 선언 및 사용의 간단한 예제입니다. */

public class ExampleOfPOSIX {

public interface POSIX extends Library {

public int chmod(String filename, int mode);

public int chown(String filename, int user, int group);

public int rename(String oldpath, String newpath);

public int kill(int pid, int signal);

public int link(String oldpath, String newpath);

public int mkdir(String path, int mode);

public int rmdir(String path);

}

public static void main(String[] args) {

// Windows에서 부분적인 POSIX 지원을 위해 msvcrt를 로드하는 것이 가능합니다...

POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);

// 그러나 /tmp가 없기 때문에 Windows에서는 여전히 실패합니다.

posix.mkdir("/tmp/newdir", 0777);

posix.rename("/tmp/newdir","/tmp/renamedir");

}

}

```

이 코드는 POSIX 표준 플랫폼에서 동일하게 작동한다.

Kernel32.dll의 Beep 및 Sleep 함수를 호출하는 예제는 다음과 같다.

```java

import com.sun.jna.Library;

import com.sun.jna.Native;

/** Windows 네이티브 라이브러리 선언 및 사용의 간단한 예제입니다. */

public class BeepExample {

public interface Kernel32 extends Library {

// FREQUENCY는 헤르츠로 표현되며 37에서 32767까지의 범위를 갖습니다.

// DURATION은 밀리초로 표현됩니다.

public boolean Beep(int FREQUENCY, int DURATION);

public void Sleep(int DURATION);

}

public static void main(String[] args) {

Kernel32 lib = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

lib.Beep(698, 500);

lib.Sleep(500);

lib.Beep(698, 500);

}

}

```

이 코드는 Windows 플랫폼에서만 작동한다.

5. 성능

벤치마크에 따르면 JNA는 평균적으로 JNI에 비해 10배 정도 속도가 느리다.[15][16][17][3][4][5]

6. JNA 채택 사례

JRuby는 POSIX 기능 제공에 JNA를 사용한다.[9][10] Freedom for Media in Java (FMJ)도 JNA를 사용한다.[11] 젯브레인즈사의 통합 개발 환경IntelliJ IDEA에서도 JNA가 채택되었다. 순수 Java로 작성된 Subversion 클라이언트 라이브러리인 SVNKit와 Java로 작성된 멀티미디어 라이브러리 VLCJ에 사용되는 Videolan에서도 JNA를 사용한다.

7. 대안

JNA 외에도 여러 대안적인 기술들이 존재한다.[6] 이러한 소프트웨어 개발 도구를 평가할 때 코드를 구현하기 쉬운 정도와 런타임 속도 간의 상충 관계를 고려해야 한다. 재배포 및 업데이트가 필요한 타사 종속 라이브러리의 추가도 어떤 도구를 사용할지 결정하는 데 영향을 미치는 또 다른 요소이다. 기술 성숙도 수준 또한 고려해야 한다.

참조

[1] 웹사이트 Release 5.14.0 https://github.com/j[...] 2023-01-14
[2] 웹사이트 Default Type Mappings https://github.com/t[...] jna.dev.java.net 2011-08-02
[3] 웹사이트 JNI vs JNA performance https://www.reddit.c[...] 2023-03-30
[4] 웹사이트 JNI vs JNA benchmark https://dkomanov.med[...] 2023-03-30
[5] 웹사이트 JNI vs JNA performance benchmark https://stackoverflo[...] Stack Overflow 2023-03-30
[6] 웹사이트 JNI alternatives emerging https://developer.ok[...] 2023-03-30
[7] 웹사이트 Releases - java-native-access/jna https://github.com/j[...] 2020-07-26
[8] 웹사이트 Release 5.6.0 https://groups.googl[...] 2020-07-26
[9] 문서 Java Native Access + JRuby = True POSIX https://headius.blog[...]
[10] 문서 JNA brings native code to JRuby http://www.infoq.com[...]
[11] 문서 Freedom for Media in Java http://fmj-sf.net/
[12] 문서 jna/www/Mappings.md at master · twall/jna https://github.com/t[...]
[13] 웹인용 Release 5.13.0 https://github.com/j[...] 2023-01-14
[14] 웹인용 Default Type Mappings https://github.com/t[...] jna.dev.java.net 2011-08-02
[15] 웹인용 JNI vs JNA performance https://www.reddit.c[...] 2023-03-30
[16] 웹인용 JNI vs JNA benchmark https://dkomanov.med[...] 2023-03-30
[17] 웹인용 JNI vs JNA performance benchmark https://stackoverflo[...] Stack Overflow 2023-03-30



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com