2010-01-17 17 views
8

Sto utilizzando il file jar Jacob nella mia applicazione java.Come configurare il file .dll in Java?

Questo file jar Jacob viene fornito con un file .dll. Ho aggiunto il file jar Jacob al mio classpath. Ma quando eseguo la mia applicazione di un errore di runtime si verifica come

"couldn't load jacob-1.15-M3-x86.dll file" 

Come posso caricare questo file DLL?

Modificato: ======================================= ======================

Avevo impostato l'ambiente "percorso" varaible al dir che contiene il mio file dll e carico che .dll file come segue

static { 
    System.loadLibrary("jacob-1.15-M3-x86.dll"); 
} 

ma il seguente errore ha accaduto

java.lang.UnsatisfiedLinkError: no jacob-1.15-M3-x86.dll in java.library.path 
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734) 
    at java.lang.Runtime.loadLibrary0(Runtime.java:823) 
    at java.lang.System.loadLibrary(System.java:1028) 
    at TemplateClass.TemplateClass.<clinit>(TemplateClass.java:14) 
+0

Aggiornato la mia risposta. –

+0

posizionando le dll nella cartella system32 di windows risolto il problema per me –

risposta

5

Ah, questo non è un errore di compilazione, ma un errore di runtime.

La mia ipotesi è che la DLL ha bisogno di essere sulla PATH. Non CLASSPATH, ma PATH, perché è lì che Windows cerca DLL. Prova ad estendere il tuo PATH per includere la posizione della tua DLL, o fai quello che fanno altre persone: Scarica la DLL in \Winnt\System\System32 o qualsiasi altra cosa venga chiamata nella directory di sistema. Ovunque tutte le altre DLL sono, in altre parole.

Aggiornamento

Il messaggio di errore si registra, per fortuna, è sottolineando il problema esatto. È possibile risolverlo mettendo nella cartella che contiene la DLL in java.library.path questo sole thread del forum mostra un bell'esempio: http://forums.sun.com/thread.jspa?threadID=627890

In realtà, questo è molto meno pulito di quanto dovrebbe essere; questa sembra essere una delle aree "più scure" di Java. Il thread vaga molto, ti consiglio di leggere fino in fondo per vedere alcuni problemi e soluzioni. Penso che sarai in grado di avere successo con un piccolo tentativo ed errore.

+0

Sì, si tratta di un errore di runtime. L'ho scritto per errore. Grazie. –

+0

Potrebbe per favore guardare la domanda modificata? –

10

Il 'jacob-1.15-M3-x86.dll' ha bisogno di essere in un luogo in cui il vostro sistema operativo può trovarlo. Avete alcune opzioni qui:

  • è possibile inserire il file DLL nella directory è stato avviato l'applicazione da. Se hai uno script batch per avviare la tua applicazione, sarebbe quella directory. Se si inizia in una sorta di server delle applicazioni, in genere si tratta della directory "bin".

  • è possibile inserire il file DLL da qualche parte nella variabile d'ambiente PATH%%. Potrei essere più semplice aggiornare la variabile di ambiente PATH per includere la directory che contiene il file .dll.

  • Un'altra opzione è quella di inserire il vostro DLL nella directory% SystemRoot% \ system32. Di solito questo è 'C: \ Windows \ system32'. Questa opzione di solito non è consigliata a meno che non si tratti di una libreria condivisa come il runtime MSCVRT.

Un altro possibile problema che potresti avere. Se il file .dll è compilato come 32 bit, è necessario eseguire il runtime Java a 32 bit. Allo stesso modo, se è un dll a 64 bit, deve essere eseguito in un JRE a 64 bit.

+0

Il mio problema è risolto. Grazie per quello. {... È possibile inserire il file .dll nella directory da cui è stata avviata la propria applicazione} Si intende la dir dove si trova la classe principale? Se sì, allora perché il file dovrebbe essere nella directory in cui risiede il mio script batch se utilizzo lo script batch? Potresti spiegare il tuo primo punto con maggiore attenzione al punto in cui voglio iniziare in un server delle applicazioni? –

+0

Potrebbe per favore guardare la domanda modificata? –

+0

Dovrebbe essere nella directory da cui si avvia il processo Java, non nella directory principale della classe. –

1

È necessario impostare LD_LIBRARY_PATH. This ti darà tutti i passi giusti da seguire.

+1

Supponendo che stia girando su Linux, giusto? –

+1

Se è in esecuzione su Linux, JACOB non sarà molto utile! – finnw

+0

Suppongo che ci sia un .so per Linux. Stessi commenti si applicano. – duffymo

3

Altre opzioni:

  • impostare la proprietà java.library.path nella directory che contiene la DLL. Esempio: java -Djava.library.path = "percorso/su/directory/contenente/il/dll" -jar appli.jar
  • nel codice, caricare la DLL in modo esplicito con System.load.
+0

Entrambi non funzionano. –

0

Ho avuto lo stesso problema.

Vedo che la domanda non è "risposta", quindi forse nessuna delle opzioni sopra ha funzionato.

Una delle mie ultime ipotesi era che al Jacob.dll manca la sua dipendenza.

Quello che ho fatto è stato ottenere depend e controllare se tutta la dipendenza, utilizzata da Jacob, è stata caricata. Ovviamente questo funziona per Windows.

Cheers!

1

Quando si utilizza System.loadLibrary()non includere .dll alla fine.

Inoltre, se non si imposta java.library.path in modo che punti alla cartella contenente la DLL, la DLL deve trovarsi nella directory da cui si avvia l'applicazione Java.