Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中加载本机库_Java_Eclipse_Native_Unsatisfiedlinkerror - Fatal编程技术网

在java中加载本机库

在java中加载本机库,java,eclipse,native,unsatisfiedlinkerror,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

我有一个包含两个类的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)
线程“main”java.lang.UnsatisfiedLinkError中出现异常:java.library.path中没有libname .... 位于java.lang.System.loadLibrary(未知源) 在x.x.x.SomeClass1.(SomeClass1.java:128) 位于SomeClass2.main(SomeClass2.java:10) 我认为这个错误与java不知道在哪里查找本机库有关

问题1 当我在eclipse中使用:-Djava.library.path=“C:\Users….\libfolder\”作为运行参数并打印:System.getProperty(“java.library.path”)的值时;我看到很多打印的目录,但不是我在参数中指定的目录。我做错了什么

问题2 当我这样做时:System.loadLibrary(“名称”);我需要叫这个库“name.so”还是“libname.so”

问题3 如果可以找到该库,但它是一个64位库,而加载它的平台是32位的,那么它是否也会给出一个不满意的链接错误,或者会给出一个不同的错误

问题4 我可以指定相对于项目文件夹或相对于加载库的文件的库路径吗

希望你能回答我的一些问题


格尔茨·斯特凡问题1:

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

问题2:

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

问题3:

一般来说,
UnsatsfiedLinkError
非常常见。事实上,可以这样说:
unsatifiedlinkerror
告诉你的不仅仅是“出了问题”。您只能希望实际的错误消息更具描述性,如果出现32/64位不匹配(至少在windows上是这样),那么(幸运的)情况就是这样:

  • 尝试在64位系统上加载32位库将导致消息:“无法在AMD 64位平台上加载IA 32位.dll”
  • 尝试在32位系统上加载64位lib将导致消息:“…不是有效的Win32应用程序”
(虽然我不确定其他操作系统的消息,但您的消息表明找不到库,并且库本身没有问题)


(问题4:我相当肯定这是可能的,但不是绝对肯定(也不能尝试)目前。一般来说,库必须位于通过path环境变量或通过
java.library.path
可见的路径中。毫无疑问,如果本机lib位于启动程序的同一目录中,它应该始终工作)

问题2:您的示例库路径表明您在windows上,因此它应该是
name.dll
谢谢您的帮助!