如何使用Java Native Access为Java.exe以外的进程设置进程关联?

虽然手动操作相当容易,但是我试图在Windows 7中为各种虚拟机初始创build时间自动设置cpu亲和性。 该项目是在Java中,我试图避免直接包括C代码,所以我一直在使用Java Native Access,它掩盖像winapi的东西。 我是图书馆的新手,虽然有一些基本的快速Googlesearchfunction,但还是缺乏教程或示例。

使用下面的代码,我可以设置主要Java进程的亲和性(本地的ffffffffffffffff),但其他进程仍然完全不受影响,即使我有权限使用任务pipe理器手动设置亲和力。 我也重复了从0到10000的所有整数,而不是input我知道有效的ID。

主要课程:

import com.sun.jna.Native; import com.sun.jna.Pointer; import com.sun.jna.platform.win32.WinNT.HANDLE; public class SetAffinity { public static void main(String[] args){ int pid = -1; AffinityKernel instance = (AffinityKernel)Native.loadLibrary("Kernel32",AffinityKernel.class)); System.out.println(instance.SetProcessAffinityMask(new HANDLE(new Pointer(pid)), 1)); } } 

工具界面:

 import com.sun.jna.platform.win32.Kernel32; import com.sun.jna.platform.win32.WinNT.HANDLE; public interface AffinityKernel extends Kernel32{ public boolean SetProcessAffinityMask(HANDLE hProcess, int dwProcessAffinityMask); } 

由于我可以检查它正确设置它正在运行的进程的CPU亲和力,我知道语法是正确的。

问题是:

除了当前stream程,我如何访问/引用stream程?

你正在寻找的另一个例程是OpenProcess ,它允许你获得另一个进程的句柄,然后你可以在SetProcessAffinityMask使用它。 呼叫签名:

 HANDLE OpenProcess(DWORD dwDesiredAccess, BOOL bInheritHandle, DWORD dwProcessId); 

它已经在coreel32接口中公开了。

使用JNA来确定其他java进程的进程ID 已被问及 ,应该是可以理解的。