最近好几个朋友问我怎样通过Java获得系统硬件相关信息,比如CPU频率,占 用,内存大小,磁盘大小,MAC地址等等,正常的Java SDK没法提供这些功能,只能通过JNI来实现。这里就写一下大致的步骤,希望能帮助那些想系统性掌握类似平台相关信息获取的开发方法。如果你想完整的看 下去,最好需要知道以下几点:
开发一个JNI应用一般分为两个 两个部分,Java接口和C/C++实现,这里为了方便,我们将使用C++,因为Windows的普遍性,这里使用Windows作为Java的安装平台。下面首先从Welcome演示这两步骤。 1 Welcome示例 welcome示例非常简单,传入一个String参数,响应一个字符串,比如参数为 "令狐冲",响应结果为" 欢迎 令狐冲 同学"。 1.1 定义Java接口 使用Eclipse创建一个工程,接着创建一个类,如下图:
1.2 生成JNI头文件
打开命令行,使用javah程序(%JAVA_HOME%\bin\javah)生成JNI头文件,比如: javah -classpath ./bin com.lifesting.jni.SysInfo 这将会在目录下生成一个com_lifesting_jni_SysInfo.h的头文件,里面申明了Java welcome方法声明对应的C 声明
1.3 创建JNI实现工程
为了体验一把c++0x,我机器上装的是Visual Studio 2010 ,这个工程并没有使用到VS 2010的特性,2005、2008、2010基本差不多。 通过菜单new一个为win32 console application project,将application type设置为dll选项,去除掉MFC和ATL,因为只需要用到Windows SDK。其它默认。 创建完毕之后添加java开发的头文件和库文件。 1.3.1 添加头文件 打开项目属性页,点击Configuration Properties -> C/C++ ->General,在Additional Include Directories中输入两条 $(JAVA_HOME)\include $(JAVA_HOME)\include\win32 1.3.2 添加库文件 打开项目属性页,点击Configuration Properties -> Linker -> General,在Additional Library Directories中输入一条 $(JAVA_HOME)\lib 仅接着选择 Configuration Properties -> Linker -> Input,在Additional Dependencies中输入两条 jvm.lib jawt.lib(这个是awt的native接口,可以不用) .....省略N个字...... (cr0_3) |