linux系统java通过jni方式获取硬盘序列号
2012-11-15 15:22
676 查看
最近项目需要从linux系统获取硬盘序列号,特把成果分享一下。至于什么是jni这里就不介绍了需要的童鞋可以google百度一把。这里包括两部分代码,一部分是java的代码供上层调用,一部分是c代码编译成so动态链接库供java代码,下面从c代码开始。
c代码
getLocalSysInfo.cpp
头文件
getLocalSysInfo.h
这个头文件是在执行
javac getSysInfo.java
后生成getSysInfo.class文件后再执行
javah -classpath . -jni getSysInfo
后生成getSysInfo.h头文件,我手痒生成后把它改为getLocalSysInfo.h的(^0^)。
在c代码中打开硬盘设备文件/dev/sda(注意每个系统可能不一样请根据自己的系统修改路径),然后调用ioctrl读取设备信息获取硬盘序列号并打印出来。接下来就是编译了我写了个小小的makefile文件:
编译器我用的是g++,我jdk的路径是/usr/lib/jvm/jdk1.7.0/include,这个必须包含否则会提示找不到jni.h这个文件。编译标致选择-fPIC和-shared这两个的含义如下:
-fPIC
生成的目标文件可在不固定内存位置执行,就是可动态链接的意思了。
-shared
生成的目标文件可以被共享即可以多进程调用,如不加该选项会提示要你添加main函数(呵呵你懂的)。
加载动态链接库libgetLocalSysInfo.so。编译java命令:
getHdSn.java
调用或者硬盘序列号方法。
点击这里下载代码
一 代码
c代码
getLocalSysInfo.cpp#include "getLocalSysInfo.h" #include <stdio.h> #include <sys/ioctl.h> #include <linux/hdreg.h> #include <sys/fcntl.h> JNIEXPORT void JNICALL Java_getSysInfo_getLocalHdSn(JNIEnv * env, jobject arg) { struct hd_driveid id; /*打开设备文件*/ int fd = open("/dev/sda", O_RDONLY); if (fd < 0) { printf("oh can not open sda/n"); return ; } /*读取设备信息*/ if(!ioctl(fd, HDIO_GET_IDENTITY, &id)) { /*打印磁盘序列号信息*/ printf("Serial Number=%s\n",id.serial_no); } return; }
头文件
getLocalSysInfo.h
这个头文件是在执行
javac getSysInfo.java
后生成getSysInfo.class文件后再执行
javah -classpath . -jni getSysInfo
后生成getSysInfo.h头文件,我手痒生成后把它改为getLocalSysInfo.h的(^0^)。
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: getSysInfo * Method: getLocalHdSn * Signature: ()V */ JNIEXPORT void JNICALL Java_getSysInfo_getLocalHdSn (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
在c代码中打开硬盘设备文件/dev/sda(注意每个系统可能不一样请根据自己的系统修改路径),然后调用ioctrl读取设备信息获取硬盘序列号并打印出来。接下来就是编译了我写了个小小的makefile文件:
CC=g++ JDK_INCLUDE=/usr/lib/jvm/jdk1.7.0/include INCLUDE=-I $(JDK_INCLUDE) -I $(JDK_INCLUDE)/linux FLAG=-fPIC -shared OBJ=libgetLocalSysInfo.so all:getLocalSysInfo.cpp getLocalSysInfo.h $(CC) $(FLAG) -cpp getLocalSysInfo.cpp -o $(OBJ) $(INCLUDE) clean: rm -rf *.o *.so getLocalSysInfo
编译器我用的是g++,我jdk的路径是/usr/lib/jvm/jdk1.7.0/include,这个必须包含否则会提示找不到jni.h这个文件。编译标致选择-fPIC和-shared这两个的含义如下:
-fPIC
生成的目标文件可在不固定内存位置执行,就是可动态链接的意思了。
-shared
生成的目标文件可以被共享即可以多进程调用,如不加该选项会提示要你添加main函数(呵呵你懂的)。
java代码
getSysInfo.javapublic class getSysInfo { /*java本地方法申明*/ public native void getLocalHdSn( ); public getSysInfo() { } /*装入动态链接库getHdSn.so*/ static { System.loadLibrary("getLocalSysInfo"); } }
System.loadLibrary("getLocalSysInfo");
加载动态链接库libgetLocalSysInfo.so。编译java命令:
getHdSn.java
public class getHdSn{ /** * @param args */ public static void main(String[] args) { getSysInfo sysInfo = new getSysInfo(); sysInfo.getLocalHdSn( ); } }
调用或者硬盘序列号方法。
编译和运行
编译和运行命令如下:代码下载
我把完整代码上传到博客资源可直接下载点击这里下载代码
相关文章推荐
- java通过jni方式获取硬盘序列号(windows,linux)
- linux系统java通过jni方式获取硬盘序列号
- linux系统下通过jni用c++调用java
- 通过读proc方式获取Linux系统状态信息
- 利用JNI方法,通过WMI获取本地硬件信息(主板型号,硬盘序列号,CPU参数等)
- 通过读proc等方式获取Linux系统状态信息的一些方法
- 方法:Linux 下用JAVA获取CPU、内存、磁盘的系统资源信息
- Java如何获取系统信息(包括操作系统、jvm、cpu、内存、硬盘、网络、io等)
- Java通过JNI的方式调用C
- java 通过System.getProperties()获取系统参数
- java 通过System.getProperties()获取系统参数
- 解决java使用sigar获取linux系统内存使用信息报错的问题
- C/C++获取Linux系统CPU和内存及硬盘使用情况
- Linux系统通过用户名快速获取组名
- Java获取匿名类对象(通过new接口、抽象类等方式创建)的方法上的注解
- java--通过java获取系统cpu及内存负载情况
- java支持跨平台获取cpuid、主板id、硬盘id、mac地址 (兼容windows、Linux)
- Linux下通过ioctl系统调用来获取和设置网络信息
- c#中如何获取本机MAC地址、IP地址、硬盘ID、CPU序列号等系统信息
- c++代码通过JNI调用Java代码时用到的签名信息如何获取