Translate

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

domingo, 15 de noviembre de 2009

JNA

JNA es un framework que nos facilita las tareas con dll; es decir nos hace más fácil jni.
Alguien que leyo, vio, trabajo o se pregunto que es jni; debe haberse dado cuenta que es complejo. Esta complijida se ve disminuida casi a 0 con JNA.

Parece publicidad barata pero es verdad. Si te digo que con una interfaz podes usar funciones que se encuentran en una dll?

Mira, tengo la siguiente dll:

// dllParaPruba.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"


extern "C"
{
//---------------------------------------------------------------------------
double __declspec(dllexport) multiplicar(double a, double b)
{
return a * b;
}
//---------------------------------------------------------------------------
double __declspec(dllexport) sumar(double a, double b)
{
return a + b;
}

//---------------------------------------------------------------------------

double __declspec(dllexport) potencia(double a, double n)
{
double acumulador = 1;
for (int i = 0; i <>
acumulador*=a;
}

return acumulador;
}
}

Y yo desde java quiero leerla y usarla, bueno tengo que escribir la siguiente interfaz:

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

/**
*
* @author Emanuel
*/
public interface EjemploJNA extends Library {

EjemploJNA INSTANCE = (EjemploJNA)
Native.loadLibrary("dllParaPruba",
EjemploJNA.class);

double multiplicar(double a, double b);

double sumar(double a, double b);

double potencia(double a, double b);
}

Bueno ahora vamos hacer un test:

import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author Emanuel
*/
public class EjemploJNATest {

static {
System.load("pathDondeSeEncuentraMiDll\dllParaPruba.dll");
}

@Test
public void sumar(){
double resultado = EjemploJNA.INSTANCE.sumar(2.3, 4.5);
assertEquals(new Double(resultado), new Double(6.8));
}

@Test
public void multiplicar(){
double resultado = EjemploJNA.INSTANCE.multiplicar(2.3, 4.5);

assertEquals(new Double(resultado), new Double(10.35));
}

@Test
public void potencia(){
double resultado = EjemploJNA.INSTANCE.potencia(2, 4);

assertEquals(new Double(resultado), new Double(16));
}

}

Listo!!

Que lo pario dijo mendieta!!

Una cosa me queda por aclarar es que compile la dll con el compilador de borland y no me fue muy bien, explotaba (no se bien por que) use el de microsoft y no hubo problema.

El que quiera más info dejo el link: https://jna.dev.java.net/

Y para toda la gente linda que usa maven la entrada en el pom:

<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>3.2.2</version>
</dependency>

Saludos!!!