2009-11-20 23 views
5

He estado integrando módulos Java sencillos en el entorno MATLAB en Windows con cierto éxito. Recientemente me encontré con un problema con una biblioteca de terceros que intenta cargar un dll.UnsatisfiedLinkError al cargar una biblioteca desde Java en MATLAB

El cargador de clases Java lanza el UnsatisfiedLinkError cuando se intenta realizar la carga:

java.lang.UnsatisfiedLinkError: no <libname> in java.library.path 

at java.lang.ClassLoader.loadLibrary(Unknown Source) 

at java.lang.Runtime.loadLibrary0(Unknown Source) 

at java.lang.System.loadLibrary(Unknown Source) 

La excepción está informando de que mi 'libname' no se encuentra en la propiedad java.library.path. He verificado que la propiedad sí tiene la ruta correcta y que el archivo libname.dll existe en esa ruta.

He verificado java.library.path de dos maneras. En primer lugar, simplemente comprobado que el valor devuelto en la línea de comandos de MATLAB:

>> java.lang.System.getProperty('java.library.path') 

Entonces, he modificado el método de Java que se trate de imprimir ese valor justo antes de la llamada a la función de tercera parte que no:

System.out.println(System.getProperty('java.library.path')); 

Ambos confirmaron que mi valor de ruta se configuró como se esperaba.

También intenté cargar la biblioteca manualmente desde la línea de comandos y falla con los mismos resultados.

¿Esto es algo que no es posible en MATLAB, o me falta algo aquí? Desafortunadamente no soy administrador en esta máquina, así que no puedo probar el viejo truco de mover el dll a un directorio con dlls que sí funcionan.

Acepto cualquier sugerencia para probar si no hay una respuesta absoluta.

Plataforma: Windows XP MATLAB R2009a Java 1.6

+0

¿Cómo estás verificando el valor de la propiedad java.library.path? –

+0

@matt b: Agregué detalles a la publicación en respuesta a su pregunta. –

+0

¿Puedes ver qué biblioteca está intentando cargar el código de terceros (mirando la fuente)? ¿Es la misma biblioteca que se informa en UnsatisfiedLinkError? – bm212

Respuesta

4

acaba de encontrar esto en la documentación de MATLAB:

Especificación de la ruta de búsqueda para Sun Java Native Método DLL

El mecanismo que MATLAB utiliza para localizar las bibliotecas de métodos nativos que son requeridos por Java tiene cambiado MATLAB ya no usa variables de entorno del sistema para definir las rutas a estas bibliotecas.

consideraciones de compatibilidad

Si en la actualidad se basan en el PATH (para Windows) o LD_LIBRARY_PATH (para UNIX) variables de entorno para este fin, tendrá que utilizar el librarypath.txt archivo, tal como se describe a continuación, en su lugar.

Especificación de la ruta de biblioteca de Java

clases Java pueden cargar dinámicamente métodos nativos utilizando el método Java java.lang.System.loadLibrary ("LibFile"). Para que el software JVM localice el archivo de biblioteca especificado, el directorio que lo contiene debe estar en la ruta de la biblioteca de Java. Se establece esta ruta cuando se inicia el programa MATLAB JVM en el arranque, y se basa en el contenido del archivo

$ MATLAB/toolbox/local/librarypath.txt

(donde $ MATLAB se representa el directorio raíz de MATLAB por la palabra clave MATLAB matlabroot).

Puede aumentar la ruta de búsqueda de bibliotecas de métodos nativos editando el archivo librarypath.txt. Siga estas instrucciones al editar este archivo:

  • Especifique cada nuevo directorio en una línea por sí mismo.
  • Especifique solo los nombres de directorio, no los nombres de los archivos DLL. La llamada LoadLibrary lo hace por usted.
  • Para simplificar la especificación de directorios en entornos multiplataforma, puede usar cualquiera de estas macros: $ matlabroot, $ arch y $ jre_home.
+0

interesante y extraño al mismo tiempo. ¿Por qué iban a hacer algo tan extraño? – jitter

4

Conoce usted Process Monitor? (Si no, obtendrás fácilmente cómo funciona).

Descárguelo. Ejecutarlo. Simplemente habilite "Mostrar actividad del sistema de archivos" (pequeños íconos a la derecha debajo de la barra de menús), desactive los demás.

A continuación, inicie lo que haga que la biblioteca intente cargar el dll. Después de que se haya producido el UnsatisfiedLinkError, detenga la captura del evento en Process Monitor.

Ahora haga una CTRL + F y busque el nombre de la DLL que debe cargar. Compruebe la entrada (probablemente múltiple) que dice "No encontrado" o "Nombre no encontrado" en la columna de resultados y con el nombre dll en la columna de ruta.

Ahora compruebe dónde realmente se ve la dll. Tal vez agregue alguna ruta adicional o similar y, por lo tanto, no puede encontrarla.

+0

Esa es una buena sugerencia, pero desafortunadamente esta es una computadora segura: no podré instalar o ejecutar aplicaciones de terceros no aprobadas. ¿Hay alguna manera de que yo pueda lograr lo mismo al instrumentar el código (más allá de simplemente confirmar la propiedad del camino como se indica)? –

+0

¡Gran respuesta, gracias! – volni

0

¿Su biblioteca depende de otras dlls? Podría ser que el dll java se esté cargando como resultado de que su llamada a loadLibrary() requiera otros dlls. En Windows, creo que se verá en% PATH% para tratar de encontrar estos dlls.

Esto no es estrictamente una cosa java; tiene más que ver con la biblioteca nativa que está cargando. Se le dice a Java dónde encontrar el dll a través de java.library.path (o cualquier otro mecanismo que use Matlab), y libname.dll usará% PATH% para encontrar los dlls de los que dependa.

Como dices que el dll que falta está en tu java.library.path, ¿quizás podrías intentar agregar el valor de java.library.path a% PATH% y volver a intentarlo?

1

Ponga el DLL que intenta cargar utilizando java.lang.System.loadLibrary en el siguiente directorio: $ matlabroot \ sys \ java \ jre \ win ?? \ jre \ bin \

+0

wow, ¡funcionó! ¿Pero por qué funciona esto al agregar java.library.path no? –

Cuestiones relacionadas