Estoy envolviendo una biblioteca compartida (escrita en C) con Java usando JNA. La biblioteca compartida está escrita internamente, pero esa biblioteca utiliza funciones de otra biblioteca externa, que de nuevo depende de otra biblioteca externa. Así que la situación es algo como esto:Java: cargar bibliotecas compartidas con dependencias
ext1 < - ext2 < - interno
es decir, el interno usa la biblioteca externa ext2 que nuevamente usa la biblioteca externa ext1. Lo que he intentado es:
System.loadLibrary("ext1");
System.loadLibrary("ext2");
NativeLIbrary.loadLibrary("internal",xxx.class);
Este enfoque falla con "UnresolvedException" al cargar la biblioteca "ext2"; el enlazador se queja de símbolos que de hecho están presentes en la biblioteca "ext1". Entonces, ¿cree que la función System.loadLibrary() no hace que los símbolos de "ext1" estén disponibles globalmente? Cuando se utiliza el dlopen función stdlib() como:
handle = dlopen(lib_name , RTLD_GLOBAL);
Todos los símbolos que se encuentra en @lib_name estará disponible para la resolución de símbolo en cargas posteriores; Supongo que lo que me gustaría es algo similar para la variedad java System.loadLibrary()?
Saludos - Joakim Hove
es el camino a las bibliotecas definidas en la propiedad 'java.library.path' Java? –
Bueno, ubicar las bibliotecas es en realidad otra queja, y he recurrido al uso de System.load (full_path_to_shared_library), pero ese problema creo que es principalmente un problema de netbeans. La excepción al cargar la biblioteca "ext" es durante la fase de resolución del símbolo, es decir, la biblioteca se ha ubicado correctamente, y así sucesivamente. Creo/temo que esto está relacionado con el indicador RTLD_GLOBAL (o la falta de él) en la llamada de bajo nivel dlopen() en el fondo en el tiempo de ejecución. – user422005