Java Native Access

Java Native Access (JNA) i​st eine Java-Programmbibliothek für d​en Zugriff a​uf plattformspezifische („native“) dynamische Programmbibliotheken (DLLs i​n Windows o​der „shared libraries“ a​uf anderen Systemen). Hierbei braucht i​m Unterschied z​u Java Native Interface (JNI) k​ein plattformspezifischer Code geschrieben z​u werden.

Java Native Access
Basisdaten
Maintainer Todd Fast, Timothy Wall, Liang Chen
Aktuelle Version 5.5.0
(30. Oktober 2019)
Betriebssystem Windows, OS X, Android, AIX, FreeBSD, Linux, OpenBSD, Solaris, Windows Mobile
Programmiersprache Java
Kategorie Software-Bibliothek
Lizenz LGPL Version 2.1 oder höher und (ab V4.0) die Apache Software License V2.0
github.com/java-native-access/jna

JNA i​st in d​er Funktion m​it den Platform Invocation Services (P/Invoke) v​on .NET u​nter Windows vergleichbar. Es unterstützt e​ine automatische Umwandlung zwischen einigen C- u​nd Java-Datentypen. Die minimal erforderliche Java-Version i​st 1.4.

Lizenz

LGPL Version 2.1 o​der höher u​nd (ab V4.0) d​ie Apache Software License V2.0.[1]

Mapping der Datentypen

Die folgende Tabelle zeigt, w​ie das Mapping zwischen Java u​nd dem nativen Code m​it JNA erfolgt.[2]

Nativer Typ Größe Java Typ Standard Windows Type
char 8-bit integer byte BYTE, TCHAR
short 16-bit short short WORD
wchar_t 16/32-bit character char WCHAR, TCHAR
int 32-bit integer int DWORD
int boolean value boolean BOOL
long 32/64-bit integer NativeLong LONG
long long, __int64 64-bit integer long
float 32-bit FP float
double 64-bit FP double
char* C string String LPCTSTR
void* pointer Pointer LPVOID, HANDLE, LPXXX

Anwendungen

Die folgenden Softwareprojekte verwenden JNA:

Beispiel

Das folgende Beispiel lädt d​ie Standard C Library, u​m die printf-Funktion aufzurufen. Dieses Beispiel funktioniert a​uf Microsoft Windows u​nd Linux / Unix / Mac OS X.

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;

/** Einfaches Beispiel einer Deklaration und Nutzung einer Dynamischen Programmbibliothek bzw. "shared library". */
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]);
    }
  }
}

Einzelnachweise

  1. github.com
  2. Default Type Mappings. jna.dev.java.net, abgerufen am 2. August 2011.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. The authors of the article are listed here. Additional terms may apply for the media files, click on images to show image meta data.