Я работаю над разработкой приложения Java, которое загружает файлы собственных библиотек для выполнения некоторых вычислений. Приложение использует JNI для загрузки библиотек. Это приложение должно работать в средах Windows и Linux (как на 32-битных, так и на 64-битных).Помимо «битности», есть DLL-файлы, специфичные для типа машины/процессора, в некотором роде?
В процессе компиляции мы скомпилируем код C в файлы библиотеки (32-разрядные и 64-разрядные библиотеки для Windows и 32-разрядные и 64-разрядные .so-файлы для Linux-сред). Эти файлы .dll и .so включены в файл распространения и упоминаются при вызове Java с использованием параметра -Djava.library.path.
Теперь я тестирую приложение на нескольких разных машинах. Сначала я ориентирован на 64-разрядные среды Windows. Странная вещь, с которой я столкнулся, заключается в том, что на некоторых 64-битных машинах приложение загружает правильные файлы .dll, но на некоторых других машинах он не загружает DLL.
Я думал, что проблема может быть связана с различием в типе процессора между машинами (то есть, что dlls были скомпилированы для одного типа процессора и других типов процессоров, они не могут их использовать).
Однако, он работает на одной машине, и не работает на другом компьютере, который имеет тот же процессор:
Он работает на ноутбуке HP под управлением Windows 7 64-бит, с этим процессором:
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 37 Stepping 5, GenuineIntel
это не работает на ноутбуке Lenovo работает Windows 7 64-бит, с этим процессором:
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
Мой вопрос: помимо разрядности являются библиотек .dll машина/процессор Тип спецификации по-другому? (Я знаю, что файлы .dll должны соответствовать битности машины и что JVM также должен соответствовать битте .dll-файлов)
Или теоретически, если .dll 64-бит, если он запустить на КАЖДОЙ 64-разрядной машине, использующей 64-битную JVM?
Я смущен. 64-разрядная JVM используется для компиляции файлов C в 64-разрядную dll? Хотя Эндрю прав в принципе, просто поручите своему компилятору C генерировать код для самого низкого поддерживаемого процессора (или всех процессоров x86_64) и избегать вызовов ОС, представленных после самой низкой версии Windows, которую вы поддерживаете. –