为了工作,库(在Windows上,DLL)必须位于系统上某个位置的目录中或系统属性中列出的路径上(因此您可以像启动Java一样启动Java)。System.loadLibrary()
PATH
java.library.path
java -Djava.library.path=/path/to/dir
此外,对于 ,可以指定库的基本名称,而不在末尾指定 。因此,对于 ,您只需使用 .loadLibrary()
.dll
/path/to/something.dll
System.loadLibrary("something")
您还需要查看您获得的确切值。如果它说像这样:UnsatisfiedLinkError
Exception in thread "main" java.lang.UnsatisfiedLinkError: no foo in java.library.path
然后它找不到 foo 库 (foo.dll) 在你的 or .如果它说像这样:PATH
java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.example.program.ClassName.foo()V
那么库本身就出了问题,因为Java无法将应用程序中的本机Java函数映射到其实际的本机对应项。
首先,我会在你的调用周围放一些日志记录,看看它是否正确执行。如果它引发异常或不在实际执行的代码路径中,那么您将始终获得上面解释的后一种类型。System.loadLibrary()
UnsatisfiedLinkError
顺便说一句,大多数人将他们的调用与本机方法一起放入类中的静态初始值设定项块中,以确保它始终只执行一次:loadLibrary()
class Foo {
static {
System.loadLibrary('foo');
}
public Foo() {
}
}