SIGAR-AMD64-winnt.dll ......不能引用它,或以.jar它捆绑(sigar-

2019-08-17 21:47发布

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

我试图让使用sigar.jar在我的Eclipse项目的CPU信息(只是测试SIGAR API现在)。

它运行在Eclipse中没有问题:

  • 是什么使得它在Eclipse的工作是把DLL在同一文件夹中sigar.jar
  • 我测试了一下加入到DLL的路径作为构建路径配置对话框中的“本机代码财产”没有效果。
  • 在运行配置添加VM参数也没有任何影响。
  • 我测试了2个假的路径中的2个地方只要我在相同的文件夹sigar.jar的dll ......它在Eclipse中运行良好。

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

  • 我修改与捆NativeCode MANIFEST.MF文件:库/ 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 = /天然的/ -jar C:\ cpu_usage_log \ cpu3.jar(I” M}这里假设路径是相对于包含project.jar)的文件夹......但同样没有成功:

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

(我怀疑是我应该给一个主类名之后的第二个参数的-Djava.library.path =。/路/但我不能找到所谓的“主类”名称,或做在网络上的任何实例指定这样的类...是从.dll文件中的主类?)

我真的不知道还能在这一点尝试。 我看那些2个解决方案工作了别人,这使得它更令人沮丧,因为我想象它可以明显的东西,我错过了或阅读其他职位的时候不明白,而我只是无法找到(这是我第一次处理在Java项目本机DLL)。

Answer 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"); 作为库已经被加载后会被忽略。



文章来源: sigar-amd64-winnt.dll … can't reference it or bundle it with .jar