我正在开发加载本机库文件以执行一些计算的Java应用程序。该应用程序使用JNI来加载库。此应用程序应该可以在Windows和Linux环境(32位和64位)上运行。除了“bitness”之外,还有某些特定于机器/处理器类型的.dll文件?
在编译过程中,我们编译的C代码库文件(32位和64位的DLL适用于Windows和32位和64位的.so文件为Linux环境)。这些.dlls和.so文件包含在分发文件中,并且在通过使用-Djava.library.path参数调用Java时被引用。
我现在正在测试在几个不同的机器上的应用。我最初专注于64位Windows环境。我遇到的奇怪之处在于,在某些64位机器上,应用程序成功加载了正确的.dll文件,但在其他一些机器上却不加载.dll文件。
我认为这个问题可能是因为在机器(即该dll文件被编译为一个处理器类型和其他处理器类型不能使用它们)之间的处理器类型的差别。
但是,它的工作原理一台机器上,并且具有相同的处理器,另一台机器上不工作:
它适用于运行Windows 7 64位的惠普笔记本电脑,采用该处理器:
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 37 Stepping 5, GenuineIntel
它不上的联想笔记本电脑上工作运行Window 7的64位,在该处理器:
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
我的问题是:除了位数是的.dll机/处理器类型规范其他方面有什么不同? (我知道.dll文件必须匹配机器的位数,并且JVM还必须匹配.dll文件的位数)
或者理论上,如果.dll是64位,在每个使用64位JVM的64位机器上运行?
我很困惑。用于将C文件编译为64位dll的64位JVM?虽然Andrew原则上是正确的,但只需指示您的C编译器为您支持的最低CPU(或所有x86_64 CPU)生成代码,并避免在您支持的最低版本的Windows之后引入OS调用。 –