java dll jni web-applications

java.lang.UnsatisfiedLinkError no*****. dll en java.library.path



jni web-applications (11)

Cambiar la variable ''java.library.path'' en el tiempo de ejecución no es suficiente porque JVM solo la lee una vez. Tienes que restablecerlo como:

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

Por favor, tome un botín en: Cambiando la ruta de la biblioteca Java en Runtime .

¿Cómo puedo cargar un archivo dll personalizado en mi aplicación web? Intenté seguir formas pero está fallando.

  • copió todos los archivos DLL requeridos en la carpeta system32 e intentó cargar uno de ellos en el constructor Servlet System.loadLibrary
  • Se tomcat_home/shared/lib dlls requeridos en tomcat_home/shared/lib y tomcat_home/common/lib
  • todos estos dlls están en WEB-INF/lib de la aplicación web

En el caso donde el problema es que System.loadLibrary no puede encontrar la DLL en cuestión, un error común (reforzado por el mensaje de error de Java) es que la propiedad del sistema java.library.path es la respuesta. Si configura la propiedad del sistema java.library.path en el directorio donde está ubicada su DLL, entonces System.loadLibrary efectivamente encontrará su DLL. Sin embargo, si su DLL a su vez depende de otras DLL, como suele ser el caso, entonces java.library.path no puede ayudar, porque la carga de las DLL dependientes es administrada completamente por el sistema operativo, que no sabe nada de java.library. camino. Por lo tanto, casi siempre es mejor omitir java.library.path y simplemente agregar el directorio de su DLL a LD_LIBRARY_PATH (Linux), DYLD_LIBRARY_PATH (MacOS) o Path (Windows) antes de iniciar la JVM.

(Nota: estoy usando el término "DLL" en el sentido genérico de DLL o biblioteca compartida).


Estoy usando Mac OS X Yosemite y Netbeans 8.02, tengo el mismo error y la solución simple que he encontrado es como la anterior, esto es útil cuando necesitas incluir una biblioteca nativa en el proyecto. Lo mismo ocurre con Netbeans:

1.- Right click on the Project 2.- Properties 3.- Click on RUN 4.- VM Options: java -Djava.library.path="your_path" 5.- for example in my case: java -Djava.library.path=</Users/Lexynux/NetBeansProjects/NAO/libs> 6.- Ok

Espero que pueda ser útil para alguien. El enlace donde encontré la solución está aquí: java.library.path - Qué es y cómo usarlo


La respuesta original de Adam Batkin lo llevará a una solución, pero si vuelve a implementar su aplicación web (sin reiniciar su contenedor web), debería encontrarse con el siguiente error:

java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715) at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646) at java.lang.Runtime.load0(Runtime.java:787) at java.lang.System.load(System.java:1022)

Esto sucede porque el ClassLoader que originalmente cargó su DLL aún hace referencia a este archivo DLL. Sin embargo, su aplicación web ahora se está ejecutando con un nuevo ClassLoader, y dado que se está ejecutando la misma JVM y una JVM no permitirá 2 referencias a la misma DLL, no puede volver a cargarla . Por lo tanto, su aplicación web no puede acceder a la DLL existente y no puede cargar una nueva. Entonces ... estás atrapado.

La documentación de ClassLoader de Tomcat describe por qué su webapp recargada se ejecuta en un nuevo ClassLoader aislado y cómo puede evitar esta limitación (en un nivel muy alto).

La solución es extender un poco la solución de Adam Batkin:

package awesome; public class Foo { static { System.loadLibrary(''foo''); } // required to work with JDK 6 and JDK 7 public static void main(String[] args) { } }

A continuación, coloca un contenedor que contiene JUST esta clase compilada en la carpeta TOMCAT_HOME / lib.

Ahora, dentro de su aplicación web, solo tiene que forzar a Tomcat a hacer referencia a esta clase, lo que se puede hacer de la siguiente manera:

Class.forName("awesome.Foo");

Ahora su archivo DLL debe cargarse en el cargador de clases común, y puede ser referenciado desde su aplicación web incluso después de su redistribución.

¿Tener sentido?

Se puede encontrar una copia de referencia de trabajo en google code, static-dll-bootstrapper .


Para Windows encontré que cuando cargué los filetes (llamadas a jd2xsx.dll y ftd2xx.dll) en la carpeta windowws / system32, esto resolvió los problemas. Luego tuve un problema con mi fd2xx.dll más reciente que tiene que ver con los parámetros, por lo que tuve que cargar la versión anterior de este dll. Voy a tener que ferrit esto más tarde.

Nota: jd2xsx.dll llama a ftd2xx.dll, por lo que la configuración de jd2xx.dll podría no funcionar.


Para aquellos que buscan java.lang.UnsatisfiedLinkError: no pdf_java in java.library.path

Me enfrentaba a la misma excepción; Intenté todo y las cosas importantes para que funcione son:

  1. Versión correcta de pdf lib.jar (En mi caso, el jar de la versión incorrecta se mantuvo en el tiempo de ejecución del servidor)
  2. Cree una carpeta y conserve el archivo jar pdflib y agregue la carpeta en su variable PATH

Funcionó con Tomcat 6.


Para que System.loadLibrary() funcione, la biblioteca (en Windows, una DLL) debe estar en un directorio en alguna parte de su PATH o en una ruta de acceso listada en la propiedad del sistema java.library.path (para que pueda iniciar Java como java -Djava.library.path=/path/to/dir ).

Además, para loadLibrary() , especifique el nombre base de la biblioteca, sin el .dll al final. Entonces, para /path/to/something.dll , simplemente usaría System.loadLibrary("something") .

También necesita ver el UnsatisfiedLinkError exacto que está obteniendo. Si dice algo como:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path

entonces no puede encontrar la biblioteca foo (foo.dll) en su PATH o java.library.path . Si dice algo como:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V

entonces algo está mal con la biblioteca misma en el sentido de que Java no puede asignar una función nativa de Java en su aplicación a su contraparte nativa real.

Para empezar, pondría algo de registro en su llamada a System.loadLibrary() para ver si se ejecuta correctamente. Si arroja una excepción o no está en una ruta de código que realmente se ejecuta, siempre obtendrá el último tipo de UnsatisfiedLinkError explicado anteriormente.

Como nota al margen, la mayoría de las personas coloca sus llamadas loadLibrary() en un bloque de inicializador estático en la clase con los métodos nativos, para garantizar que siempre se ejecute exactamente una vez:

class Foo { static { System.loadLibrary(''foo''); } public Foo() { } }


Pobre de mí ! Pasé todo un día detrás de esto. Escríbelo aquí si algún cuerpo replica este problema.

Estaba tratando de cargar como sugirió Adam, pero luego me atraparon con la excepción AMD64 vs IA 32. Si en cualquier caso después de trabajar según el tutorial de Adam (sin duda la mejor elección), intenta tener una versión de 64 bits de la última jre. Asegúrate. su JRE Y JDK tienen 64 bits y lo ha agregado correctamente a su classpath.

Mi ejemplo de trabajo va aquí: unstatisfied link error


Puede usar System.load() para proporcionar una ruta absoluta que es lo que desea, en lugar de un archivo en la carpeta de biblioteca estándar para el sistema operativo respectivo.

Si quiere aplicaciones nativas que ya existen, use System.loadLibrary(String filename) . Si quieres proporcionar el tuyo, probablemente seas mejor con load ().

También debería poder usar loadLibrary con java.library.path establecido correctamente. Consulte ClassLoader.java para ver el origen de la implementación que muestra las dos rutas que se están verificando (OpenJDK)


Si necesita cargar un archivo relacionado con algún directorio donde ya se encuentre (como en el directorio actual), aquí hay una solución fácil:

File f; if (System.getProperty("sun.arch.data.model").equals("32")) { // 32-bit JVM f = new File("mylibfile32.so"); } else { // 64-bit JVM f = new File("mylibfile64.so"); } System.load(f.getAbsolutePath());


This is My java.library.path: java.library.path = C:/Program Files/Java/jdk1.7.0_51/bin C:/WINDOWS/Sun/Java/bin C:/WINDOWS/system32 C:/WINDOWS C:/WINDOWS/system32 C:/Program Files/I.R.I.S. SA/iDRS_15_2_for_Win64_15_2_11_1717/lib/idrskr .lib C:/Program Files/I.R.I.S. SA/iDRS_15_2_for_Win64_15_2_11_1717/bin/iDRMSG idgeDll.dll C:/Program Files/I.R.I.S. SA/iDRS_15_2_for_Win64_15_2_11_1717/bin/iDRMSG aderDll.dll C:/Program Files/Java/jdk1.7.0_51/bin C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/include C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/lib C:/WINDOWS/System32/Wbem C:/WINDOWS/System32/WindowsPowerShell/v1.0 C:/Program Files (x86)/Microsoft SQL Server/100/Tools/Binn/ C:/Program Files/Microsoft SQL Server/100/DTS/Binn Still rror comes: infile >> D:/pdf_upload/pre_idrs15_win_temporary_license_activation_tutorial.pdf outFile >> D:/pdf_upload/processed/pre_idrs15_win_temporary_license_activation_tutorial.txt Hello : This is java library path:(NICKRJ) C:/Program Files/Java/jdk1.7.0_51/bin;C:/WINDOWS/Sun/Java/bin;C:/WINDOWS/system32;C:/WINDOWS;C:/Program Files/Java/jdk1.7.0_51/jre/bin/server;C:/Program Files/Java/jdk1.7.0_51/jre/bin;C:/Program Files/Java/jdk1.7.0_51/jre/lib/amd64;C:/WINDOWS/system32;C:/Program Files/I.R.I.S. SA/iDRS_15_2_for_Win64_15_2_11_1717/lib/idrskrn15.lib;C:/Program Files/I.R.I.S. SA/iDRS_15_2_for_Win64_15_2_11_1717/bin/iDRMSGEBridgeDll.dll;C:/Program Files/I.R.I.S. SA/iDRS_15_2_for_Win64_15_2_11_1717/bin/iDRMSGEReaderDll.dll;C:/Program Files/Java/jdk1.7.0_51/bin;C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/include;C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/lib;C:/WINDOWS/System32/Wbem;C:/WINDOWS/System32/WindowsPowerShell/v1.0;C:/Program Files (x86)/Microsoft SQL Server/100/Tools/Binn/;C:/Program Files/Microsoft SQL Server/100/DTS/Binn;D:/WorkSet/New folder/eclipse_kepler/eclipse;;. Exception in thread "main" java.lang.UnsatisfiedLinkError: no iDRMSGEBridgeDll in java.library.path at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886) at java.lang.Runtime.loadLibrary0(Runtime.java:849) at java.lang.System.loadLibrary(System.java:1088) at com.bi.iDRMSGEBridgeDll.callOcr(iDRMSGEBridgeDll.java:78) at com.bi.iDRMSGEBridgeDll.main(iDRMSGEBridgeDll.java:15) Here is my Java JNI class: package com.bi; import org.omg.PortableInterceptor.SYSTEM_EXCEPTION; public class iDRMSGEBridgeDll { public native int iDRMSGEDll_Initialize(String strPropertiesFileName); public native int iDRMSGEDll_VerifyLicense(); public native int iDRMSGEDll_ConvertFile(String strSourceFileName, String srcOutputFileName, String formatType); public native int iDRMSGEDll_Finalize(); public static void main(String[] args) { //iDRMSGEBridgeDll.callOcr("bgimage.jpg","jpg","","d://","d://","4"); iDRMSGEBridgeDll.callOcr("pre_idrs15_win_temporary_license_activation_tutorial.pdf","pdf","","D://pdf_upload","D://pdf_upload//processed","4"); /* System.loadLibrary("iDRMSGEBridgeDll"); iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll(); if ( obj.iDRMSGEDll_Initialize("D://iris//iDRSGEDll.properties") != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_Initialize success."); if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_VerifyLicense success."); if (obj.iDRMSGEDll_ConvertFile("E://UI changes File_by Shakti//PDF//S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].pdf", "E://SK_Converted_Files//MVP_CONTRACTS//Southwest CFM56-7//S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1]//S14-005_FRAMEWORK_AGREEMENT_FOR_ENGINE_MAINTENANCE_SERVICES_EASYJET[1].txt", "4" ) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 1 success."); /*if (obj.iDRMSGEDll_ConvertFile("C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_200dpi.pdf", "C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_200dpi.out", 4) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 2 success."); if (obj.iDRMSGEDll_ConvertFile("C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_300dpi.pdf", "C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_300dpi.out", 4) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 3 success."); if (obj.iDRMSGEDll_ConvertFile("C://Software//iDRS_15_1_7_2304//sample_pdfs//scan2_300dpi.pdf", "C://Software//iDRS_15_1_7_2304//sample_pdfs//scan2_300dpi.out", 4) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 4 success."); obj.iDRMSGEDll_Finalize(); System.out.println("iDRMSGEDll_Finalize success."); return;*/ } public static String callOcr(String inputFile, String docType, String engineType, String filePath,String outputFolder,String type) throws RuntimeException { String message = ""; String formatType = type; String inFile = filePath +"//" +inputFile; String outFile=""; if(type.equals("4")) outFile = outputFolder +"//"+inputFile.substring(0,inputFile.lastIndexOf("."))+".txt"; else if(type.equals("6")) outFile = outputFolder +"//"+inputFile.substring(0,inputFile.lastIndexOf("."))+".rtf"; else if(type.equals("9")) outFile = outputFolder +"//"+inputFile.substring(0,inputFile.lastIndexOf("."))+".pdf"; else outFile = outputFolder +"//"+inputFile.substring(0,inputFile.lastIndexOf("."))+".csv"; System.out.println("infile >> "+inFile); System.out.println("outFile >> "+outFile); System.out.println("Hello : This is java library path:(NICKRJ) " +System.getProperty("java.library.path")); System.loadLibrary("iDRMSGEBridgeDll"); //System.load("C://Program Files (x86)//I.R.I.S. SA//iDRS_15_2_for_Win64_15_2_11_1717/bin//iDRMSGEBridgeDll.dll"); //Runtime.getRuntime().loadLibrary("iDRMSGEBridgeDll"); iDRMSGEBridgeDll obj = new iDRMSGEBridgeDll(); try { if ( obj.iDRMSGEDll_Initialize("D://IRIS//iDRSGEDll.properties") != 0 ) { obj.iDRMSGEDll_Finalize(); // return ; } System.out.println("iDRMSGEDll_Initialize success."); if ( obj.iDRMSGEDll_VerifyLicense() != 0 ) { obj.iDRMSGEDll_Finalize(); // return; } System.out.println("iDRMSGEDll_VerifyLicense success."); // formatType= JOptionPane.showInputDialog("Please input mark format type: "); if (formatType!=null && formatType.equals("4")) { obj.iDRMSGEDll_ConvertFile(inFile, outFile, "4" ); obj.iDRMSGEDll_Finalize(); // return; } else if(formatType!=null && formatType.equals("6")) { obj.iDRMSGEDll_ConvertFile(inFile, outFile, "6" ); obj.iDRMSGEDll_Finalize(); // return; } else if(formatType!=null && formatType.equals("7")) { obj.iDRMSGEDll_ConvertFile(inFile, outFile, "7" ); obj.iDRMSGEDll_Finalize(); // return; } else if(formatType!=null && formatType.equals("9")) { obj.iDRMSGEDll_ConvertFile(inFile, outFile, "9" ); obj.iDRMSGEDll_Finalize(); // return; } else { message= "iDRMSGEDll_VerifyLicense failure"; } System.out.println("iDRMSGEDll_ConvertFile 1 success."); /*if (obj.iDRMSGEDll_ConvertFile("C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_200dpi.pdf", "C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_200dpi.out", 4) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 2 success."); if (obj.iDRMSGEDll_ConvertFile("C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_300dpi.pdf", "C://Software//iDRS_15_1_7_2304//sample_pdfs//scan1_300dpi.out", 4) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 3 success."); if (obj.iDRMSGEDll_ConvertFile("C://Software//iDRS_15_1_7_2304//sample_pdfs//scan2_300dpi.pdf", "C://Software//iDRS_15_1_7_2304//sample_pdfs//scan2_300dpi.out", 4) != 0 ) { obj.iDRMSGEDll_Finalize(); return; } System.out.println("iDRMSGEDll_ConvertFile 4 success.");*/ obj.iDRMSGEDll_Finalize(); System.out.println("iDRMSGEDll_Finalize success."); if(message.length()==0) { message = "success"; } } catch(Exception e) { e.printStackTrace(); message = e.getMessage(); } return message; } }