Damit dies System.loadLibrary()
funktioniert, muss sich die Bibliothek (unter Windows eine DLL) in einem Verzeichnis befinden, das sich irgendwo in Ihrem PATH
oder in einem Pfad befindet, der in der java.library.path
Systemeigenschaft aufgeführt ist (damit Sie Java wie starten können java -Djava.library.path=/path/to/dir
).
Außerdem loadLibrary()
geben Sie für den Basisnamen der Bibliothek ohne den .dll
am Ende an. Also, für /path/to/something.dll
, würden Sie nur verwenden System.loadLibrary("something")
.
Sie müssen sich auch genau ansehen UnsatisfiedLinkError
, was Sie bekommen. Wenn es so etwas sagt wie:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
dann kann es die foo- Bibliothek (foo.dll) in Ihrem PATH
oder nicht finden java.library.path
. Wenn es so etwas sagt wie:
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
Dann stimmt etwas mit der Bibliothek selbst nicht, da Java eine native Java-Funktion in Ihrer Anwendung nicht ihrem tatsächlichen nativen Gegenstück zuordnen kann.
Zunächst würde ich Ihren System.loadLibrary()
Anruf protokollieren, um zu sehen, ob dies ordnungsgemäß ausgeführt wird. Wenn es eine Ausnahme auslöst oder sich nicht in einem Codepfad befindet, der tatsächlich ausgeführt wird, erhalten Sie immer den UnsatisfiedLinkError
oben erläuterten letzteren Typ .
Als Nebenbemerkung stellen die meisten Benutzer ihre loadLibrary()
Aufrufe mit den nativen Methoden in einen statischen Initialisierungsblock in der Klasse, um sicherzustellen, dass er immer genau einmal ausgeführt wird:
class Foo {
static {
System.loadLibrary('foo');
}
public Foo() {
}
}