Pregunta

He escrito algunos enlaces JNI en una biblioteca C ++ y he creado algunos archivos DLL para mi proyecto de servidor java. Digamos que la DLL y los archivos jar están en la misma carpeta debajo de "C: / server"

Estoy accediendo a estos archivos DLL usando:

System.loadLibrary("someDLLFile");

en la clase que necesita el código C ++.

El problema con el que me encuentro es que cuando ejecuto este servidor en mi propia máquina, todo funciona bien, independientemente de dónde coloque el "servidor". carpeta. Pero cuando se lo doy a un colega para que lo pruebe, continuamente obtienen:

java.lang.UnsatisfiedLinkError no someDLLFile in java.library.path

Quiero que los archivos DLL vivan en la misma carpeta que los archivos jar y preferiría que alguien no configure su variable PATH.

¿Por qué System.loadLibrary () funciona en mi propia máquina, independientemente de la ubicación de la carpeta, pero no en otra computadora?

¿Fue útil?

Solución

Funciona porque la DLL (o una DLL de la que depende, es decir, msvcr90.dll o algo así) está en la RUTA de su máquina, pero no en la otra.

Establezca PATH env-var o la propiedad java.library.path para contener el directorio con su archivo, o almacene su dll donde java lo encuentre por defecto (muchas opciones aquí, dependiendo de la estrategia de implementación y la plataforma).

Otros consejos

Una opción es especificar el directorio en la línea de comando cuando inicia la VM:

java -classpath C:\server -Djava.library.path=C:\server somePackage.Main

Otra opción es usar System.load en lugar de System.loadLibrary .

URL url = Test.class.getResource("someDLLFile.dll");
String f = new File(url.getFile()).getAbsolutePath();
System.load(f);

La desventaja es que su programa ahora trata con nombres de directorios, extensiones de archivo, etc., dependientes de la plataforma

No estoy seguro de si esto es útil o no, pero he incluido lo siguiente en algunos proyectos:

http://forums.sun.com/thread.jspa?threadID=707176

Para cargar bibliotecas nativas.

Y luego acabo de cargar el directorio bin

    String binPath = new File(".").getAbsolutePath() 
                     + System.getProperty("file.separator") + "bin";

   addDir( binPath );

Funciona bastante bien.

Pero de nuevo, no estoy seguro de si este es el caso o no.

Intente descargar depe.exe para ver si la dll depende de otras dlls en el sistema o no. Si lo hace, verifique la otra máquina, si tales dlls están presentes o no en Path.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top