Java应用程序中未加载本机库

时间:2012-11-16 06:30:53

标签: java java-native-interface

我必须在应用程序中找到系统信息,为此我有两个本机库文件,如下所示: SystemManagerLinux.soSystemManagerWin32.dll

我必须在我的java代码中使用这些库文件来显示有关java GUI的信息。我已将这些文件放在以下位置:C:\Users\surjit\Documents\NetBeansProjects\SampleMonitor并在运行选项的netbeans ide中将其作为vm参数给出,如下所示:

-Djava.library.path="C:\Users\surjit\Documents\NetBeansProjects\SampleMonitor"

并在代码中调用库:

if (os.startsWith("Linux"))
   loadTmpLibrary("SystemManagerLinux.so", "libSML", ".so");
else if (os.startsWith("Windows")) {
   loadTmpLibrary("SystemManagerWin32.dll", "SMW", ".dll");

但是当我运行应用程序时,它会发出以下错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError:     SystemManagerWin32.fetchProcessIDs([I)I
    at SystemManagerWin32.fetchProcessIDs(Native Method)
    at SystemMonitor.refreshPidList(SystemMonitor.java:168)
    at SystemMonitor.<init>(SystemMonitor.java:383)
    at SystemMonitor.main(SystemMonitor.java:494)
Exception in thread "Thread-2" java.lang.UnsatisfiedLinkError:    SystemManagerWin32.fetchSystemMemoryStatus(LSystemMemoryStatus;)Z
    at SystemManagerWin32.fetchSystemMemoryStatus(Native Method)
    at SystemMonitor.run(SystemMonitor.java:410)
    at java.lang.Thread.run(Thread.java:722)

请建议我解决。谢谢

1 个答案:

答案 0 :(得分:0)

问题似乎是您尝试调用的本机方法在您的DLL中不存在,而不是您的DLL无法加载。

假设loadTmpLibrary有效地执行System.loadLibrary()调用,您需要确保正确声明您的本机方法。通常在包含本机声明的Java源上调用javah足以获得准确的标头。将其输出与您当前正在编译的任何内容进行比较。