2010-09-27 15 views
5

Estoy usando Java para desarrollar una aplicación y tengo una biblioteca que necesito poder usar. La biblioteca tiene un archivo jar y un archivo dll. Por el momento, coloqué el archivo dll en la carpeta de mi sistema y lo vinculé con el IDE. Mi pregunta es, quiero empaquetar todo en un solo archivo ejecutable en el que el usuario puede ejecutar (tal vez usando webstart).Packaging JNI Libraries

¿Cómo se puede generar este archivo jar sin que el usuario copie el dll dentro de la carpeta del sistema? ¿Hay alguna manera de que pueda poner todo en un solo archivo?

+0

http://forums.sun.com/thread.jspa?threadID=5358593 Esto podría resolver su problema –

Respuesta

3

puede empaquetar el .dll en el .jar, pero el archivo físico .dll debe ser desempaquetado de allí antes de que pueda ser cargado por la forma en que Windows maneja .dll s. No hay forma de cargar un .dll directamente desde el interior del .jar.

This question parece contener una implementación adecuada. Sin embargo, tenga en cuenta que es un poco propenso a errores: si el programa no tiene permisos de escritura donde vaya a extraer el .dll, se encuentra en una situación extraña; no puede cargar el .dll porque no tiene permisos para escribirlo primero.

Una solución más robusta es utilizar algún tipo de instalación para instalar toda la aplicación en una jerarquía de directorios como

/whatEver/myApp/     (The working directory of the app.) 
/whatEver/myApp/myApp.jar  (The main app.) 
/whatEver/myApp/lib/library.dll (The JNI library.) 

A continuación, puede cargar la DLL simplemente utilizando una ruta relativa al directorio de trabajo,

System.loadLibrary("lib/library.dll"); 

Para ser aún más robusto, querrá asegurarse de que está ejecutando una JVM con la cantidad apropiada de bits antes de intentar cargar la biblioteca. Un hecho poco publicitado es que una VM de 64 bits no puede cargar bibliotecas de 32 bits, ni viceversa. Ver this pregunta.