1

我需要获取通过 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 中执行此操作。

非常感谢您!

4

2 回答 2

2

知道了。它就像使用一样简单:

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501

JNIEXPORT jint JNICALL
Java_GetPid_getPid(JNIEnv *env, jobject obj, jlong handle)
{
  return GetProcessId((HANDLE) handle);
}

感谢所有试图提供帮助的人:-)

于 2013-03-16T16:52:30.377 回答
1

我发现这个页面可能有用 - http://golesny.de/p/code/javagetpid。它提供了用于在各种平台上提取外部进程 PID 的代码......以几种方式。

总之:

  • 您可以使用RuntimeMXBean列出所有正在运行的进程,然后使用模式匹配来挑选一个与您要查找其 PID 的进程的名称相匹配的进程。(但问题是进程名称不是唯一的......)

  • 在 Linux / UNIX 上,您可以使用反射从 XxxProcess 对象中找出 PID。

  • 在 Windows 上,您必须使用 JNA 来获取 PID。执行此操作的一些代码位于链接页面上。


如果我这样做,我想我会采取不同的方法。我会看看是否有可能让外部命令(或包装器/启动器)找出 PID 是什么,然后将其写入父 JVM 可以读取的位置。

于 2013-03-10T08:26:13.273 回答