我可以在Java中使用BuildProcess调用arm64进程吗?

问题描述 投票:0回答:1

我正在尝试使用 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 apple-m1 arm64 processbuilder rosetta
1个回答
2
投票

默认情况下,任何进程都将继承生成它的进程的体系结构(如果该体系结构的切片在二进制文件中可用)。

如果您从 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"}
© www.soinside.com 2019 - 2024. All rights reserved.