2010-03-29 16 views
9

Estoy intentando cargar un archivo DLL en Java con el siguiente código System.loadLibrary ("mydll");Cargando DLL en Java - Eclipse - JNI

El proyecto se coloca en D: \ development \ project \ y he colocado el dll en D :. entonces me di siguiente argumento VM en la configuración del eclipse Djava.library.path = D:/

Pero cuando corro me sale UnsatisifiedLinkerError. Después de googlear un poco, usé System.load ("D: \ mydll.dll");

pero volviendo a tener el mismo problema, ¿alguien podría ayudar?

+0

Probé mi ruta de clase con este System.getProperty código ("java.class.path") y se coloca el dll en esa ruta específica. Después de eso, recibo el error "No se pueden encontrar bibliotecas dependientes". ¿Cómo puedo verificar qué bibliotecas está pidiendo? S. Estoy usando un tercero Dll. –

Respuesta

7

Donde especifica el nombre de archivo DLL en la ruta de la biblioteca, omítalo. Además, su llamada a System.loadLibrary debería ser simplemente 'mydll'. Puedo decirle (por experiencia) que si coloca el archivo DLL en la raíz de su proyecto en Eclipse (es decir, D: \ Eclipse Workspace \ Proj), debería funcionar. Cualquier otro error de enlazador podría deberse a problemas de dependencia con la búsqueda de otras DLL. La excepción es la misma. Use algo como Dependency Walker (http://www.dependencywalker.com/) para ver si su DLL se basa en cualquier otra cosa que no esté en la ruta de la biblioteca del sistema.

Editar: UnsatisfiedLinkError: Lanzado si la Máquina Virtual de Java no puede encontrar una definición adecuada de la lengua materna de un método declarado nativa - parece que usted está utilizando una función JNI que no existe.

3

El uso de System.loadLibrary("mydll") funciona bien, también puede usar ese. Si utilizó javah y cree que con todo lo que su DLL está muy bien, hay dos possibilies:

  1. La JVM no encuentra el archivo DLL: En este caso, su ruta de bibliotecas de Java no es correcta (lo cual dudo) y probablemente debería establecerlo en . y colocar su DLL en el directorio de trabajo actual.
  2. La JVM no encuentra un archivo DLL DLL depende de: Si tiene alguna bibliotecas dependientes en el archivo DLL, que son NO buscado por la JVM, sino por el propio Windows. Y Windows no conoce el java.library.path, por lo que se verá en la variable del sistema PATH para aquellos. Si tiene la posibilidad, puede establecer la variable del sistema PATH en la ubicación de sus archivos DLL antes de iniciar la JVM y todo estará bien. O puede cargar todos sus archivos DLL utilizando la JVM como esta

    System.loadLibrary ("dll_1");
    System.loadLibrary ("dll_2");
    System.loadLibrary ("dll_3");

    donde dll_3.dll depende de dll_2.dll, que depende de dll_1.dll.

Espero que ayude.

+0

Parece, en Linux que el concepto no funciona de alguna manera, ¿alguien sabe por qué? – Zorkus

+0

Debería funcionar para mí en Linux también. ¿Qué tipo de biblioteca estás tratando de cargar? –

0

@ alee- Puede copiar y pegar los archivos dll en la carpeta system32 de sus ventanas e intentar llamar a la biblioteca a través de System.loadLibrary ("mydll") ... supongo que puede funcionar ...

4

Consulte cómo configurar correctamente las dependencias nativas here. Además, asegúrese de utilizar la JVM correcta: en mi caso, la DLL no se encontró porque era una DLL de 32 bits, pero utilicé la JVM x64.

1

Ponga su Almafa.dll en la C:/Java/jre7/lib o/bin lo siento, no puedo recordar exactamente. Después de haber hecho otra configuración necesaria, sólo decir

static{ System.LoadLibrary("Almafa"); }

en la clase, en la que desea cargar. Solo funciona en el proyecto Java, en Android como proyecto necesitas usar JNI. He publicado ahora el resultado de 3 días sin dormir :)

2

Un problema que tienes es: System.load ("D: \ mydll.dll"); debe ser System.load ("D: \\ mydll.dll"); o System.load ("D: /mydll.dll");

He tenido más éxito con System.load, pero loadlibrary está mejor diseñado para multiplataforma. Se da cuenta de la extensión para usted.

0

Dale la ruta de la biblioteca en su proyecto como ubicación de la biblioteca nativa, parece para ser resuelto.

0

Tengo mi error resuelve utilizando las siguientes:

static { 
    try { 
     System.loadLibrary("myDLL"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

En lugar de utilizar System.load("myDLL.dll")