4

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

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

它在eclipse中运行没有问题:

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

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

  • 我用 Bundle-NativeCode: libs/sigar-amd64-winnt.dll 修改了 MANIFEST.MF 文件(我假设这里的路径是相对于项目文件夹的)-> 没有成功:
 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 (I' m 假设这里的路径是相对于包含 project.jar 的文件夹)...但同样没有成功:

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

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

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

4

1 回答 1

2

对我来说,修改 Java 加载库的方式总是最好的。

通常你调用System.loadLibrary("mylib");which 在库路径上搜索库。

恕我直言,使用绝对路径加载库要好得多。这允许您在程序中实现自定义搜索逻辑:

// 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");之后的调用将被忽略,因为该库已经加载。

于 2013-03-22T14:39:43.230 回答