nativos metodos ejemplo java jni java-web-start nativelibrary

ejemplo - metodos nativos en java



¿Cómo puedo Java iniciar varias bibliotecas nativas dependientes? (3)

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.

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?


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

Cargar 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. Es posible que pueda barajar dónde están sus bibliotecas. No estoy seguro

Si utiliza un cargador de clases personalizado, puede reemplazar loadLibrary y findLibrary para que pueda ubicar sus bibliotecas desde un jar en su classpath, y si también conoce las dependencias de su biblioteca nativa (es decir, libB depende de libA depende de libX, luego, cuando cargue libB, puede atraparlo y asegurarse de cargar primero libA, y de verificar ese aviso y cargar libX primero. Luego, el sistema operativo no intenta encontrar una biblioteca que no esté en su camino. Es complicado y un poco doloroso , pero garantizar que Java los encuentre y los cargue en el orden correcto puede funcionar.


¿Ambas bibliotecas nativas están empaquetadas en un contenedor firmado que figura como

<nativelib ...>

En el archivo JNLP?


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