Узнайте, является ли dll 32- или 64-разрядной версией Java

Изнутри своего Java-приложения я хочу выяснить, является ли определяемая пользователем dll 32 или 64-битной, прежде чем пытаться ее загрузить.

Я знаю (программно), является ли JVM, на которой работает мое приложение, 32- или 64-разрядной. Я также знаю (программно), является ли хост Windows или Linux.

Как я могу программно определить, является ли DLL 32 или 64-битной перед вызовом метода «System.loadLibrary ()»?


person Santosh Tiwari    schedule 21.11.2012    source источник
comment
Попытаться загрузить его и проверить исключение, которое он выдает при сбое загрузки?   -  person millimoose    schedule 21.11.2012
comment
Спасибо. Да, я получаю исключение, если что-то не так (зависимости не удовлетворяются, несоответствие разрядности, ...). Содержит ли исключение (трассировка) достаточно релевантной информации, чтобы я мог сделать надежный вывод о разрядности библиотеки DLL?   -  person Santosh Tiwari    schedule 21.11.2012
comment
comment
В Linux вы можете использовать file {library}, возможно, в Windows есть что-то подобное.   -  person Peter Lawrey    schedule 21.11.2012
comment
@SantoshTiwari Я, честно говоря, не уверен. Просто любой менее хакерский метод потребует использования некоторой библиотеки, которая может анализировать двоичный формат .DLL / ELF / любого другого, и использовать правильный для данной платформы, и это просто кажется слишком большим трудом для получения точного результата.   -  person millimoose    schedule 21.11.2012
comment
@TonyHopkinson Можете ли вы указать, как бы вы это сделали в Java?   -  person Peter Lawrey    schedule 21.11.2012
comment
@PeterLawrey Принятый ответ, по-видимому, также не работает для DLL.   -  person millimoose    schedule 21.11.2012
comment
Не java парень, поэтому я бы не стал. Кроме того, я очень простой парень, я бы поставил 64 в имени и занялся чем-нибудь более интересным или важным.   -  person Tony Hopkinson    schedule 22.11.2012
comment
Зачем тебе это нужно знать? Если DLL загружается, используйте ее, в противном случае сообщите об ошибке и выйдите.   -  person user207421    schedule 22.11.2012


Ответы (1)


В окнах для этого требуется труба, подобная этой

dumpbin /headers lib.dll | findstr /i "machine magic"

здесь используется служебная программа dumpbin, которая обычно устанавливается вместе с Visual Studio, findstr - системная служебная программа, я не знаю, существует ли повторно распространяемая версия dumpbin.

Просто выполните эту команду из java и примените базовую проверку сравнения к результату.

person user1797612    schedule 21.11.2012
comment
Если мне нужно запустить отдельный процесс, я знаю, как это сделать на C / C ++ с помощью Win32 API. Мне было интересно, есть ли в Java встроенные функции (API) для определения разрядности библиотеки. - person Santosh Tiwari; 21.11.2012
comment
@SantoshTiwari - формат файла, используемый Windows, в данном случае он называется PE en.wikipedia.org/wiki/Portable_Executable, может быть, если вы запустите google java pe header, вы найдете что-то полезное для себя или для какого-нибудь парня, который уже написал такую ​​утилиту в java. - person user1797612; 21.11.2012