(这可能是我犯的一个明显的错误,但现在6小时后我无法让它工作。)
我正在尝试在我的eclipse项目中使用sigar.jar获取CPU信息(现在只测试sigar API)。
它在eclipse中运行没有问题:
问题是当我尝试为项目导出可运行的.jar文件时。我尝试了两件事:
main starting!! no sigar-amd64-winnt.dll in java.library.path
org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in
java.library.path
at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)
at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:100)
at CpuData.main(CpuData.java:59)
cpudata(sigar s) starting!!! cpuInfo() starting!!!
Exception in thread
"main" java.lang.UnsatisfiedLinkError:
org.hyperic.sigar.Sigar.getCpuInfoList()[Lorg/hyperic/sigar/C puInfo;
at org.hyperic.sigar.Sigar.getCpuInfoList(Native Method)
at CpuData.cpuInfo(CpuData.java:103)
at CpuData.<init>(CpuData.java:29)
at CpuData.main(CpuData.java:59)
错误:无法找到或加载主类.library.path = .. native
(我怀疑我应该在-Djava.library.path =。/ path /之后给出一个主类名作为第二个参数但是我找不到那个假设的“主类”名称,或者在指定这样一个类的web ...它是.dll中的主类吗?)
我真的不知道还有什么可以尝试。我读过那些为他人工作的2个解决方案,这让它更令人沮丧,因为我觉得在阅读其他帖子时我错过或听不懂的东西显而易见,而我却找不到(这是我第一次处理在java项目中使用本机dll。)
答案 0 :(得分:2)
对我来说,最好修改Java加载库的方式。
通常你会调用System.loadLibrary("mylib");
来搜索库路径上的库。
恕我直言,使用它的绝对路径加载库要好得多。这允许您在程序中实现自定义搜索逻辑:
// Extends the name to mylib.so or mylib.dll
mylibname = System.mapLibraryName("mylib");
// Load the library via its absolute path
System.load(new File(path, mylibname).getAbsolutePath());
请注意,每个库只能加载一次,因此如果您按上图所示加载库,之后调用System.loadLibrary("mylib");
将被忽略,因为库已经加载。