最近在做一个客户端监控的功能需要提取用户电脑的CPU编号和网卡的编号采集用户的登陆数据据我所知道直接通过Java来调用操作系统的信息是非常困难的事情(我好像没有发现JavaAPI提供了这个功能)那这样的话只能通过JNI访问系统的信息了不过有个SWT扩展的插件orgeclipseswtextension封装了调用DLL的JNI方法主要是负责底层操作系统的方法不过可能会对程序的跨平台性有点的影响目前只能使用于Windows操作系统使用方法很简单接下来请看 我们可以从 上下载这个插件直接搜索 swt extension 就可以搜到新建一个工程比如名称叫orgvwpoloextendexample这里要新建成一个插件项目如果新建成个简单的Java工程的时候会出现个找不到类的异常javalangNoClassDefFoundError org/eclipse/swt/internal/win/OS项目新建好了后我们可以写个类来测试一下我写的测试类为 import orgeclipseswtinternalextensionExtension;
/** * 获得操作系统的信息 * @author 刘尧兴 * <p></p> */ public class GetOSInfoApp { public static void main(String[] args) { Systemoutprintln(计算机名称: +ExtensionGetComputerName()); Systemoutprintln(系统登陆帐号: +ExtensionGetUserName()); Systemoutprintln(系统CPU编号: + ExtensionGetCPUID()); Systemoutprintln(系统 MAC编号: + ExtensionGetMACID()); } }
这个类功能相当的简单我的项目的文件结构为 注意要使程序顺利运行必须要导入 swtextensionwindll 这个文件由于文件下载下来后有三个DLL文件还有两个是swtgdipwindll和swtwindll如果将他们全部导入进来结果会抛出个这样的异常 Exception in thread main javalangUnsatisfiedLinkError: orgeclipseswtinternalCPTR_sizeof()I at orgeclipseswtinternalCPTR_sizeof(Native Method) at orgeclipseswtinternalC<clinit>(Cjava:) at orgvwpoloextendexampleGetSystemInfoAppmain(GetSystemInfoAppjava:) 这个异常出现的原因是找不到DLL文件或者是多个DLL文件沖突所造成的去掉其他的DLL文件只要导入swtextensionwindll 运行这是控制台打印的结果计算机名称: THINKPAD 系统登陆帐号: vwpolo 系统CPU编号: BFEBFBFFF 系统 MAC编号: [I@c |