sigar-amd64-winnt.dll ...无法引用它或将其与.jar捆绑在一起

时间:2013-03-22 12:14:09

标签: java eclipse jar sigar

(这可能是我犯的一个明显的错误,但现在6小时后我无法让它工作。)

我正在尝试在我的eclipse项目中使用sigar.jar获取CPU信息(现在只测试sigar API)。

它在eclipse中运行没有问题:

  • 使它在eclipse中工作的原因是将dll放在同一个文件夹中 sigar.jar
  • 我测试了将dll的路径添加为“本机代码属性” 在构建路径配置对话框中没有任何效果。
  • 在运行配置中添加vm参数也无效。
  • 我测试了在这两个地方放置2条假路径,只要我有 与sigar.jar在同一个文件夹中的dll ...它在eclipse中运行良好。

问题是当我尝试为项目导出可运行的.jar文件时。我尝试了两件事:

  • 我用Bundle-NativeCode修改了MANIFEST.MF文件:libs / sigar-amd64-winnt.dll(我假设这里的路径是相对于项目文件夹的) - >没有成功:
 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)
  • 然后我决定将.dll放在与我的project.jar相同的文件夹中,并在命令行中使用:java -Djava.library.path =。/ native / -jar C:\ cpu_usage_log \ cpu3.jar (我假设这里的路径是相对于包含project.jar的文件夹)...但是再次没有成功:
  

错误:无法找到或加载主类.library.path = .. native

(我怀疑我应该在-Djava.library.path =。/ path /之后给出一个主类名作为第二个参数但是我找不到那个假设的“主类”名称,或者在指定这样一个类的web ...它是.dll中的主类吗?)

我真的不知道还有什么可以尝试。我读过那些为他人工作的2个解决方案,这让它更令人沮丧,因为我觉得在阅读其他帖子时我错过或听不懂的东西显而易见,而我却找不到(这是我第一次处理在java项目中使用本机dll。)

1 个答案:

答案 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");将被忽略,因为库已经加载。