2013-03-10 147 views
1

我需要获取通过Java的Runtime.getRuntime()。exec()命令启动的进程的PID。使用JNI获取运行时进程的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中执行此操作。

非常感谢您提前!

+0

@Jermaine徐:我不需要当前Java的PID进程,但是通过exec()执行的那个进程。换句话说:我需要使用“jlong​​ handle”参数来获取PID。我需要它的Windows。平台独立性会很好,但我想它很复杂。 – Roland 2013-03-10 07:59:55

+0

@Taky:谢谢,我已经去过了。这不是我要找的。我不需要Java进程的PID,并且建议的JNA对此很重要。 – Roland 2013-03-10 08:01:47

回答

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

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

总结:

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

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

  • 在Windows上,您必须使用JNA来获取PID。一些代码可以在链接页面上执行。


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

+0

谢谢你,已经在那里。模式匹配没有问题,因为我使用相同的名称启动多个进程。上面的代码使用JNA,但我不能使用它。实际上,我需要的只是一种从数字句柄而不是HWND获取PID的方法。或者更确切地说是一种从句柄号码中获取HWND的方法,因为我可以使用GetWindowThreadProcessId来获取PID。 – Roland 2013-03-10 08:30:40

+0

你的意思是“不能使用JNA”或“不想使用JNA”?在前一种情况下,为什么不呢? – 2013-03-10 08:35:33

+0

不能,因为公司的政策:“没有第三方图书馆”... – Roland 2013-03-10 08:36:28