我有一个带有两个类的eclipse项目。班级" SomeClass1"有一个原生方法:
SomeClass1
public class SomeClass1 {
static {
System.loadLibrary("libname"); // Load the native library.
}
public native void some_method(); // implemented in the library
// .... other non methods ....
}
另一课" SomeClass2"使用" SomeClass1"的原生方法。像:
SomeClass2
public class SomeClass2{
public static void main(String[] args) {
SomeClass1 s = new SomeClass1();
s.some_method();
}
// ....other methods....
}
但是当它调用该方法时会抛出这样的错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libname in java.library.path
....
at java.lang.System.loadLibrary(Unknown Source)
at x.x.x.SomeClass1.<clinit>(SomeClass1.java:128)
at SomeClass2.main(SomeClass2.java:10)
我认为错误与java有关,不知道在哪里寻找本机库。
问题1 当我使用:-Djava.library.path =&#34; C:\ Users ..... \ libfolder \&#34;作为eclipse中的run参数并打印以下值:System.getProperty(&#34; java.library.path&#34;);我看到很多目录打印但不是我在参数中指定的目录。我做错了什么?
问题2 当我这样做:System.loadLibrary(&#34; name&#34;);我是否需要致电图书馆&#34; name.so&#34;或&#34; libname.so&#34;?
问题3 如果找到该库但是64位库,而它加载的平台是32位,它是否会给出一个不满意的LinkError或者会给出不同的错误?
问题4 我可以指定库相对于projects文件夹的路径,还是相对于加载库的文件的路径?
希望你能回答(部分)我的问题。
Grtz Stefan
答案 0 :(得分:1)
问题1:
您不应将此作为运行参数添加,而应添加为VM参数。它不是您的程序的参数,而是JVM的参数。
问题2:
(也是@IanRoberts):System.loadLibrary(name)
调用将自动从给定名称派生实际库的名称。这意味着它将在Windows上附加".dll"
,并在linux上使用"lib" + name + ".so"
。否则,以独立于平台的方式加载本机库是不可能的!
问题3:
一般来说,UnsatsfiedLinkError
令人沮丧地很常见。事实上,这是真的:UnsatisfiedLinkError
并没有告诉你更多的事情。“有些事情是错的”。您只能希望实际的错误消息更具描述性,如果您的32 / 64bit不匹配(至少在Windows上),这将是(幸运的话):
(我不确定其他操作系统的消息,但是你的消息表明找不到库,而不表示存在图书馆本身的问题)
(问题4:我很确定这是可能的,但目前绝对肯定(并且不能尝试)。通常,库必须在通过PATH环境变量或java.library.path
可见的路径。有疑问,它应该始终有效,然后本机库与您启动程序的目录位于同一目录中)