在java中加载本机库

时间:2014-05-17 11:52:14

标签: java eclipse native unsatisfiedlinkerror

我有一个带有两个类的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

1 个答案:

答案 0 :(得分:1)

问题1:

您不应将此作为运行参数添加,而应添加为VM参数。它不是您的程序的参数,而是JVM的参数。

问题2:

(也是@IanRoberts):System.loadLibrary(name)调用将自动从给定名称派生实际库的名称。这意味着它将在Windows上附加".dll",并在linux上使用"lib" + name + ".so"。否则,以独立于平台的方式加载本机库是不可能的!

问题3:

一般来说,UnsatsfiedLinkError令人沮丧地很常见。事实上,这是真的:UnsatisfiedLinkError并没有告诉你更多的事情。“有些事情是错的”。您只能希望实际的错误消息更具描述性,如果您的32 / 64bit不匹配(至少在Windows上),这将是(幸运的话):

  • 尝试在64位系统上加载32位lib将导致消息:“无法在AMD 64位平台上加载IA 32位.dll”
  • 尝试在32位系统上加载64位lib将导致消息:“...不是有效的Win32应用程序”

(我不确定其他操作系统的消息,但是你的消息表明找不到库,而表示存在图书馆本身的问题)

(问题4:我很确定这是可能的,但目前绝对肯定(并且不能尝试)。通常,库必须在通过PATH环境变量或java.library.path可见的路径。有疑问,它应该始终有效,然后本机库与您启动程序的目录位于同一目录中)