JAVA类:
packageorg.hexun.wangchong.admin.gethardware;
publicclassGetHardWareInfo{
static{
System.loadLibrary("disknum");
}
publicnativestaticStringgetHardWareInfo();
publicstaticvoidmain(Strings[]){
System.out.println(getHardWareInfo());
}
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在linux终端下生成.h的头文件
javacGetHardWareInfo.java//进到gethardwar目录下
javahorg.hexun.wangchong.admin.gethardware.GetHardWareInfo//进行org的父目录下
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
生成的头文件内容如下:
org_hexun_wangchong_admin_gethardware_GetHardWareInfo.h:
/*DONOTEDITTHISFILE-itismachinegenerated*/
/*Headerforclassorg_hexun_wangchong_admin_gethardware_GetHardWareInfo*/
#ifndef_Included_org_hexun_wangchong_admin_gethardware_GetHardWareInfo
#define_Included_org_hexun_wangchong_admin_gethardware_GetHardWareInfo
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:org_hexun_wangchong_admin_gethardware_GetHardWareInfo
*Method:getHardWareInfo
*Signature:()Ljava/lang/String;
*/
JNIEXPORTjstringJNICALLJava_org_hexun_wangchong_admin_gethardware_GetHardWareInfo_getHardWareInfo
(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
写一个.c格式的文件,命名为disknum.c内容如下:
#include
#include
#include
#include
#include
#include"org_hexun_wangchong_admin_gethardware_GetHardWareInfo.h"
typedefunsignedshortWORD;
staticchar*ConvertToString(WORDdiskdata[256]linux虚拟机RAR FOR LINUX,intfirstIndex,intlastIndex)
{
staticcharstring[1024];
intindex=0;
intposition=0;
//eachintegerhastwocharactersstoredinitbackwards
for(index=firstIndex;index0&&''==string[index];index--)
string[index]='';
returnstring;
}
staticintWaitIde()
{
intal;
while((al=inb(0x1F7))>=0x80);
returnal;
}
staticvoidReadIDE(WORDpw[256])
{
intal;
inti;
for(i=0;i<256;i++)
pw[0]='';
ioperm(0x1f0,16,1);
WaitIde();
outb(0xA0,0x1F6);
al=WaitIde();
if((al&0x50)!=0x50)return;
outb(0xA0,0x1F6);
outb(0xEC,0x1F7);
al=WaitIde();
if((al&0x58)!=0x58)return;
for(i=0;i
pw[i]=inw(0x1F0);
}
}
JNIEXPORTjstringJNICALLJava_org_hexun_wangchong_admin_gethardware_GetHardWareInfo_getHardWareInfo
(JNIEnv*env,jobjectt)
{
char*hd_sn_ptr;
if(sizeof(WORD)!=2)
fprintf(stderr,"%s","typeiserror!n");
WORDpw[256];
ReadIDE(pw);
hd_sn_ptr=ConvertToString(pwlinux 获取硬盘序列号,10,19);
//fprintf(stdout,"[%s]n",hd_sn_ptr);
//
jstringstr;
str=(*env)->NewStringUTF(envlinux 获取硬盘序列号,hd_sn_ptr);
///
returnstr;
}
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在终端下敲入
gcc-I/usr/lib/j2sdk1.5-ibm/include-fPIC-cdisknum.c
gcc-shared-WI-sonamedisknum.o-olibdisknum.so//此处须在disknum前处加一个lib即libdisknum.so
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
将libdisknum.so库拷贝到jdk目录/jre/lib/i386下
终端运行javaGetHardWareInfo击可
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~