【发布时间】:2015-12-18 09:27:12
【问题描述】:
我正在开发一个加载本地库文件以执行一些计算的 Java 应用程序。应用程序使用 JNI 加载库。此应用程序应可在 Windows 和 Linux 环境(32 位和 64 位)上运行。
在编译过程中,我们将 C 代码编译为库文件(Windows 为 32 位和 64 位 dll,Linux 环境为 32 位和 64 位 .so 文件)。这些 .dll 和 .so 文件包含在分发文件中,并在使用 -Djava.library.path 参数调用 Java 时被引用。
我现在正在几台不同的机器上测试该应用程序。我最初专注于 64 位 Windows 环境。我遇到的奇怪的事情是,在一些 64 位机器上,应用程序成功加载了正确的 .dll 文件,但在其他一些机器上却没有加载 .dll。
我认为问题可能是因为机器之间的处理器类型不同(即 dll 是为一种处理器类型编译的,而其他处理器类型不能使用它们)。
但是,它可以在一台机器上运行,而不能在具有相同处理器的另一台机器上运行:
它可以在运行 Windows 7 64 位的 HP 笔记本电脑上运行,使用此处理器:
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
我的问题是:除了位数之外,.dlls 机器/处理器类型是否以其他方式特定? (我知道.dll文件必须匹配机器的位数,JVM也必须匹配.dll文件的位数)
或者理论上,如果 .dll 是 64 位的,它应该在每台使用 64 位 JVM 的 64 位机器上运行吗?
【问题讨论】:
-
我很困惑。 64位JVM用来把C文件编译成64位dll?虽然 Andrew 原则上是正确的,但只需指示您的 C 编译器为您支持的最低 CPU(或所有 x86_64 CPU)生成代码,并避免在您支持的最低版本 Windows 之后引入操作系统调用。
标签: dll linker java-native-interface processor building