我可以将本地库的32位和64位版本放在java.library.path上吗?

问题描述:

是否可以将两个版本(64位和32位)的本机DLL放在java.library.path上?我可以将本地库的32位和64位版本放在java.library.path上吗?

我关心的是,如果我将64位和32位版本放在本机库路径上,那么在运行不同的体系结构时会出现不满意的链接异常。如果是这样,那么首选解决方案是什么?在我的gradle/maven构建脚本中有一个标志链接正确的库?

目前我做的是以下几点: -

-Djava.library.path=/out/lib/win64jdk;/out/lib/winx86jdk 

两者都含有的架构相关的DLL。我目前还不确定JVM是否可以确定这些符号。

如果我是你,我会确保只有适当的本地dll是在分发包并把另一个留下。

如果您想分配两者,那么您需要编写一些Java代码来加载正确的库。 System.loadLibrary用于加载本机库,并且正常的事情是在Java代码中的静态初始化程序中调用它。

除非你愿意粗暴地依靠例外,您可以使用此代码:

System.getProperty("sun.arch.data.model") 

加载适当的本地库。该功能将相应地返回32或64。

+0

我目前无法更改java代码,但我正在对构建脚本进行排序,因此我将使用Gradle来确定构建是否适用于64位/ 32位,直到我可以修改代码以加载正确的代码图书馆。 – chrisw 2014-08-28 09:20:37

您可以选择不添加它们,然后在您需要它们之前(例如,当您的应用程序启动时),根据当前系统体系结构加载正确的一个。

你可以用System.loadLibrary()加载:

boolean is64bit = ...; // See below how to detect 
System.loadLibrary("/out/lib/win" + (is64bit ? "64jdk" : "x86jdk")); 

检测体系结构:

How can I tell if I'm running in 64-bit JVM or 32-bit JVM (from within a program)?

+0

我目前无法更改java代码,但我正在对构建脚本进行排序,因此我将使用Gradle来确定构建是否为64位/ 32位,直到我可以修改要加载的代码正确的图书馆。 – chrisw 2014-08-28 09:21:03