Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Llamar a vb.net dll

Hola, Buenas una duda.
LLevo un par de días haciendo pruebas y no consigo que me funcione.
He hecho una dll de prueba en vb.net (clásica prueba con una funcion que recibe 2 numeros y los suma).
No consigo que me funcione ni con jna ni con jni, siguiendo los ejemplos que hay por internet. (me dan error: java.lang.UnsatisfiedLinkError: Error looking up function 'suma': No se encontró el proceso especificado.
)
Lo que he observado es que en esos ejemplos de internet las dlls las realizan con c# y no con vb.net
Mi duda es :Puedo hacer mi dll con vb.net y depues llamarlo desde java.
Un Saludo

agosto 26, 2014 | Unregistered CommenterFozzy

A Java le da igual en qué lenguaje estén escritas las dll, el problema es siempre el mismo: encontrarlas.

Podrías publicar el código que estés utilizando, si usas un IDE y cuál, dónde está la dll...

agosto 26, 2014 | Registered Commenterchoces

Hola, para la dll de vb.net utilizo visual studio 2008.
El codigo (es el siguiente):
-------------------------------------------------------------------------------------------
Public Class Sum
Public Shared Function suma(ByVal i As Integer, ByVal z As Integer) As Integer
Return i + z
End Function
End Class
-------------------------------------------------------------------------------------------------------------
Una vez complilado el dll(suma.dll), está en c:\windows\system32

El código de java (utilizo netbeans, y la libreria de jna esta añadida.):
--------------------------------------------------------------------------------------------
package plib;
import com.sun.jna.*;

public class Plib {


public interface Sum extends Library {
int suma(int i, int z);
}


public static void main(String args[]){
int num;

Sum lib = (Sum) Native.loadLibrary("Suma", Sum.class);
num=lib.suma(3, 7);

}

}

agosto 26, 2014 | Unregistered CommenterFozzy

y el error que se me olvidaba:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function 'suma': No se encontró el proceso especificado.

at com.sun.jna.Function.(Function.java:208)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:536)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:513)
at com.sun.jna.NativeLibrary.getFunction(NativeLibrary.java:499)
at com.sun.jna.Library$Handler.invoke(Library.java:199)
at com.sun.proxy.$Proxy0.suma(Unknown Source)
at plib.Plib.main(Plib.java:25)
Java Result: 1

agosto 26, 2014 | Unregistered CommenterFozzy

Prueba así:

System.load("c:\windows\system32\suma.dll");

agosto 26, 2014 | Registered Commenterchoces

Nopp.
Ya habia probado algo parecido.
-------------------------------------------------------------
public class Test {
native int suma(int i, int z);
static {
System.load("c:\\windows\\system32\\suma.dll");
}
public static void main(String[] args) {
int num;
// ... makes an instance of this class...
try{
Test t = new Test();
// ... and invokes the native method through JNI.
num=t.suma(3,7);
System.out.println(num);
}catch (Exception e){
e.printStackTrace();
}
}
}

error:Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.suma(II)I
at Test.suma(Native Method)
at Test.main(Test.java:27)
Java Result: 1

agosto 26, 2014 | Unregistered CommenterFozzy

Si ejecuto este código:

public class NewMain {

public static void main(String[] args) {
System.load("C:\\Program Files\\Java\\jre1.8.0_20\\bin\\awt.dll");
}

}

No me lanza la excepción UnsatisfiedLinkError.

http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#load(java.lang.String)

UnsatisfiedLinkError - if the file does not exist.

http://docs.oracle.com/javase/7/docs/api/java/lang/UnsatisfiedLinkError.html

Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native.

Lo primero es saber si se lanza en cuanto se ejecuta el método load, sin más código.
Debería ser así (en el anterior mensaje se me olvidaron las dobles \\, porque suelo usar siempre /)

System.load("c:\\windows\\system32\\suma.dll");

agosto 26, 2014 | Registered Commenterchoces

el load funciona bien (si quito lo demas ok), el problema es cuando llamas al procedimiento

agosto 26, 2014 | Unregistered CommenterFozzy

Prueba a declarar el método nativo así:

private native Integer suma(Integer i, Integer z);

agosto 26, 2014 | Registered Commenterchoces

private native Integer suma(Integer i, Integer z);
salia este error:
Exception in thread "main" java.lang.UnsatisfiedLinkError:Test.suma(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;

lo he cambiado por:
private native int suma(int i, int z);
ahora sale error:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.suma(II)I

agosto 26, 2014 | Unregistered CommenterFozzy

¿Son tanto la compilación de ese dll como la VM ambas de 32 o de 64 bits?
Si se mezclan binarios de 32 con 64 bits podría también lanzarse esa excepción.

agosto 26, 2014 | Registered Commenterchoces

Hola
Pues la de dll de vb.net cuando la compilo en las opciones avanzadas del compilador le pongo anycpu(no se si es la de 32 o 64).
Y la parte de java la compilo directamente no sé si es 32 o 64.

Oye y si lo conseguimos solucionar o no , gracias por la ayuda.

agosto 26, 2014 | Unregistered CommenterFozzy

El compilador de Java no crea binarios de 32 o de 64 bits. Es la máquina virtual de Java la que puede ser de 32 o de 64 bits.

Estoy empezando a sospechar que ese puede ser el problema: que no coinciden, en longitud de palabra, la compilación de la dll con la máquina virtual.
Asegúrate de que o ambas son de 32 o de 64 bits.

agosto 26, 2014 | Registered Commenterchoces

C:\WINDOWS\system32>java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

agosto 26, 2014 | Registered Commenterchoces

Tampoco es eso.
JVM 32 bits creo:
java version "1.7.0_67"
Java(TM) SE Runtime Environment (build 1.7.0_67-b01)
Java HotSpot(TM) Client VM (build 24.65-b04, mixed mode,sharing)
He compilado la dll para 32 bits
Mismo error de siempre

agosto 26, 2014 | Unregistered CommenterFozzy