Foro sobre Java SE > Llamar a vb.net dll
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...
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);
}
}
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
Prueba así:
System.load("c:\windows\system32\suma.dll");
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
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");
el load funciona bien (si quito lo demas ok), el problema es cuando llamas al procedimiento
Prueba a declarar el método nativo así:
private native Integer suma(Integer i, Integer z);
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
¿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.
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.
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.
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)
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
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