java.lang.UnsatisfiedLinkError: доступ запрещен. использование JNI

#tomcat #permissions #java-native-interface #windows-server-2008 #tesseract

#tomcat #разрешения #java-native-interface #windows-server-2008 #тессеракт

Вопрос:

Я изо всех сил пытаюсь заставить работать Java-сервлет, который использует Tesseract через проект Tess4J. При инициализации основного класса библиотеки (TessAPI) сервлет останавливается со следующим исключением:

 java.lang.UnsatisfiedLinkError: Access is denied.

    com.sun.jna.Native.open(Native Method)
    com.sun.jna.Native.open(Native.java:1759)
    com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:260)
    com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:398)
    com.sun.jna.Library$Handler.<init>(Library.java:147)
    com.sun.jna.Native.loadLibrary(Native.java:412)
    com.sun.jna.Native.loadLibrary(Native.java:391)
    net.sourceforge.tess4j.TessAPI.<clinit>(Unknown Source)
    it.sampleProj.DocumentVisualizer.startOCRConfidence(DocumentVisualizer.java:301)
    it.sampleProj.DocumentVisualizer.startRecognition(DocumentVisualizer.java:220)
    it.sampleProj.DocumentIdentifier.recognizeDocument(DocumentIdentifier.java:147)
    it.sampleProj.DocumentIdentifier.startDocumentSearch(DocumentIdentifier.java:89)
    it.sampleProj.DocumentRecognizerServlet.doPost(DocumentRecognizerServlet.java:106)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:643)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
  

Я использую 64-битный Apache Tomcat8 с 64-битным JDK 7.0.60 и Tesseract.exe и связанные с этим .64-разрядные DLL-файлы на 64-разрядном сервере Windows 2008 Server R2.
Эта ошибка звучит как проблема с разрешениями, и я не уверен в том, какая учетная запись пользователя используется Tomcat для запуска. В любом случае я уже предоставил все разрешения двум файлам .ddl, которые включены в папку lib tomcat (libtesseract302.dll и liblept168.dll )

Есть способ получить больше информации о том, какие ресурсы интересуют проблемой отказа в доступе?

Комментарии:

1. Существуют ли другие dll, от которых зависит libtesseract302.dll и liblept168.dll ? Им также потребуется настройка разрешения.

2. Может быть, да, но как я могу узнать, есть ли другие зависимые dll?

3. Я обычно использую depends .

Ответ №1:

Наконец, проблема была вызвана несоответствием 32-64 бит.

Как я уже сказал, Tomcat, JVM, Tesseract и OS были в их 64-битной версии. Но война была сгенерирована с 32-разрядной настройкой сборки. Воссоздание .война за 64-разрядную версию решает проблему для меня.

Ответ №2:

Из Javadoc:

 Thrown if the Java Virtual Machine cannot find an appropriate native-language definition of a method declared native.
  

Это ошибка, связанная с JNI. LoadLibrary пытается загрузить собственную библиотеку, и она не найдена по пути, определяемому java.library.path . Этот путь должен быть определен как системное свойство при запуске JVM. например

 -Djava.library.path=<your native library>
  

Комментарии:

1. Установка пути не должна иметь значения, библиотека найдена, и ошибка была выдана во время вызова open .

Ответ №3:

Запустите его от имени системного администратора, и он точно будет работать.