因为有几台服务器是windows 2000的,之前采用的WMIC方法不适用(windows 2003开始有),更不用说WMI .NET了(采用.NET Framework 3.5),只能采用JNI的方法,通过C++来调用本地WMI接口来查询数据。幸好,这次WMI从windows 2000就开始有,如果再之前的版本我就没办法了。
程序结构:
在java中声明本地方法,然后调用C++编写的DLL,在C++中实现WMI查询,返回结果到java,最后由java封装成XML文件。
具体过程
(1) 构建JNI
参考资料: http://blog.youkuaiyun.com/crayonyi/article/details/7413017
http://www.cnblogs.com/youxilua/archive/2011/09/16/2178554.html
1.首先在java中声明本地方法
</pre><pre name="code" class="cpp">public native String GetInfoFromWMI(String head, String content);
2.然后用命令行cd到java文件所在目录,执行javac编译。如我的是javac GetHWInfo.java
3.编译好之后cd.. 到上级目录,执行javah 包名.类名。如我的是 javah WMI.GetHWInfo
这时候就在文件目录下得到一个.h的头文件了。(我的是WMI_GetHWInfo.h),其中包名和类名之间由下划线隔开。
Notice:
编译时在java文件中只需要声明好C++文件中需要的本地方法就足够了,其他要用到的方法可以先不用管或先注释掉。事实上,因为我们还可能引用到其他的jar包,而这些包又有可能不在我们的src下面,比如我引用到dom4j.jar,那么在编译时就需要通过classpath关键字加上其他jar的引用,如果包多起来还是挺麻烦的。所以可以先编译必要的native方法,反正编译出来的头文件少几个无关的方法也不影响。
4.将编译好的头文件添加到vs解决方案里面。我用的是vs2008, 操作就是项目->添加项->已有项->WMI_GetHWInfo.h. 然后在程序中#include WMI_GetHWInfo.h.
5.打开头文件,把里面的<jni.h>改成”jni.h”,因为<>的话只在本路径中找,而””会在本路径找不到的时候再去外围路径找,这样才能找到jni.h
6.在{JAVA_HOME}/include/中的jni.h和jni_md.h按照上面4的方式加进来。
7.复制WMI_GetHWInfo.h中的方法名,比如我的是
JNIEXPORTjstring JNICALL Java_WMI_GetHWInfo_GetInfoFromWMI
(JNIEnv * env,jobject, js