2008-08-07 11 views
13

Ejemplo: Tengo dos objetos compartidos (lo mismo debería aplicarse a .dlls). El primer objeto compartido es de una biblioteca de terceros, lo llamaremos libA.so. Envolví algo de esto con JNI y creé mi propia biblioteca, libB.so. Ahora libB depende de libA.¿Cómo puedo Java iniciar varias bibliotecas nativas dependientes?

Cuando se inicia web, ambas bibliotecas son lugares en algún área de trabajo de webstart. Mi código java intenta cargar libB. En este punto, el cargador del sistema intentará cargar libA que no está en la ruta de la biblioteca del sistema (java.library.path no lo ayudará). El resultado final es que libB tiene un enlace insatisfecho y no se puede usar.

He intentado cargar libA antes de libB, pero eso todavía no funciona. Parece que el SO quiere hacer esa carga por mí. ¿Hay alguna forma en que pueda hacer que este trabajo sea diferente de la compilación estática?

Respuesta

2

La compilación estática demostró ser la única forma de iniciar varias bibliotecas nativas dependientes.

5

No estoy seguro de si esto sería manejado exactamente de la misma manera para webstart, pero nos encontramos con esta situación en una aplicación de escritorio al tratar con un conjunto de bibliotecas nativas (dlls en nuestro caso).

Cargando libA antes de que libB funcione, a menos que una de esas bibliotecas tenga una dependencia no contabilizada y no en la ruta. Según tengo entendido, una vez que llega a un sistema loadLibrary call (es decir, Java ha encontrado la biblioteca en java.library.path y ahora le está diciendo al sistema operativo que la cargue), depende completamente del sistema operativo para encontrar las bibliotecas dependientes. , porque en ese momento es el sistema operativo el que está cargando la biblioteca para el proceso, y el sistema operativo solo sabe cómo buscar en la ruta del sistema. Parece difícil de establecer en el caso de una aplicación Webstart, pero hay una forma de evitar esto que no involucra la compilación estática. Puede barajar dónde están sus bibliotecas. No estoy seguro

Si utiliza un cargador de clases personalizado, puede anular loadLibrary y findLibrary para que pueda ubicar las bibliotecas desde un contenedor en su classpath, y si también hazlo consciente de las dependencias de tu biblioteca nativa (es decir, libB depende de libA depende de libX, luego cuando cargues libB puedes atraparte y asegurarte de cargar libA primero, y de verificar ese aviso y cargar libX primero. Entonces el SO no intenta encontrar una biblioteca que no esté en su camino. Es complicado y un poco doloroso, pero asegurarse de que Java los encuentre y los cargue en el orden correcto puede funcionar.

+1

Los cargadores de clases no pueden solucionar el problema ya que el sistema operativo resuelve las dependencias nativas. – basszero

0

Son ambas bibliotecas nativas empaquetadas en un jar que está en la lista como

<nativelib ...> 

¿En el archivo JNLP?

Cuestiones relacionadas