在java中加载本机库
我有一个包含两个类的eclipse项目。类“SomeClass1”有一个本机方法: SomeClass1在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
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
谢谢您的帮助!