Veamos un ejemplo hola mundo escrito en consola por la función printf de la librería msvcrt si la plataforma es windows o la librería c en caso contrario:
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
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("Hola mundo!\n");
for (int i=0;i < args.length;i++) {
CLibrary.INSTANCE.printf(
"Argumento %d: %s\n", i, args[i]);
}
}
}
Pueden apreciar la simpleza con la que se "wrappea" la funcion printf de c. Noten que además de imprimir el clásico "hola mundo" se imprimen todos los argumentos pasados al metodo main utilizando el formateo que nos ofrece la funcion printf de c.
Esto es solo un ejemplo ilustrativo de uso, pero imaginen el potencial de facilidad que nos permite JNA al utilizar funciones de c en java comparando con el arduo trabajo que nos llevaría con JNI.
Llevo un tiempo utilizando JNA y aunque me he encontrado con un par de inconvenientes, pude dar resolución feliz a todo lo que quise "wrappear" a java desde librerías nativas. Hablo de invocar funciones pasando como parametros estructuras complejas, y parámetros por referencia para poder obtener retornos. Hasta ahora todo lo pude hacer y de forma simple. :)
Para finalizar, algunos proyectos que utilizan JNA:
- JRuby (Charles Nutter)
- Rococoa Java bindings to the Mac OS X Cocoa framework.
- Freedom for Media in Java (FMJ) (Ken Larson/Dieter Krachtus)
- gstreamer for Java (Wayne Meissner)
- Videolan JVLC Java Multimedia Library
- SVNKit pure Java Subversion client library.
- OmegaT Computer-Aided Translation, which makes use of the hunspell spell checker.
- IntelliJ IDEA (JetBrains)
- NetBeans IDE
- Drive Lego Mindstorm NXT (Emmanuel Pirsch)
- Miscellaneous contributed mappings and utilities (including Windows NT Service, Registry, and User Account libraries).
- A JavaFX Clock (Augusto Sellhorn)
- Detect User Inactivity (Olivier Chafik)
- Athena Backup (Doug Patriarche)
- USB for Java (Mario Boikov)
Cualquier consulta sobre JNA u cualquier otra tecnología la pueden realizar en: