Java Native Access ( JNA ) es una biblioteca desarrollada por la comunidad que proporciona a los programas Java un fácil acceso a las bibliotecas compartidas nativas sin utilizar la interfaz nativa de Java (JNI). El diseño de JNA tiene como objetivo proporcionar acceso nativo de forma natural con un mínimo de esfuerzo. A diferencia de JNI, no se requiere un código repetitivo ni un código de pegamento generado .
Autor (es) original (es) | Todd Fast, Timothy Wall, Liang Chen |
---|---|
Versión inicial | 9 de mayo de 2007 |
Lanzamiento estable | 5.8.0 / 22 de marzo de 2021 [1] |
Repositorio | |
Escrito en | C y Java |
Sistema operativo | Windows, macOS, Android, AIX, FreeBSD, GNU / Linux , OpenBSD, Solaris, Windows Mobile |
Plataforma | Java 1.4 o posterior (para JNA 3.5.2 o anterior), Java 1.6 para JNA 4.0.0 y posterior |
Tamaño | 1,83 MB (archivado) |
Tipo | Biblioteca de software |
Licencia | LGPL versión 2.1 o posterior y (a partir de la versión 4.0) la licencia de software Apache, versión 2.0 |
Sitio web | github |
Arquitectura
La biblioteca JNA utiliza una pequeña biblioteca nativa llamada biblioteca de interfaz de función externa ( libffi ) para invocar dinámicamente el código nativo . La biblioteca JNA usa funciones nativas que permiten que el código cargue una biblioteca por nombre y recupere un puntero a una función dentro de esa biblioteca, y usa la biblioteca libffi para invocarla, todo sin enlaces estáticos , archivos de encabezado o cualquier fase de compilación. El desarrollador utiliza una interfaz Java para describir funciones y estructuras en la biblioteca nativa de destino. Esto hace que sea bastante fácil aprovechar las características de la plataforma nativa sin incurrir en la alta sobrecarga de desarrollo de configurar y compilar código JNI .
JNA está construido y probado en macOS , Microsoft Windows , FreeBSD / OpenBSD , Solaris , GNU con Linux , AIX , Windows Mobile y Android . También es posible modificar y recompilar las configuraciones de compilación nativas para que funcione en la mayoría de las otras plataformas que ejecutan Java.
Tipos de mapeo
La siguiente tabla muestra una descripción general del mapeo de tipos entre Java y código nativo y el soporte de la biblioteca JNA. [2]
Tipo nativo | Tamaño | Tipo de Java | Tipos comunes de Windows |
---|---|---|---|
carbonizarse | Entero de 8 bits | byte | BYTE, TCHAR |
corto | Entero de 16 bits | corto | PALABRA |
wchar_t | Carácter de 16/32 bits | carbonizarse | TCHAR |
En t | Entero de 32 bits | En t | DWORD |
En t | valor booleano | booleano | BOOL |
largo | Entero de 32/64 bits | NativoLong | LARGO |
largo largo | Entero de 64 bits | largo | __int64 |
flotador | FP de 32 bits | flotador | |
doble | FP de 64 bits | doble | |
char * | cuerda C | Cuerda | LPCSTR |
vacío* | puntero | Puntero | LPVOID, MANIJA, LPXXX |
Nota: El significado de TCHAR cambia entre char y wchar_t de acuerdo con algunas definiciones de preprocesador. Sigue LPCTSTR.
Alineación de bytes de memoria para estructuras de datos
Las bibliotecas nativas no tienen ningún tipo de alineación de bytes de memoria estandarizada. JNA utiliza de forma predeterminada una configuración específica de la plataforma del sistema operativo, que puede ser anulada por una alineación personalizada específica de la biblioteca. Si los detalles de la alineación no se proporcionan en la documentación de la biblioteca nativa, la alineación correcta debe determinarse mediante prueba y error durante la implementación del contenedor de Java.
Ejemplo
El siguiente programa carga la implementación de la biblioteca estándar local de C y la usa para llamar a la función printf .
Nota: El siguiente código es portátil y funciona igual en plataformas Windows y POSIX ( GNU + Linux / Unix / macOS ).
import com.sun.jna.Library ; import com.sun.jna.Native ; import com.sun.jna.Platform ;/ ** Ejemplo simple de declaración y uso de una biblioteca nativa. * / public class HelloWorld { interfaz pública CLibrary amplía la biblioteca { CLibrary INSTANCE = ( CLibrary ) Native . loadLibrary ( ( Platform . isWindows () ? "msvcrt" : "c" ), CLibrary . class ); void printf ( formato de cadena , objeto ... args ); } public static void main ( String [] args ) { CLibrary . INSTANCIA . printf ( "Hola, mundo \ n" ); for ( int i = 0 ; i < args . length ; i ++ ) { CLibrary . INSTANCIA . printf ( "Argumento% d:% s \ n" , i , args [ i ] ); } } }
El siguiente programa carga la biblioteca C POSIX y la usa para llamar a la función estándar mkdir .
Nota: El siguiente código es portátil y funciona igual en plataformas estándar POSIX .
import com.sun.jna.Library ; import com.sun.jna.Native ;/ ** Ejemplo simple de declaración y uso de la biblioteca nativa C POSIX. * / public class ExampleOfPOSIX { interfaz pública POSIX extiende la biblioteca { public int chmod ( String nombre de archivo , modo int ); public int chown ( String filename , int user , int group ); public int rename ( String oldpath , String newpath ); public int kill ( int pid , int señal ); enlace int público ( String oldpath , String newpath ); public int mkdir ( ruta de cadena , modo int ); public int rmdir ( ruta de cadena ); } public static void main ( String [] args ) { // Es posible cargar msvcrt para su soporte POSIX parcial en Windows ... POSIX posix = ( POSIX ) Native . loadLibrary ( "c" , clase POSIX . ); // pero aún fallará en Windows debido a que falta / tmp. posix . mkdir ( "/ tmp / newdir" , 0777 ); posix . renombrar ( "/ tmp / newdir" , "/ tmp / renamedir" ); } }
El siguiente programa carga Kernel32.dll y lo usa para llamar a las funciones Beep y Sleep .
Nota: El siguiente código solo funciona en plataformas Windows .
import com.sun.jna.Library ; import com.sun.jna.Native ;/ ** Ejemplo simple de declaración y uso de la biblioteca nativa de Windows. * / public class BeepExample { interfaz pública Kernel32 amplía la biblioteca { // FRECUENCIA se expresa en hercios y varía de 37 a 32767 // DURACIÓN se expresa en milisegundos public boolean Beep ( int FRECUENCIA , int DURACIÓN ); Sueño en vacío público ( int DURATION ); } public static void main ( String [] args ) { Kernel32 lib = ( Kernel32 ) Native . loadLibrary ( "kernel32" , clase Kernel32 . ); lib . Bip ( 698 , 500 ); lib . Sueño ( 500 ); lib . Bip ( 698 , 500 ); } }
Ver también
- JNAerator
- P / Invocar
- TRAGO
Referencias
- ^ "Versión 5.8.0" . 2021-03-22.
- ^ "Asignaciones de tipos predeterminadas" . jna.dev.java.net . Consultado el 2 de agosto de 2011 .
enlaces externos
- Página web de Java Native Access
- Java Native Access: página de descarga
- Acceso nativo de Java: lista de correo de usuarios
- Friesen, Jeff (5 de febrero de 2008). "Proyectos Java de código abierto: Java Native Access" . Tutoriales de Java de código abierto. JavaWorld . Consultado el 27 de julio de 2020 .
- Morris, Stephen B. (20 de mayo de 2009). "Proteja su inversión en código heredado con JNA" . today.java.net . Archivado desde el original el 13 de enero de 2015.
- Dasgupta, Sanjay (11 de noviembre de 2009). "Simplifique el acceso al código nativo con JNA" . today.java.net . Archivado desde el original el 15 de noviembre de 2009.
- Doubrovkine, Daniel (20 de junio de 2011). "JNA es ahora un Githubber" . code.dblock.org . Consultado el 27 de julio de 2020 .
- Kiaer, Jesper (21 de marzo de 2010). "Llamar a la C-API de Lotus Domino con JNA" . No importa.dk . Consultado el 27 de julio de 2020 .