void throwException(JNIEnv *env,char *cls,char *desc){
jclass c;
(env)->ExceptionDescribe();(env)->ExceptionClear();//抛出一个异常
c=(env)->FindClass(cls);
if(c){
(env)->ThrowNew(c,desc);
}
}
JNIEXPORT jint JNICALL Java_systemProcess_processHandle (JNIEnv *env, jclass cls)
{HANDLE snapshot;
//获得某一时刻系统进程、堆、模块或线程的快照信息 snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
return (jint)snapshot; }
JNIEXPORT jboolean JNICALL Java_systemProcess_processData (JNIEnv *env, jclass cls, jint snapshot,jobject dataProcess){
PROCESSENTRY32 processListStr; jclass jcls;
jmethodID jmid;
jboolean return_value;
processListStr.dwSize=sizeof(PROCESSENTRY32); //获的系统进程链表中下一个进程的信息
return_value=Process32Next((HANDLE)snapshot,&processListStr);
if(!return_value)
{ return false;
}
//在本地代码中获取JAVA中对象所属的类
jcls=(env)->GetObjectClass(dataProcess); if(!jcls)
{ //抛出一个异常
throwException(env,\"java/lang/Exception\
return false; }
//在本地代码中获取JAVA类中的方法setName的标识号
jmid=(env)->GetMethodID(jcls,\"setName\
if(!jmid)
//抛出一个异常
{ throwException(env,\"java/lang/Exception\
return false;
}
//在本地代码中设定JAVA对象成员的变量
(env)->CallVoidMethod(dataProcess,jmid,(env)->NewStringUTF(processListStr.szExeFile));
//在本地代码中获取JAVA类中的方法setPProcessID的标识号 jmid=(env)->GetMethodID(jcls,\"setPProcessID\ if(!jmid) //抛出一个异常
{ throwException(env,\"java/lang/Exception\
return false; }
(env)->CallVoidMethod(dataProcess,jmid,processListStr.th32ParentProcessID);
//在本地代码中获取JAVA类中的方法setThread的标识号
jmid=(env)->GetMethodID(jcls,\"setThread\
if(!jmid)
{ throwException(env,\"java/lang/Exception\find dataProcess.setThread\");
return false;
}
(env)->CallVoidMethod(dataProcess,jmid,processListStr.cntThreads);
//在本地代码中获取JAVA类中的方法setClassBase的标识号 jmid=(env)->GetMethodID(jcls,\"setClassBase\
if(!jmid)
{ throwException(env,\"java/lang/Exception\find dataProcess.setClassBase\");
return false;
}
(env)->CallVoidMethod(dataProcess,jmid,processListStr.pcPriClassBase);
return true;
}
4.systemProcessTest.javapublic class systemProcessTest
{
public static void main(String[] args){
int snapshot=0;
try{
snapshot=systemProcess.processHandle(); //获取系统进程快照信息的句柄
}catch(Exception ex){ }
while(true)
{
boolean b=false;
dataProcess ds=new dataProcess(); //对象实例化
try{ b=systemProcess.processData(snapshot,ds); }catch(Exception e){ }
if(!b)
{ System.out.println(\"no Process show!\"); break; }
System.out.println(\"Process Name:\"+ds.getName()); //显示进程文件名
System.out.println(\"PID:\"+ds.getPProcessID()); //显示进程的PID
System.out.println(\"Thread:\"+ds.getThread()); //显示进程的开启的线程数
System.out.println(\"Priority:\"+ds.getClassBase()); //显示进程的优先级
} }}