2010-03-31 20 views
6

AntecedentesCargando JNI lib en Mac OS X?

Así que estoy tratando de cargar un jnilib (específicamente JOGL) en Java en Mac OS X en tiempo de ejecución. He estado siguiendo a lo largo de las preguntas pertinentes desbordamiento de pila:

El objetivo final para mí es empaquetar los archivos JOGL específicos de la plataforma en un frasco y descomprimir en un directorio temporal y cargarlos en la puesta en marcha. Trabajé mi problema de espalda simplemente intentar cargar JOGL mediante rutas no modificables:

File f = new File("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl.jnilib"); 
    System.load(f.toString()); 
    f = new File ("/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/libjogl_awt.jnilib"); 
    System.load(f.toString()); 

consigo la siguiente excepción al intentar utilizar la API JOGL:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jogl in java.library.path 

Pero cuando especifico java.library.path por agregando la siguiente opción de JVM:

-Djava.library.path="/var/folders/+n/+nfb8NHsHiSpEh6AHMCyvE+++TI/-Tmp-/" 

Todo funciona bien.


Pregunta

¿Es posible el uso System.load (o alguna otra variante) en Mac OS X como un reemplazo para Djava.library.path que se invoca en tiempo de ejecución?

Respuesta

1

Jogl siempre intenta cargar automáticamente todas las bibliotecas dependientes. Para evitar esto, debe haber una clase NativeLibLoader donde puede llamar a disableLoading() antes de cargar las librerías a través de System.load()

+0

¡Dulce! Gracias por esto, llamar a NativeLibLoader.disableLoading() antes de cargar manualmente las bibliotecas funcionó brillantemente. – Clinton

-3

System.load(...) toma libraryName como argumento. No toma el camino a la biblioteca como argumento. JVM busca una biblioteca con un nombre especificado en la lista de rutas especificadas en -Djava.library.path;

Aquí no hay nada específico para Mac OS X. Busca las bibliotecas de la misma manera en todos los sistemas operativos.

+2

que es incorrecto en realidad, System.load() tomará el nombre completo del archivo y System.loadLibrary tomará el nombre de lib – sreejith

+0

Creo que cargar jnilib es específico de Mac (es en mi caso). Lo tengo trabajando en Linux (.so), en Mac después de la compilación jnilib no se carga. Yo uso mvn embarcadero: deploy-war -Djava.library.path =/ruta/a/jnilib. Incluso he usado System.setProperty ("mylib.systemclassloader", "false"); para que se ejecute en un entorno de servlet (deshabilita la carga automática de esa biblioteca). ¿Cuál podría ser la causa? – Pramod

2

No es necesario que proporcione el java.library.path al inicio. Se puede establecer mediante programación con

System.setProperty("java.library.path", "/var/folder/bla/foo/bar/"); 

No sé si funcionará System.load() alguna manera sin esta ruta de la biblioteca.

+1

Gracias por la sugerencia. Sin embargo, en mi experiencia, establecer 'java.library.path' en tiempo de ejecución no tuvo ningún efecto.Creo que esto puede deberse a razones similares a por qué no puede cambiar el classpath en tiempo de ejecución - http://stackoverflow.com/questions/271506/why-system-setproperty-cannot-change-the-classpath-at-run -time – Clinton

+0

Entonces es posible que haya tenido otro problema con una biblioteca dependiente. Establecer la ruta de la lib en el tiempo de ejecución funciona perfectamente bien, solía cargar mis bibliotecas así como así. –

+0

Eso no es del todo cierto, hay una manera de forzar la reinicialización del cargador de clases con el nuevo lib.path. – Zorkus