Отказ от ответственности: пожалуйста, не отрицайте это как дубликат ответа, так как я хотел бы поделиться своим решением Java-кода с этим (один похож на нативный код).
Я хотел бы добавить к ответу мистера Джеймса Ван Хьюиса;
Так как собственность os.arch:
System.getProperty("os.arch");
возвращает битность JRE, это может быть очень полезно.
Из статьи:
В вашем коде сначала нужно проверить размер IntPtr, если он возвращает 8, значит, вы работаете в 64-битной ОС. Если он вернет 4, значит, вы работаете с 32-битным приложением, поэтому теперь вам нужно знать, работаете ли вы в нём или под WOW64.
Следовательно, проверка размера IntPtr - это та же проверка, которую вы выполняете, просматривая «os.arch». После этого вы можете приступить к выяснению, работает ли процесс изначально или под WOW64.
Это можно сделать с помощью библиотеки jna (например, NativeLibrary ), которая предлагает использование необходимых вам нативных функций.
//test the JRE here by checking the os.arch property
//go into the try block if JRE is 32bit
try {
NativeLibrary kernel32Library = NativeLibrary.getInstance("kernel32");
Function isWow64Function = kernel32Library.getFunction("IsWow64Process");
WinNT.HANDLE hProcess = Kernel32.INSTANCE.GetCurrentProcess();
IntByReference isWow64 = new IntByReference(0);
Boolean returnType = false;
Object[] inArgs = {
hProcess,
isWow64
};
if ((Boolean) isWow64Function.invoke(returnType.getClass(), inArgs)) {
if (isWow64.getValue() == 1) {
//32bit JRE on x64OS
}
}
} catch (UnsatisfiedLinkError e) { //thrown by getFunction
}
Нечто подобное может также работать, но я бы порекомендовал первую версию, поскольку она была протестирована на x64 и 32-битной JRE на x64 OS. Также это должно быть более безопасным способом, потому что в следующем вы фактически не проверяете, существует ли функция «IsWow64Process».
Здесь я добавляю пример проверки JRE, чтобы она была завершена, хотя ее не сложно найти.
Map<String, Integer> archMap = new HashMap<String, Integer>();
archMap.put("x86", 32);
archMap.put("i386", 32);
archMap.put("i486", 32);
archMap.put("i586", 32);
archMap.put("i686", 32);
archMap.put("x86_64", 64);
archMap.put("amd64", 64);
//archMap.put("powerpc", 3);
this.arch = archMap.get(SystemUtils.OS_ARCH);
if (this.arch == null) {
throw new IllegalArgumentException("Unknown architecture " + SystemUtils.OS_ARCH);
}