Saltar al contenido

¿Cómo influir en la ruta de búsqueda de System.loadLibrary () a través del código Java?

La guía paso a paso o código que verás en este artículo es la resolución más eficiente y efectiva que hallamos a tu duda o problema.

Solución:

Necesitaba cambiar la ruta dll para mis pruebas unitarias. Intenté el siguiente truco y funcionó:

System.setProperty( "java.library.path", "/path/to/libs" ); 
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );

Para una explicación, consulte el enlace original.

  1. No existe una forma aprobada de cambiar la ruta de la biblioteca para una JVM en ejecución.
  2. No puede cargar una biblioteca nativa más de una vez… y no puede descargar una biblioteca nativa para poder cargarla nuevamente: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4171986

Según sus comentarios anteriores (particularmente, el comportamiento de la biblioteca de terceros), diría que su mejor opción es obtener la ruta de la biblioteca correcta cuando inicia la JVM.

Tenga en cuenta que hay una forma engañosa de cambiar la ruta de la biblioteca (consulte https://stackoverflow.com/a/24258955/139985), pero implica una reflexión desagradable y, según se informa, no funciona para todas las versiones de Java. Ciertamente, se basa en detalles de implementación privados no documentados de ClassLoader que pudo cambiar de una versión a la siguiente.

Recientemente me encontré con este problema y usé OpenJDK donde se lanza una NullPointerException (como 0-0 mencionó la respuesta de Samil). Lo siguiente funciona en OpenJDK y debería trabajar con Oracle JDK también.

(Opción 1) Reemplazar java.library.path

System.setProperty("java.library.path", newPath);
Field field = ClassLoader.class.getDeclaredField("sys_paths");
field.setAccessible(true);
field.set(ClassLoader.getSystemClassLoader(), new String[]newPath);

(Opción 2) Agregar a java.library.path existente

String libPath = System.getProperty("java.library.path");
String newPath;

if (libPath == null || libPath.isEmpty()) 
    newPath = path;
 else 
    newPath = path + File.pathSeparator + libPath;


System.setProperty("java.library.path", newPath);

Field field = ClassLoader.class.getDeclaredField("sys_paths");
field.setAccessible(true);

// Create override for sys_paths
ClassLoader classLoader = ClassLoader.getSystemClassLoader(); 
List newSysPaths = new ArrayList<>();
newSysPaths.add(path);  
newSysPaths.addAll(Arrays.asList((String[])field.get(classLoader)));

field.set(classLoader, newSysPaths.toArray(new String[newSysPaths.size()]));

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *