Java 네이티브 액세스
Java Native Access| 원저작자 | Todd Fast, Timothy Wall, Liang Chen |
|---|---|
| 초기 릴리즈 | 2007년 5월 9일 ( |
| 안정된 릴리스 | 5.8.0 / 2021년 3월 22일, 전([1] |
| 저장소 | |
| 기입처 | C 및 Java |
| 운영 체제 | Windows, macOS, Android, AIX, FreeBSD, Linux, OpenBSD, Solaris, Windows Mobile |
| 플랫폼 | Java 1.4 이상(JNA 3.5.2 이하), Java 1.6(JNA 4.0.0 이상) |
| 크기 | 1.83 MB (아카이브) |
| 유형 | 소프트웨어 라이브러리 |
| 면허증. | LGPL 버전 2.1 이후 및 (버전 4.0 이후) Apache 소프트웨어 라이센스 버전 2.0 |
| 웹 사이트 | github |
Java Native Access(JNA)는 Java Native Interface(JNI)를 사용하지 않고 Java 프로그램이 네이티브 공유 라이브러리에 쉽게 액세스할 수 있도록 하는 커뮤니티 개발 라이브러리입니다.유고 인민군의 설계는 최소한의 노력으로 자연스런 방식으로 원주민들에게 접근을 제공하는 것을 목표로 한다.JNI와 달리 보일러 플레이트나 생성된 글루 코드는 필요하지 않습니다.
아키텍처
유고 인민군 라이브러리는 외부 기능 인터페이스 라이브러리(libffi)라고 하는 작은 네이티브 라이브러리를 사용하여 네이티브 코드를 동적으로 호출합니다.유고 인민군 라이브러리는 네이티브 함수를 사용하여 코드가 라이브러리를 이름으로 로드하고 라이브러리 내의 함수에 대한 포인터를 검색할 수 있으며 libffi 라이브러리를 사용하여 호출합니다. 이 모든 기능은 정적 바인딩, 헤더 파일 또는 컴파일 단계 없이 실행됩니다.개발자는 Java 인터페이스를 사용하여 대상 네이티브 라이브러리의 기능과 구조를 설명합니다.이를 통해 JNI 코드 구성 및 구축에 따른 높은 개발 오버헤드 없이 네이티브 플랫폼 기능을 쉽게 활용할 수 있습니다.
JNA는 macOS, Microsoft Windows, FreeBSD/OpenBSD, Solaris, Linux, AIX, Windows Mobile 및 Android에서 구축 및 테스트됩니다.또한 네이티브 빌드 구성을 조정하고 재컴파일하여 Java를 실행하는 대부분의 다른 플랫폼에서 작동하도록 할 수도 있습니다.
매핑 유형
다음 표는 Java와 네이티브 코드 간의 유형 매핑 개요이며, 유고 인민군 [2]라이브러리에서 지원합니다.
| 네이티브 타입 | 크기 | 자바 타입 | 일반적인 Windows 유형 |
|---|---|---|---|
| 차 | 8비트 정수 | 바이트 | 바이트, TCHAR |
| 짧다 | 16비트 정수 | 짧다 | 단어 |
| wchar_t | 16/32비트 문자 | 차 | TCHAR |
| 인트 | 32비트 정수 | 인트 | DWORD |
| 인트 | 부울값 | 부울 | 부루 |
| 긴 | 32/64비트 정수 | NativeLong | 긴 |
| 오래오래 | 64비트 정수 | 긴 | __int64 |
| 흘러가다 | 32비트 FP | 흘러가다 | |
| 이중으로 하다 | 64비트 FP | 이중으로 하다 | |
| 문자* | C 문자열 | 스트링 | LPCTR |
| 무효* | 포인터 | Pointer | LPVOID, 핸들, LPXXX |
주의: TCHAR의 의미는 일부 프리프로세서 정의에 따라 char와 wchar_t 사이에서 달라집니다.LPCTSTR이 이어집니다.
데이터 구조를 위한 메모리 바이트 정렬
네이티브 라이브러리에는 표준화된 메모리 바이트 정렬 맛이 없습니다.JNA는 기본적으로 OS 플랫폼별 설정으로 라이브러리별 사용자 지정 정렬에 의해 재정의될 수 있습니다.네이티브 라이브러리의 설명서에 얼라인먼트의 상세 내용이 기재되어 있지 않은 경우 Java 래퍼 구현 시 시행착오를 통해 올바른 얼라인먼트를 판단해야 합니다.
예
다음 프로그램은 로컬 C 표준 라이브러리 구현을 로드하고 이를 사용하여 printf 함수를 호출합니다.
주의: 다음 코드는 휴대 가능하며 Windows 및 POSIX(GNU+Linux/Unix/macOS) 플랫폼에서 동일하게 작동합니다.
수입품 com.sun.com.sun.com.sun.com도서관; 수입품 com.sun.com.sun.com.sun.com네이티브; 수입품 com.sun.com.sun.com.sun.com플랫폼; /** 네이티브라이브러리 선언 및 사용 예를 나타냅니다.*/ 일반의 학급 안녕 세계 { 일반의 인터페이스 클리브리 확장 도서관 { 클리브리 사례 = (클리브리) 네이티브.로드 라이브러리( (플랫폼.윈도() ? "msvcrt" : "c"), 클리브리.학급); 무효 인쇄물(스트링 포맷, 물건... args); } 일반의 정적인 무효 주된(스트링[] args) { 클리브리.사례.인쇄물("안녕하세요, 월드\n"); 위해서 (인트 i = 0; i < > args.길이; i++) { 클리브리.사례.인쇄물("인수 %d: %s\n", i, args[i]); } } } 다음 프로그램은 C POSIX 라이브러리를 로드하고 이를 사용하여 표준 mkdir 함수를 호출합니다.
주의: 다음 코드는 휴대용이며 POSIX 표준 플랫폼에서도 동일하게 작동합니다.
수입품 com.sun.com.sun.com.sun.com도서관; 수입품 com.sun.com.sun.com.sun.com네이티브; /** 네이티브 C POSIX 라이브러리 선언 및 사용 예.*/ 일반의 학급 예POSIX { 일반의 인터페이스 POSIX 확장 도서관 { 일반의 인트 모뎀(스트링 파일명, 인트 모드); 일반의 인트 부서졌다(스트링 파일명, 인트 유저, 인트 그룹.); 일반의 인트 이름을 바꾸다(스트링 올드 패스, 스트링 새로운 경로); 일반의 인트 죽여라(인트 pid, 인트 신호.); 일반의 인트 링크(스트링 올드 패스, 스트링 새로운 경로); 일반의 인트 mkdir(스트링 경로., 인트 모드); 일반의 인트 rmdir(스트링 경로.); } 일반의 정적인 무효 주된(스트링[] args) { // Windows에서 부분 POSIX 지원을 위해 msvcrt를 로드할 수 있습니다. POSIX 인식하다 = (POSIX) 네이티브.로드 라이브러리("c", POSIX.학급); // 단, /tmp가 없기 때문에 Windows에서는 실패합니다. 인식하다.mkdir("/tmp/newdir", 0777); 인식하다.이름을 바꾸다("/tmp/newdir","/tmp/mpir"); } } 다음 프로그램은 Kernel32.dll을 로드하여 비프 및 슬립 기능을 호출합니다.
주의: 다음 코드는 Windows 플랫폼에서만 작동합니다.
수입품 com.sun.com.sun.com.sun.com도서관; 수입품 com.sun.com.sun.com.sun.com네이티브; /** Windows 네이티브라이브러리 선언 및 사용 예를 나타냅니다.*/ 일반의 학급 비프 예시 { 일반의 인터페이스 커널32 확장 도서관 { // FREQUES는 헤르츠 단위로 표시되며 범위는 37 ~32767입니다 // DURATION은 밀리초 단위로 표시됩니다. 일반의 부울 삐(인트 빈도수., 인트 지속); 일반의 무효 수면.(인트 지속); } 일반의 정적인 무효 주된(스트링[] args) { 커널32 lib = (커널32) 네이티브.로드 라이브러리("param32", 커널32.학급); lib.삐(698, 500); lib.수면.(500); lib.삐(698, 500); } } 「 」를 참조해 주세요.
레퍼런스
- ^ "Release 5.8.0". GitHub. 2021-03-22.
- ^ "Default Type Mappings". jna.dev.java.net. Retrieved 2011-08-02.
외부 링크
- Java 네이티브 액세스 웹 페이지
- Java Native Access - 다운로드 페이지
- Java Native Access - 사용자 메일링 리스트
- Friesen, Jeff (5 February 2008). "Open source Java projects: Java Native Access". Open Source Java Tutorials. JavaWorld. Retrieved 2020-07-27.
- Morris, Stephen B. (20 May 2009). "Protect Your Legacy Code Investment with JNA". today.java.net. Archived from the original on 2015-01-13.
- Dasgupta, Sanjay (11 November 2009). "Simplify Native Code Access with JNA". today.java.net. Archived from the original on 2009-11-15.
- Doubrovkine, Daniel (20 June 2011). "JNA is now a Githubber". code.dblock.org. Retrieved 2020-07-27.
- Kiaer, Jesper (21 March 2010). "Calling the Lotus Domino C-API with JNA". Nevermind.dk. Retrieved 2020-07-27.

