【问题标题】:sigar-amd64-winnt.dll ... can't reference it or bundle it with .jarsigar-amd64-winnt.dll ...无法引用它或将其与 .jar 捆绑
【发布时间】:2013-03-22 12:14:09
【问题描述】:

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

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

它在eclipse中运行没有问题:

  • 它在 Eclipse 中工作的原因是将 dll 放在与 sigar.jar
  • 我测试了将 dll 的路径添加为“本机代码属性” 在构建路径配置对话框中没有任何效果。
  • 在运行配置中添加 vm 参数也无效。
  • 我测试了在这 2 个地方放置 2 条假路径,只要我有 dll 在与 sigar.jar 相同的文件夹中...它在 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 中的主类吗?)

我现在真的不知道还能尝试什么。我读了这两个对其他人有用的解决方案,这让我更加沮丧,因为我想这可能是我在阅读其他帖子时错过或不理解的一些明显的东西,而我就是找不到(这是我第一次处理在 Java 项目中使用本机 dll)。

【问题讨论】:

  • 您是否设法解决了这个问题。我也有同样的问题。

标签: java eclipse jar sigar


【解决方案1】:

对我来说,修改 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"); 将被忽略,因为该库已经加载。

【讨论】:

  • 谢谢。做到了。奇怪的是,我仍然在终端中收到“找不到库”错误——甚至在 main 的第一行运行之前就抛出了——但一切正常。 C:\Users\Nick&gt;java -jar C:\cpu_usage_log\cpu_utilization_statistics_to_output file_csv.jar 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.&lt;clinit&gt;(Sigar.java:100) at CpuData.main(CpuData.java:67)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多