2016-01-06 80 views
1

經過2天的搜索後,我仍然無法使用Tess4j 3.0版找到問題的解決方案:java .lang.UnsatisfiedLinkError:找不到指定的模塊。在Windows中Tess4j問題:java.lang.UnsatisfiedLinkError:在instance.doOCR(imageFile)中找不到指定的模塊

我在Windows 10 x64上編寫服務器端Spring引導應用程序。我使用本教程http://tess4j.sourceforge.net/tutorial/ 我在tess4j項目的源代碼中創建了ant test,並且此命令在我的PC中正常工作。我還安裝了VS2012的Visual C++ Redistributable和VS2013的Visual C++ Redistributable。 在我的電腦,但我錯過了dll文件,libtesseract304.dll取決於:

它可以是問題的原因是什麼?但是怎麼可能,Tess4J-3.0-src項目在我的電腦中工作正常?

我的完整的堆棧跟蹤:

java.lang.UnsatisfiedLinkError: The specified module could not be found. 

    at com.sun.jna.Native.open(Native Method) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:263) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:403) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.Library$Handler.<init>(Library.java:147) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.Native.loadLibrary(Native.java:502) ~[jna.jar:4.2.1 (b0)] 
    at com.sun.jna.Native.loadLibrary(Native.java:481) ~[jna.jar:4.2.1 (b0)] 
    at net.sourceforge.tess4j.util.LoadLibs.getTessAPIInstance(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.TessAPI.<clinit>(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.init(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source) ~[tess4j-3.0.jar:na] 
    at net.sourceforge.tess4j.Tesseract.doOCR(Unknown Source) ~[tess4j-3.0.jar:na] 
    at ocr.OCRController.handleFileUpload(OCRController.java:109) ~[classes/:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_51] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_51] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51] 

我的代碼:

ITesseract instance = new Tesseract(); // JNA Interface Mapping 

instance.setDatapath(new File(datapath).getPath()); 
instance.setLanguage("eng");  
try { 
    String result = instance.doOCR(imageFile); //error here 
} catch (TesseractException e) { 
    System.err.println(e.getMessage()); 
} 

行家:

<dependency> 
    <groupId>jai_imageio</groupId> 
    <artifactId>com.jai_imageio</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/jai_imageio.jar</systemPath> 
</dependency> 
<dependency> 
    <groupId>commons-io-2.4</groupId> 
    <artifactId>com.commons-io-2.4</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/commons-io-2.4.jar</systemPath> 
</dependency> 
<dependency> 
    <groupId>jna</groupId> 
    <artifactId>com.jna</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/jna.jar</systemPath> 
</dependency> 
<dependency> 
    <groupId>tess4j-3.0</groupId> 
    <artifactId>com.tess4j-3.0</artifactId> 
    <version>3.0</version> 
    <scope>system</scope> 
    <systemPath>${project.basedir}/lib/tess4j-3.0.jar</systemPath> 
</dependency> 

我也試圖加載庫生效方式:

Runtime.getRuntime().loadLibrary("lib/win32-x86-64/gsdll64"); 
Runtime.getRuntime().loadLibrary("lib/win32-x86-64/libtesseract304"); 

但沒有成功:

There was an unexpected error (type=Internal Server Error, status=500). 
C:\Users\Iuliia\IdeaProjects\ENumbersBackend\lib\win32-x86-64\libtesseract304.dll: Can't find dependent libraries 

感謝您的幫助!

+1

您錯過了依賴庫。確保所有相關的庫位於PATH或與JNA加載的庫相同的目錄中。您可以使用[depend.exe](http://dependencywalker.com)來確定完整的依賴關係。 – technomage

+0

@ technomage,是的,我知道關於錯過的庫,但我如何快速修復所有這些,順便說一下,我已經安裝了VS2012的Visual C++可再發行組件和VS2013的Visual C++可再發行組件。 –

+2

您可以使用'-Djna.debug_load'將JNA打印到控制檯的所有搜索主DLL的位置以及它最終加載的位置。 – technomage

回答

0

問題是不是與Windows 10

連接我已經與添加

<dependency> 
    <groupId>net.sourceforge.tess4j</groupId> 
    <artifactId>tess4j</artifactId> 
    <version>3.0.0</version> 
</dependency> 

,而不是以前的所有Maven依賴修復錯誤。

2

我想你是我們誤導了depend.exe的輸出。

的DLL只導入這些DLL文件:

dumpbin libtesseract304.dll /imports|find ".dll" 
Dump of file libtesseract304.dll 
    WS2_32.dll 
    liblept171.dll 
    MSVCP120.dll 
    MSVCR120.dll 
    KERNEL32.dll 

要雙檢,你可以得到用於編譯該DLL鏈接器版本:

dumpbin libtesseract304.dll /headers | find "linker version" 
      12.00 linker version 

因此,所有你需要的是Visual Studio 2013運行時(再次:不要被誤導:12.0是2013,這可能會讓人困惑)

推測liblept171.dll是缺少的東西,所以你應該檢查它的存儲位置以及爲什麼一個項目能夠找到它而不是另一個。一個好的想法是所有依賴複製到一個共同的路徑和設置的java.library.path到該目錄(只是爲了測試目的)

liblept171.dlllept4j部分,有一個相應的在你的lib目錄下的.jar命名其包含DLL:

7z l lib\lept4j-1.0.1.jar | find ".dll" 
2015-11-14 11:46:04 .....  2406400  2406400 win32-x86-64\liblept171.dll 
2015-11-14 11:46:04 .....  1834496  1834496 win32-x86\liblept171.dll 

另外,你應該照顧你的JRE的位數,在Visual Studio Runtime和正方體做匹配。如有疑問,請安裝x86和x64。

作爲進一步的故障排除幫助,您可能需要了解dll的搜索位置。使用procmon.exe與該DLL的過濾器。

相關問題