我需要获取通过 Java 的 Runtime.getRuntime().exec() 命令启动的进程的 PID。
我知道如何在 JNA 中执行此操作。但我真的很想用 JNI 来做,并创建我自己的库。有谁知道怎么做吗?
import java.lang.reflect.Field;
class GetPid
{
public native int getPid( long procHandle);
static
{
System.loadLibrary("getpid");
}
public static void main(String args[])
{
try {
Process process = Runtime.getRuntime().exec( "calc");
Field f = process.getClass().getDeclaredField( "handle");
f.setAccessible( true);
long procHandle = f.getLong( process);
System.out.println( "prochandle: " + procHandle + ", pid: " + new GetPid().getPid( procHandle));
} catch( Exception e) {
e.printStackTrace();
}
}
}
但是 C 部分应该是什么样子的?
JNIEXPORT jint JNICALL
Java_GetPid_getPid(JNIEnv *env, jobject obj, jlong handle)
{
...
return ???;
}
如果有人能帮助我,那就太好了。我主要寻求 Windows 解决方案,因为您可以从 Process 字段获取 Linux 的 PID,但我不介意是否有人可以告诉我如何在 Linux/Solaris 中也这样做。
非常感谢您!
最佳答案
明白了。就像使用一样简单:
#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
和
JNIEXPORT jint JNICALL
Java_GetPid_getPid(JNIEnv *env, jobject obj, jlong handle)
{
return GetProcessId((HANDLE) handle);
}
感谢所有试图提供帮助的人:-)
关于java - 使用 JNI 获取运行时进程的 PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15319947/