He estado trabajando en este mismo problema durante dos días, pero finalmente encontré la respuesta. Primero creé un directorio para bibliotecas y establecí la variable de entorno PATH en ese directorio. Aunque no me gusta obstruir mi camino, ahora le doy lo que encontré al http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/. Mi interpretación sigue
package yourpackage;
import java.io.File;
import java.lang.reflect.Field ;
public class YourClass {
public native void print() ;
static
{
String mPath = new File (".").getAbsolutePath() ;
String langKey = "java.library.path" ;
System.setProperty (langKey, mPath) ;
// Tested both with and without the following, and worked either way.
/* try
{
Field fieldSysPath = ClassLoader.class.getDeclaredField("sys_paths");
fieldSysPath.setAccessible(true);
fieldSysPath.set(null, null);
}
catch (NoSuchFieldException e)
{
System.err.println ("Unable to reset system path field: \n" + e + '\n') ;
}
catch (IllegalAccessException e)
{
System.err.println ("Unable to access system path after reset: \n"
+ e + '\n') ;
} */
try
{
System.loadLibrary ("YourLibrary") ;
}
catch (UnsatisfiedLinkError e)
{
System.err.println ("Native code library failed to load.\n" + e) ;
System.exit (1) ;
}
}
public static void main (String[] args)
{
YourClass yc = new YourClass() ;
yc.print();
}
}
Para el código anterior el archivo DLL tiene que estar en la misma carpeta que el .java. Si está ejecutando desde la línea de comandos, recuerde que llama desde el mismo directorio para javac, y el directorio del paquete raíz para llamar a Java. Así, para el .java ser C: \ workspace \ yourpackage \ YourClass.java, se llama desde la línea de comandos:
cd "C:\workspace"
java yourpackage.YourClass
Se podría considerar el uso de System.load(). Toma una ruta completamente calificada e ignora todas las variables ambientales. Es solo: 'System.load (" C: \\ Archivos de programa \\ Mi gran programa \\ libs \\ psjw.dll ");' Tenga en cuenta que puede crear la cadena con la ruta en tiempo de ejecución, por lo puede consultar primero para cosas como el directorio del usuario, el directorio donde está instalado su programa, etc. Esto podría ser preferible a loadLibrary(), ya que nunca se sabe si algo en la lista de lugares que busca ya tiene el nombre "psjw".dll, "que podría terminar cargando una biblioteca que no sabías que estaba allí. –
Gracias por ese comentario, realmente bueno para descubrir la causa raíz de un problema con una biblioteca –