我需要获取通过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 for PID,但我不介意是否有人可以告诉我如何在Linux / Solaris中执行此操作。
非常感谢你!
答案 0 :(得分:2)
知道了。它就像使用:
一样简单#define WINVER 0x0501
#define _WIN32_WINNT 0x0501
和
JNIEXPORT jint JNICALL
Java_GetPid_getPid(JNIEnv *env, jobject obj, jlong handle)
{
return GetProcessId((HANDLE) handle);
}
感谢所有试图提供帮助的人: - )
答案 1 :(得分:1)
我发现此页面可能有用 - http://golesny.de/p/code/javagetpid。它提供了用于在各种平台上提取外部进程PID的代码......有两种方式。
总结:
您可以使用RuntimeMXBean
列出所有正在运行的进程,然后使用模式匹配来挑选与您尝试查找其PID的进程名称相匹配的进程。 (但问题是流程名称不是唯一的......)
在Linux / UNIX上,您可以使用反射将PID从XxxProcess对象中捕获。
在Windows上,您必须使用JNA来获取PID。执行此操作的一些代码位于链接页面上。
如果我这样做,我想我会采取不同的方法。我看看是否可以获取外部命令(或包装器/启动器)来弄清楚PID是什么,然后将其写入父JVM可以读取的地方。