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

java应用程序中未加载本机库,java,java-native-interface,Java,Java Native Interface,我必须在应用程序中查找系统信息,为此我有两个本机库文件,如下所示: SystemManagerLinux.so和SystemManagerWin32.dll 我必须在java代码中使用这些库文件来显示java GUI上的信息。我已将这些文件放在以下位置:C:\Users\surjit\Documents\NetBeansProjects\SampleMonitor,并在我的netbeans ide on run选项中将其设置为vm参数,如下所示: -Djava.library.path="C:\

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

我必须在java代码中使用这些库文件来显示java GUI上的信息。我已将这些文件放在以下位置:
C:\Users\surjit\Documents\NetBeansProjects\SampleMonitor
,并在我的netbeans ide on run选项中将其设置为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)
线程“main”java.lang.UnsatisfiedLinkError中出现异常:SystemManagerWin32.fetchProcessIDs([I)I) 在SystemManagerWin32.fetchProcessId(本机方法) 位于SystemMonitor.refreshPidList(SystemMonitor.java:168) 在SystemMonitor上。(SystemMonitor.java:383) 位于SystemMonitor.main(SystemMonitor.java:494) 线程“thread-2”java.lang.UnsatisfiedLinkError中出现异常:SystemManagerWin32.fetchSystemMemoryStatus(LSystemMemoryStatus;)Z 位于SystemManagerWin32.fetchSystemMemoryStatus(本机方法) 运行(SystemMonitor.java:410) 运行(Thread.java:722)
请给我建议解决方案。谢谢

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


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

os真正以什么开头?os是字符串变量wh我得到一个属性os.name,如下所示:String os=System.getProperty(“os.name”);使用JNA并完全跳过本机库。您还没有回答这个问题。当您执行此代码时,它实际上是从什么开始的?换句话说,两个加载调用都实际执行了吗?