微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

尽管手动操作相当容易,但我尝试在初始创建时间后为各种VM自动设置Windows 7中的cpu亲和性.该项目是Java,我试图避免直接包含C代码,所以我一直在使用Java Native Access,它掩盖了像winapi这样的东西.我是图书馆的新手,虽然通过快速谷歌搜索可以找到一些基本版本,但它在教程或示例中有点缺乏.

使用以下代码,我可以设置主Java进程的亲缘关系(本地ffffffffffffffff),但其他进程仍然完全不受影响,即使我有权使用任务管理器手动设置关联.我还迭代了从0到10000的所有整数,而不是只输入我知道有效的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亲和性,我知道语法是正确的.

问题是:

除当前流程外,如何访问/引用流程?

解决方法:

您正在寻找的另一个例程是OpenProcess,它允许您获取一个进程的HANDLE,然后您可以在SetProcessAffinityMask中使用该进程.主叫签名:

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

它已经在Kernel32接口中公开了.

使用JNA has been asked already确定其他java进程的进程ID,应该是可以理解的.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐