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 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()); //显示进程的优先级 } }} 因篇幅问题不能全部显示,请点此查看更多更全内容