利用JNI方法,通过WMI获取本地硬件信息(主板型号,硬盘序列号,CPU参数等)

本文介绍了一种在Windows 2000环境下,利用JNI技术结合C++调用WMI接口获取硬件信息(如主板型号、硬盘序列号、CPU参数)的方法。通过声明Java本地方法,编译生成JNI头文件,然后在C++中实现WMI查询,最后将结果返回到Java并封装成XML文件。涉及到的关键步骤包括JNI的构建、COM组件的使用以及数据类型的转换。
摘要由CSDN通过智能技术生成

因为有几台服务器是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.csdn.net/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值