2010-01-17 23 views
8

Estoy usando el archivo jar Jacob en mi aplicación Java.¿Cómo se configura el archivo .dll en Java?

Este archivo jar de Jacob viene con un archivo .dll. He agregado el archivo Jacob jar a mi classpath. Pero cuando ejecuto mi aplicación un error de ejecución se produce como

"couldn't load jacob-1.15-M3-x86.dll file" 

¿Cómo puedo cargar el archivo .dll?

Editado: ========================================= ==================================

Había establecido el entorno "ruta" varaible a la dir que contiene mi archivo .dll y la carga que .dll como sigue

static { 
    System.loadLibrary("jacob-1.15-M3-x86.dll"); 
} 

pero se produjo el siguiente error

java.lang.UnsatisfiedLinkError: no jacob-1.15-M3-x86.dll in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at TemplateClass.TemplateClass.<clinit>(TemplateClass.java:14) 
+0

Actualizado mi respuesta. –

+0

colocando los dlls en la carpeta de windows system32 resolvió el problema para mí –

Respuesta

5

Ah, eso no es un error de compilación, pero un error de ejecución.

Supongo que su DLL debe estar en el PATH. No CLASSPATH, pero PATH, porque es ahí donde Windows busca DLL. Intente ampliar su RUTA para incluir la ubicación de su DLL, o hacer lo que hacen muchas otras personas: Vuelque la DLL al \Winnt\System\System32 o lo que sea que se llame al directorio del sistema en su caja. Dondequiera que estén todos los otros archivos DLL, en otras palabras.

actualización

El mensaje de error que publique, afortunadamente, está señalando el problema exacto. Puede resolverlo colocando el directorio que contiene su DLL en java.library.path Este hilo del foro de Sun muestra un buen ejemplo: http://forums.sun.com/thread.jspa?threadID=627890

En realidad, eso es mucho menos limpio de lo que debería; esta parece ser una de las áreas más "sombreadas" en Java. El hilo deambula mucho, te aconsejo leer todo el tiempo para ver algunos problemas y soluciones. Creo que podrás tener éxito con un poco de prueba y error.

+0

Sí, es un error de tiempo de ejecución. Lo escribí por error. Gracias. –

+0

¿Podría mirar la pregunta editada? –

10

El 'jacob-1.15-M3-x86.dll' necesita estar en un lugar donde su sistema operativo pueda encontrarlo. Tiene algunas opciones aquí:

  • Puede colocar el archivo .dll en el directorio desde el que inició su aplicación. Si tiene un script por lotes para iniciar su aplicación, sería ese directorio. Si está comenzando en algún tipo de servidor de aplicaciones, normalmente sería el directorio 'bin'.

  • Puede colocar el archivo .dll en algún lugar de la variable de entorno% PATH%. Es posible que sea más fácil simplemente actualizar su variable de entorno PATH para incluir el directorio que contiene su archivo .dll.

  • Otra opción es colocar su .dll en el directorio% SystemRoot% \ system32. Usualmente esto es 'C: \ Windows \ system32'. Esta opción no suele recomendarse a menos que sea una biblioteca compartida como el tiempo de ejecución de MSCVRT.

Otro posible problema que pueda tener. Si el .dll se compila como de 32 bits, entonces debe estar ejecutándose en el tiempo de ejecución de Java de 32 bits. Del mismo modo, si se trata de un .dll de 64 bits, debe ejecutarse en un JRE de 64 bits.

+0

Mi problema está resuelto. Gracias por eso. {... Puede colocar el archivo .dll en el directorio desde el que inició su aplicación} ¿Quiere decir que el directorio donde reside la clase principal? En caso afirmativo, ¿por qué el archivo debe estar en el directorio donde reside mi secuencia de comandos por lotes si utilizo la secuencia de comandos por lotes? ¿Podría explicarme su primer punto con más énfasis en el punto en el que quiero comenzar en un servidor de aplicaciones? –

+0

¿Podría mirar la pregunta editada? –

+0

Debe estar en el directorio donde inicia el proceso de Java, no en su directorio de clase principal. –

1

Debe establecer LD_LIBRARY_PATH. This le dará todos los pasos correctos a seguir.

+1

Eso está asumiendo que se está ejecutando en Linux, ¿verdad? –

+1

¡Si se ejecuta en Linux, JACOB no será muy útil! – finnw

+0

Supongo que hay un .so para Linux. Se aplican los mismos comentarios. – duffymo

3

Otras opciones:

  • establecer la propiedad java.library.path al directorio que contiene el archivo DLL. Ejemplo: java -Djava.library.path = "ruta/a/directorio/que contiene/el/dll" -jar appli.jar
  • en el código, carga el dll explícitamente, con System.load.
+0

Ambos no funcionan. –

0

Tuve el mismo problema.

Veo que la pregunta no es "respondida", así que tal vez ninguna de las opciones anteriores funcionó.

Una de mis últimas hipótesis era que el Jacob.dll falta su dependencia.

Lo que hice fue obtener depend y verificar si toda la dependencia, utilizada por Jacob, está cargada. Por supuesto, esto funciona para Windows.

¡Salud!

1

Cuando usa System.loadLibrary()no incluye .dll al final.

Además, si no está configurando java.library.path para que apunte a la carpeta que contiene el DLL, entonces el archivo DLL debe estar en el directorio desde el que inicia su aplicación Java.

Cuestiones relacionadas