Проблема Tess4j в Windows: java.lang.UnsatisfiedLinkError: указанный модуль не найден в instance.doOCR(imageFile)

После 2 дней гугления я все еще не могу найти решение моей проблемы с Tess4j версии 3.0: java.lang.UnsatisfiedLinkError: указанный модуль не найден.

Я пишу загрузочное приложение Spring на стороне сервера на своей Windows 10 x64. Я использовал этот учебник http://tess4j.sourceforge.net/tutorial/ Я делаю ant test в tess4j исходный код проекта, и эта команда нормально работает на моем ПК. У меня также установлены Visual C++ Redistributable для VS2012 и Visual C++ Redistributable для VS2013. Но я пропустил 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

Спасибо за любую помощь!


person Yuliia Ashomok    schedule 06.01.2016    source источник
comment
Вам не хватает зависимой библиотеки. Убедитесь, что все зависимые библиотеки находятся в PATH или в том же каталоге, что и библиотека, загруженная JNA. Вы можете использовать depends.exe, чтобы определить полный набор зависимостей.   -  person technomage    schedule 08.01.2016
comment
@technomage, да, я знаю о пропущенных библиотеках, но как я могу быстро все это исправить, кстати, у меня уже установлены Visual C++ Redistributable для VS2012 и Visual C++ Redistributable для VS2013.   -  person Yuliia Ashomok    schedule 09.01.2016
comment
Вы можете использовать -Djna.debug_load, чтобы заставить JNA печатать на консоли все места, где он ищет нашу основную DLL и откуда он в конечном итоге загружается.   -  person technomage    schedule 09.01.2016


Ответы (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.dll является частью lept4j, в вашем каталоге 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 и Tesseract действительно совпадали. Если сомневаетесь: установите x86 и x64.

В качестве дополнительной помощи при устранении неполадок вы можете узнать, где выполняется поиск dll. Используйте procmon.exe с фильтром для этой dll.

person Marged    schedule 09.01.2016

Проблема не связана с Windows 10.

Я уже исправил ошибку с добавлением

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

вместо этого все предыдущие зависимости maven.

person Yuliia Ashomok    schedule 29.01.2016