2009-12-04 17 views
11

Duplicar posible:
How to bundle a native library and a JNI library inside a JAR?Agrupación DLL nativa con jarra

necesito incluir lib nativa (jnotify pero creo que does't materia) al frasco. Quiero hacerlo con NetBeans.

He añadido Bundle-NativeCode: /lib/jnotify.dll; osname=win32 a mi archivo manifest.mf y he añadido jnotify.dll a projektHome\src\lib\ carpeta. Pero lamentablemente NetBeans está sobrepasando el archivo manifest.mf.

¿Cómo puedo solucionarlo? ¿Puedo hacer esto usando solo NetBeans? ¿Es la línea 'Bundle-NativeCode: /lib/jnotify.dll; osname=win32 correcta? También escuché que debería poner dlls hash en manifest.mf y firmar mi jar. ¿Es eso cierto?

Respuesta

6

No creo que el ejecutable de Java sea compatible con Bundle-NativeCode. Estoy bastante seguro de que es un atributo OSGi. La lista de atributos admitidos se define en el JAR File Specification.

Fuera de los marcos que lo proporcionan, no hay compatibilidad incorporada para agrupar bibliotecas nativas dentro de archivos JAR. Si recuerdo correctamente, es posible extraer el archivo a una ubicación temporal y cargarlo manualmente.

+0

Gracias por la respuesta. Creo que intentaré envolverlo en exe. Podría hacer un simple archivo de bat bat pero prefiero tener solo un archivo. Pero aún no he encontrado la herramienta adecuada. Intenté Lunch4j pero no tiene la opción de agregar libs nativos. –

+0

Incluí el archivo dll en 'user.dir' y funcionó muy bien. – Jus12

3

Me encontré con este problema al intentar conectar un evento de apagado de Windows cuando el programa se ejecuta en ese sistema operativo. La solución que terminé usando fue esencialmente McDowell's: agregar el archivo DLL al archivo jar y extraerlo a una ubicación temporal cuando se inicia el programa. Si se ajusta a su programa, puede dejar el archivo DLL en un lugar más permanente y luego consultarlo en los siguientes inicios de programas. Mi aplicación se usó en un entorno en el que los usuarios podrían eliminar intencionalmente archivos que no deberían, así que tuve que extraer el archivo DLL en cada ejecución. Sin embargo, no ha resultado en ningún golpe de importancia.

+2

¿Tiene algún fragmento de código para hacer esto? –

+0

Ver http: // stackoverflow.com/a/4691879/116509 – artbristol

6

A veces encuentro que el problema no es la forma en que Java carga las bibliotecas nativas, sino la biblioteca de terceros que necesita ese código nativo.

El problema es que las bibliotecas 3 ª Parte harán en algún momento (normalmente muy temprano en la inicialización)

System.loadLibrary("native.dll"); 

Y si no es native.dll en el lugar apropió se genera un error.

Si tiene acceso a la fuente java de la biblioteca de terceros, podría ser fácil parchar ese código y podría extraer fácilmente su dll del JAR y ejecutar System.load antes de usar la lib de terceros.

Actualización He echado un vistazo a las fuentes de JNotify. Es exactamente lo que dije:

public class JNotify_win32 
{ 
    static 
    { 
     System.loadLibrary("jnotify"); /* *** */ 
     int res = nativeInit(); 
     if (res != 0) 
     { 
      throw new RuntimeException("Error initialiing native library. (#" + res + ")"); 
     } 
    } 

*** Tomar la línea hacia fuera o rodear con try-catch, carga con System.load() y ya está.

+0

buen punto, pero creo que no es un problema en mi caso: "Para usar JNotify, necesita tener la biblioteca nativa (jnotify.dll o jnotify.so) en su java.library.path Para hacerlo, debe usar el parámetro -Djava.library.path cuando ejecute la aplicación java, por ejemplo: java -cp jnotify.jar -Djava.library.path =. " –

+0

Muchas gracias. Usted es 100% correcto. Estaba pensando en crear un murciélago y pensé que cambiar la ubicación de dll debería ser un problema. Cuando leí tu respuesta, pensé: "Verifiqué que puedo hacer todo con mi del", pero estaba revisando algo completamente diferente. Debo estar cansado. –

Cuestiones relacionadas