Acces nativ Java - Java Native Access

Acces nativ Java
Autori originali Todd Fast, Timothy Wall, Liang Chen
Eliberarea inițială 9 mai 2007 ( 09.05.2007 )
Versiune stabila
5.8.0 / 22 martie 2021 ; acum 5 luni ( 22.03.2021 )
Repertoriu
Scris in C și Java
Sistem de operare Windows, macOS, Android, AIX, FreeBSD, Linux , OpenBSD, Solaris, Windows Mobile
Platformă Java 1.4 sau o versiune ulterioară (pentru JNA 3.5.2 sau o versiune anterioară), Java 1.6 pentru JNA 4.0.0 și o versiune ulterioară
mărimea 1,83 MB (arhivat)
Tip Biblioteca software
Licență LGPL versiunea 2.1 sau o versiune ulterioară și (de la versiunea 4.0 în continuare) licența software Apache, versiunea 2.0
Site-ul web github .com / java-native-access / jna

Java Native Access ( JNA ) este o bibliotecă dezvoltată de comunitate care oferă programelor Java acces ușor la bibliotecile partajate native fără a utiliza Java Native Interface (JNI). Designul JNA își propune să ofere acces nativ într-un mod natural, cu un efort minim. Spre deosebire de JNI, nu este necesar niciun cazan sau cod de adeziv generat .

Arhitectură

Biblioteca JNA folosește o mică bibliotecă nativă numită bibliotecă de interfață funcție străină ( libffi ) pentru a invoca dinamic codul nativ . Biblioteca JNA folosește funcții native care permit codului să încarce o bibliotecă după nume și să recupereze un pointer către o funcție din acea bibliotecă și folosește biblioteca libffi pentru a o invoca, toate fără legături statice , fișiere antet sau orice fază de compilare. Dezvoltatorul folosește o interfață Java pentru a descrie funcțiile și structurile din biblioteca nativă țintă. Acest lucru face destul de ușor să profitați de caracteristicile platformei native, fără a suporta costurile ridicate de dezvoltare ale configurării și construirii codului JNI .

JNA este construit și testat pe macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile și Android . De asemenea, este posibil să modificați și să recompilați configurațiile native de construcție pentru a face să funcționeze pe majoritatea celorlalte platforme care rulează Java.

Tipuri de cartografiere

Următorul tabel prezintă o prezentare generală a mapării tipurilor între Java și codul nativ și acceptate de biblioteca JNA.

Tip nativ mărimea Tip Java Tipuri comune de Windows
char Întreg pe 8 biți octet BYTE, TCHAR
mic de statura Întreg pe 16 biți mic de statura CUVÂNT
wchar_t Caracter de 16/32 biți char TCHAR
int Întreg pe 32 de biți int DWORD
int valoare booleană boolean BOOL
lung Număr întreg de 32/64 de biți NativLung LUNG
lung lung Număr întreg pe 64 de biți lung __int64
pluti FP pe 32 de biți pluti
dubla FP pe 64 de biți dubla
char * Șir C Şir LPCSTR
nul * indicator Pointer LPVOID, HANDLE, LPXXX

Notă: Semnificația TCHAR se schimbă între char și wchar_t în conformitate cu unele definiții ale preprocesatorului. Urmează LPCTSTR.

Alinierea octeților de memorie pentru structurile de date

Bibliotecile native nu au o aromă standardizată de aliniere a octeților de memorie. JNA implicit este o setare specifică platformei de sistem de operare, care poate fi suprascrisă de o aliniere personalizată specifică bibliotecii. Dacă detaliile alinierii nu sunt date în documentația bibliotecii native, alinierea corectă trebuie determinată prin încercări și erori în timpul implementării împachetării Java.

Exemplu

Următorul program încarcă implementarea bibliotecii standard C locale și o folosește pentru a apela funcția printf .

Notă: Următorul cod este portabil și funcționează la fel pe platformele Windows și POSIX ( GNU + Linux / Unix / 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]);
        }
    }
}

Următorul program încarcă biblioteca C POSIX și o folosește pentru a apela funcția mkdir standard .

Notă: Următorul cod este portabil și funcționează la fel pe platformele de standarde POSIX .

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

/** Simple example of native C POSIX library declaration and usage. */
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) {
        // It is possible to load msvcrt for its partial POSIX support on Windows...
        POSIX posix = (POSIX) Native.loadLibrary("c", POSIX.class);
        // but it will still fail on Windows due to /tmp being missing.
	    posix.mkdir("/tmp/newdir", 0777);
	    posix.rename("/tmp/newdir","/tmp/renamedir");
    }
}

Programul de mai jos încarcă Kernel32.dll și îl folosește pentru a apela funcțiile Beep și Sleep .

Notă: Următorul cod funcționează numai pe platformele Windows .

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

/** Simple example of Windows native library declaration and usage. */
public class BeepExample {
    public interface Kernel32 extends Library {
        // FREQUENCY is expressed in hertz and ranges from 37 to 32767
        // DURATION is expressed in milliseconds
        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);
    }
}

Vezi si

Referințe

linkuri externe