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

(这可能是我正在犯的一个明显的错误,但现在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.(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.(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 /之后给出一个主类名作为第二个参数但是我找不到那个假定的“主类”名称,或者在网上做的任何例子指定这样一个类…它是.dll中的主类吗?)

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

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