搜索
您的当前位置:首页正文

JavaJNI获得系统进程信息实例[策划]

2021-02-05 来源:欧得旅游网
源程序代码:

1.systemProcess.java

public class systemProcess { static

{ //调用本地代码编写DLL(动态连接库),process为C/C++生成的DLL文件名

System.loadLibrary(\"process\");

} //声明所需要的本地方法

public static native int processHandle()throws Exception; // 获取进程快照表的快照信息 public static native boolean processData(int snapshot,dataProcess ds)throws Exception;

//用来获取其他进程}

2.dataProcess.javaclass dataProcess{

String fileName;

int PProcessID;

int currentThread; int classBase;

//在java中设置从本地代码中返回的数据

public void setName(String name) //设置返回的进程文件名{ fileName=name;}

public String getName()

{ return fileName;}

public void setPProcessID(int PID) //设置返回的进程PID

{ PProcessID=PID;}

public int getPProcessID()

{ return PProcessID; }

public void setThread(int thread) //设置返回的进程开启线程数{ currentThread=thread; }

public int getThread()

{ return currentThread; }

public void setClassBase(int base) //设置返回的进程优先级{classBase=base; }

public int getClassBase(){ return classBase; }}

3.process.cpp

#include

#include \"systemProcess.h\"

#include #include #include

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()); //显示进程的优先级

} }}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top