Per System.loadLibrary()
funzionare, la libreria (su Windows, una DLL) deve essere in una directory da qualche parte sul tuo PATH
o su un percorso elencato nella java.library.path
proprietà di sistema (in modo da poter avviare Java comejava -Djava.library.path=/path/to/dir
).
Inoltre, per loadLibrary()
, si specifica il nome di base della libreria, senza il .dll
alla fine. Quindi, per /path/to/something.dll
, useresti solo System.loadLibrary("something")
.
Devi anche guardare esattamente UnsatisfiedLinkError
ciò che stai ottenendo. Se dice qualcosa come:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
quindi non riesce a trovare la libreria foo (foo.dll) nel tuo PATH
o java.library.path
. Se dice qualcosa come:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
allora qualcosa non va nella libreria stessa, nel senso che Java non è in grado di mappare una funzione Java nativa nell'applicazione alla sua controparte nativa effettiva.
Per cominciare, metterei un po 'di log intorno alla tua System.loadLibrary()
chiamata per vedere se viene eseguita correttamente. Se genera un'eccezione o non si trova in un percorso di codice che viene effettivamente eseguito, otterrai sempre l'ultimo tipo diUnsatisfiedLinkError
spiegato sopra.
Come nota a margine, la maggior parte delle persone inserisce le proprie loadLibrary()
chiamate in un blocco di inizializzazione statico nella classe con i metodi nativi, per assicurarsi che venga sempre eseguito esattamente una volta:
class Foo {
static {
System.loadLibrary('foo');
}
public Foo() {
}
}