2013-11-04 24 views
6

ho il seguente errore in fase di esecuzione, durante il tentativo di eseguire Tess4J:UnsatisfiedLinkError - Impossibile caricare la libreria - libreria nativa non trovato in percorso risorsa

Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libtesseract302': Native library (win32-x86-64/libtesseract302.dll) not found in resource path ([myproject/target/classes/, ...some jars...]) 

Le mie domande sono:

1) Che cosa esattamente prova a trovare e dove?

2) Perché è apparentemente la ricerca nella directory myproject/target/classes/? Non l'ho impostato da nessuna parte.

3) Perché ignora il "percorso di directory nativo" impostato su tess4j.jar nella libreria utente descripto in Eclipse? Le mie DLL ci sono. Se non avesse ignorato il percorso, avrebbe trovato le DLL.

4) Perché è apparentemente in fase di preparazione il nome della DLL con win32-x86-64/? Ho impostato questo da nessuna parte. Questo prefisso standard di alcune API?

5) Che cos'è il "percorso risorsa"? Come impostarlo?

risposta

5

Come l'errore dice, sta cercando win32-x86-64/libtesseract302.dll in java.class.path. Una parte del classpath apparentemente include myproject/target/classes.

Il prefisso rappresenta la piattaforma e l'architettura della libreria condivisa da caricare, che consente di includere librerie condivise per destinazioni diverse nello stesso archivio. Se JNA non riesce a trovare il nome della libreria richiesta nel percorso di caricamento del sistema, tenta di trovarlo all'interno del percorso della risorsa (estraendolo, se necessario). Quindi, se si inserisce la DLL in un file jar, è necessario assegnargli il prefisso win32-x86-64 affinché possa essere caricato.

Il "percorso della risorsa" è nominalmente il percorso della classe; praticamente ovunque raggiungibile da ClassLoader.getResource().

2

L'errore deriva dal tentativo di caricare DLL a 32 bit in JVM a 64 bit. La soluzione possibile è passare a JVM a 32 bit; in alternativa, utilizzare 64-bit Tesseract and Leptonica DLLs.

+0

No. Ciò produce solo lo stesso errore, se non è possibile trovare la DLL. Hai capito cosa intendo? – ohgodnotanotherone

1

Perché non si utilizza l'API JNA http://www.java2s.com/Code/Jar/j/Downloadjna351jar.htm per caricare la libreria nativa? Dopo aver inserito il classpath del progetto, aggiungi questo codice

NativeLibrary.addSearchPath("libtesseract302", "your native lib path"); assicurati di avere questo file libtesseract302.dll, normalmente si trova nella cartella windows32.

Ad esempio, se il file libtesseract302.dll in qualche parte c:/abcv/aaa/libtesseract302.dll poi basta impostare il percorso come questo NativeLibrary.addSearchPath("libtesseract302", "c:/abcv/aaa");

Non so come finestre percorso sembra sia c:/abcv/aaa o c:\\abcv\\aaa\\

se si desidera modo più semplice, basta mettere tutto il file dll necessario nella cartella windows32, JVM si prenderà cura di esso.

Un altro problema potrebbe essere che non si stava installando l'applicazione correttamente o la versione dell'applicazione non è stata abbinata alla versione jar. prova a installare l'ultima applicazione e scarica l'ultimo jar per riprovare. Spero che lo aiuti :)

0

Ho avuto lo stesso problema e ho scoperto che questo "percorso di risorsa" non è impostato da "percorso di directory nativo".
È tuttavia possibile aggiungere nuove cartelle utilizzando "Aggiungi cartella di classe esterna" nella scheda Libreria, anche se questa cartella non contiene alcun file di classe ma file di libreria nativi (come DLL su Windows)

0

Alcuni giorni fa mi sono imbattuto nello stesso messaggio di errore quando provavo a caricare una DLL C++ con JNA. Si è scoperto che la causa era una DLL mancante a cui la mia DLL dipendeva.

Nel mio caso è stato ridistribuibile MS Visual Studio 2012, che ho quindi scaricato e installato sulla macchina e il problema era scomparso. Prova a utilizzare Dipendente Walker per trovare eventuali librerie mancanti e installarle.

1

avuto lo stesso problema, ordinato con le seguenti righe

System.load ("/ usr/local/lib/liblept.so.5")

System.loadLibrary ("Tesseract"

Per il tuo caso, potrebbe essere librerie diverse ma alla fine è praticamente la stessa: basta caricare le librerie di cui hai bisogno manualmente.

Problemi correlati