2015-12-18 15 views
0

我正在开发加载本机库文件以执行一些计算的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位机器上运行?

+0

我很困惑。用于将C文件编译为64位dll的64位JVM?虽然Andrew原则上是正确的,但只需指示您的C编译器为您支持的最低CPU(或所有x86_64 CPU)生成代码,并避免在您支持的最低版本的Windows之后引入OS调用。 –

回答

0

除了bitness是.dll机器/处理器类型具体在某种其他方式吗?

正是这样。在操作系统下运行的任何编译的二进制文件既是处理器又是操作系统的特定版本,有时甚至是每个版本的特定版本。

不同的处理器 - 即使是在同一个家庭,如“86” - 可以提供不同的指令集和能力。查看https://en.wikipedia.org/wiki/X86_instruction_listings,查看刚刚x86指令集和功能的不同变体列表。如果编译后的二进制文件使用特定的指令,它将不会在不执行该指令的处理器上运行。例如,如果二进制文件被编译为使用SSE3指令,它将不会在不执行SSE3的处理器上运行。

而且它不只是限于硬件,无论是。对于初学者来说,操作系统的细节也很重要,因为操作系统是启动运行过程的原因。所以二进制文件需要在启动它的操作系统的条件和环境下工作。设计为在操作系统下工作的二进制文件还需要调用该操作系统以与数据,设备或其他进程交互。不同的操作系统以完全不同的方式提供这些功能,甚至在相同的基本操作系统的不同版本中以不兼容的方式进行操作。

并非设计为在操作系统下运行的二进制文件必须提供非常特定于硬件的功能 - 有没有注意到任何操作系统有多少个设备驱动程序?这排除了任何共享对象或DLL,因为根据定义,它们已被设计为在操作系统下运行。

还是在理论上,如果一个.dll是64位,它应该是使用64位JVM每64位 计算机上运行?

现在应该清楚,答案是“甚至不接近”。

+0

嗨,谢谢你的回答。你的回答证实了我的想法。我想我们能做的最好的事情是为最常见的处理器生成dll。但我不清楚如何识别不同的处理器。例如,对于我在问题中提到的两台笔记本电脑,两者都表明它们具有相同的处理器,但显然它们之间存在差异。一个额外的信息,我认为所有未能加载预编译dll的机器都贴有“intel Core i5”标签。 – user3441604

+0

继续我以前的评论:我们可以使用“英特尔酷睿i5”处理器(这似乎是一个处理器不能使用现有的dll)生成一个dll,但其他dll应该包含在发行版中?注意:该发行版还包含源代码,它允许最终用户自己编译dll,但这会给最终用户带来很大的责任。 – user3441604

+0

除非您正在进行性能关键型处理,否则最好的办法是为“最低公分母”CPU架构生成所有库。事情可能会慢一点,但他们会跑。对于GCC,可以将'-march'标志设置为'core2'(请参阅https://gcc.gnu.org/onlinedocs/gcc-4.5.3/gcc/i386-and-x86_002d64-Options.html) ,而对于MS编译器,请参阅http://stackoverflow.com/questions/23259531/what-is-the-minimum-target-cpu-architecture-for-the-various-versions-of-visual-s这比试图提供特定于架构的库。 –

相关问题