我正在尝试使用 Java ProcessBuilder 和使用 arm64 的 M1 Mac 从 Java 调用一些终端命令。然而,即使我使用arm64兼容的JVM(Zulu 11, 17..)来识别arm64芯片,每当我尝试使用Java ProcessBuilder时,终端似乎正在使用Rosetta。
例如,以下命令返回
x86_64
,而不是预期的 arm64
。
ProcessBuilder pb = new ProcessBuilder();
pb.command(new String[] {"bash", "-c", "uname -m"});
Process proc = pb.start();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String text = "";
String line;
while ((line = input.readLine()) != null) {
text += line + System.lineSeparator();
}
bufferedReader.close();
System.out.println(text);
你知道是否有任何其他方式从Java执行终端命令实际上使用arm64芯片而不是模拟的Intel芯片?
问候,
卡洛斯
默认情况下,任何进程都将继承生成它的进程的体系结构(如果该体系结构的切片在二进制文件中可用)。
如果您从 Java 生成的进程以 x86_64 运行,则表明您的 Java 进程以 x86_64 运行,如果您没有显式调用它,则进一步表明您的 shell、终端、IDE 或其他任何进程您从中生成它,也以 x86_64 身份运行。
在系统调用层,可以使用 Apple 专有的
posix_spawnattr_setbinpref_np()
覆盖此行为,以在使用 posix_spawn()
时选择通用二进制文件中的首选架构切片。
在命令行上,通过
arch
命令支持:
arch -arm64 uname -m
arch -x86_64 uname -m
所以在你的代码中,应该是这样的:
{"arch", "-arm64", "bash", "-c", "uname -m"}
您还可以将多个架构选择器传递给
arch
命令以按该顺序尝试,因此,如果您希望代码尽可能在 arm64 或 x86_64 主机上生成本机二进制文件,您可以使用:
{"arch", "-arm64", "-x86_64", "bash", "-c", "uname -m"}