Mostrando entradas con la etiqueta c. Mostrar todas las entradas
Mostrando entradas con la etiqueta c. Mostrar todas las entradas

lunes, 12 de enero de 2009

JNA: Invocando código nativo desde Java

Para los que no lo conozcan, JNA (Java Native Access) es un proyecto del JDK-Incubator que nos proporciona un api para poder acceder a código nativo desde java. JNA Nos facilita y acelera el desarrollo al poder invocar funciones de librerías compartidas (.dll en Windows y .so en Linux) sin tener que usar JNI, ya que solamente debemos codificar en java implementando las interfaces y reglas que la api nos expone. La licencia de JNA es LGPL.

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:

Cualquier consulta sobre JNA u cualquier otra tecnología la pueden realizar en:




Soporte mejorado de C/C++ en Netbeans 6.5

- Mejoras del editor de código: Esto es lo mejorcito. Mejora el autocomplementado, mejora el resaltado de semántica y errores, identación y formateo automático, búsqueda de uso de variables locales y globales, funciones, clases, directivas de #includes, etc, refactoring de renombrado de variables y funciones.

- Mejor soporte a nivel de proyecto: Unos pocos cambios en las propiedades y configuración del proyecto, para linkear librerías dinámicas y estáticas.

- Grafo de llamados de funciones: Nos muestra una ventana con todas las llamadas a la función seleccionada.

- Ventana de Memoria: Nos muestra el contenido de las direcciones que están actualmente en uso.

- Desarrollo remoto: Esto no le he probado aún, pero promete definir host remotos y y poder realizar builds o correr proyectos desde el cliente.

-Empaquetado : Nos permite empaquetar las aplicaciones para distribuirlas en archivos tar, archivos zip, o paquetes SVR4.

Bueno, éstas son sólo las novedades en la versión 6.5, faltaron enunciar los features que se mantienen de las versiones anteriores.

Para la próxima entrada relacionada a C, estoy preparando un pequeño tutorial para explicar como preparar y configurar un ambiente de desarrollo de C/C++ con Netbeans y las tools GNU sobre Windows.