我可以将本地库的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。
您可以选择不添加它们,然后在您需要它们之前(例如,当您的应用程序启动时),根据当前系统体系结构加载正确的一个。
你可以用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)?
我目前无法更改java代码,但我正在对构建脚本进行排序,因此我将使用Gradle来确定构建是否为64位/ 32位,直到我可以修改要加载的代码正确的图书馆。 – chrisw 2014-08-28 09:21:03
我目前无法更改java代码,但我正在对构建脚本进行排序,因此我将使用Gradle来确定构建是否适用于64位/ 32位,直到我可以修改代码以加载正确的代码图书馆。 – chrisw 2014-08-28 09:20:37