Depuis Java 22, l' API Foreign Function and Memory est proposée comme alternative moderne standard.
libffi ( Foreign Function Interface Library ) pour invoquer dynamiquement du code natif . Grâce à des fonctions natives, le code peut charger une bibliothèque par son nom et récupérer un pointeur vers une fonction de cette bibliothèque. L'appel de cette fonction se fait ensuite via libffi , le tout sans liaison statique , sans fichier d'en-tête ni compilation. Le développeur utilise une interface Java pour décrire les fonctions et les structures de la bibliothèque native cible. Il est ainsi très facile de tirer parti des fonctionnalités natives de la plateforme sans les lourdes contraintes de développement liées à la configuration et à la compilation de code JNI .JNA est compilé et testé sur macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , Linux , AIX , Windows Mobile et Android . Il est également possible d'adapter et de recompiler les configurations de compilation natives pour le rendre compatible avec la plupart des autres plateformes exécutant Java.
Types de cartographie
Le tableau suivant présente un aperçu des correspondances entre le code Java et le code natif et prises en charge par la bibliothèque JNA.
log.js:15 (Glean.core.Upload.PingUploadManager) Ping dd94da72-e022-48a6-b06f-47b816267447 envoyé avec succès 200. `
| Type natif | Taille | Type Java | Types de Windows courants |
|---|---|---|---|
char,int8_t | Entier 8 bits | byte | BYTE,TCHAR |
short,int16_t | Entier 16 bits | short | WORD |
wchar_t,char16_t | Caractère 16/32 bits | char | TCHAR |
int,int32_t | entier 32 bits | int | DWORD |
int,bool | valeur booléenne | boolean | BOOL |
long | entier 32/64 bits | com.sun.jna.NativeLong | LONG |
long long,int64_t | entier 64 bits | long | __int64 |
float,float32_t | Facteur de puissance 32 bits | float | |
double,float64_t | Facteur de puissance 64 bits | double | |
char* | corde de do | java.lang.String | LPCSTR |
void* | Aiguille | com.sun.jna.Pointer | LPVOID, HANDLE,LPXXX |
Remarque : La signification de TCHARchange entre charet wchar_tselon certaines définitions de préprocesseur. LPCTSTRsuit.(Glean.core.Upload.PingUploadManager) Ping c7046691-561b-451e-ad68-3df489dc396d envoyé avec succès 200. log.js:15 (Glean.core.Upload.PingUploadManager) Ping dd94da72-e022-48a6-b06f-47b816267447 envoyé avec succès 200.
(Glean.core.Upload.PingUploadManager) Ping c7046691-561b-451e-ad68-3df489dc396d envoyé avec succès 200. log.js:15 (Glean.core.Upload.PingUploadManager) Ping dd94da72-e022-48a6-b06f-47b816267447 envoyé avec succès 200.
Alignement des octets en mémoire pour les structures de données
Les bibliothèques natives n'ont pas de format d'alignement mémoire standardisé. JNA utilise par défaut un paramètre spécifique à la plateforme système, qui peut être remplacé par un alignement personnalisé propre à la bibliothèque. Si les détails d'alignement ne sont pas fournis dans la documentation de la bibliothèque native, l'alignement correct devra être déterminé par tâtonnement lors de l'implémentation du wrapper Java.
Exemple
Le programme suivant charge l'implémentation locale de la bibliothèque standard C et l'utilise pour appeler la fonction printf .
Remarque : Le code suivant est portable et fonctionne de la même manière sur les plateformes Windows et POSIX ( Linux / Unix / macOS ).
Le programme suivant charge la bibliothèque C POSIX et l'utilise pour appeler la fonction standard mkdir .
Remarque : Le code suivant est portable et fonctionne de la même manière sur les plateformes conformes aux normes POSIX .
Le programme ci-dessous charge le fichier Kernel32.dll et l'utilise pour appeler les fonctions Beep et Sleep .
Remarque : Le code suivant fonctionne uniquement sur les plateformes Windows .