java - 使用 JNI 获取运行时进程的 PID

标签 java runtime pid

我需要获取通过 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/

相关文章:

java - 启动 Program Files 文件夹中的程序

c - 我的 pid 标识符不是预期的

linux - 长时间运行的进程远程终止?

javadoc: "package [...] does not exist"用于没有文档的外部引用

java - JavaRMI 应用程序中的 SSL 握手错误

java - JPA 2.1 hibernate 一对多约束违反重复条目

r - 具有多个条件的 if 语句更好,还是更多 else if 语句更好?

c# - 为运行时初始化传递一个通用(模板)类

java - 如何防止 ImageView 以编程方式调整大小以适合屏幕?

c - 知道pid时如何在C中终止进程