2011-03-27 65 views
3

可能重复:
Java : switching between dll depends on system architecture (32/64)加载32位或64位JNI库中的Java

在我的Java应用程序,我需要一个JNI库,可用于32位和64位。我不想发布两个不同版本的应用程序,所以我想用两个库发布应用程序,应用程序必须确定自己要加载哪个库(foobar32.so或foobar64.so)。我怎么做?

我想加载第一个,如果这会抛出一个异常,然后我加载第二个,但这听起来很难看。

是否有一些系统属性,我可以检查,而不是确定是否使用32位Java或64位Java来运行我的应用程序?我知道有一些os.arch属性,但根据this answer,返回值似乎非常不可预测。

那么让应用程序决定是否加载32位或64位JNI库的最佳方式是什么?

+0

您是如何捆绑应用程序的?在OSGi中,您只能根据操作系统体系结构加载某些软件包或打包碎片。这是如何交付平台特定功能的。你可以考虑使用OSGi吗? – katsharp 2011-03-27 12:04:18

+0

您的主要关注点不是操作系统是什么,而是可执行文件是什么:您可以在64位操作系统上运行32位可执行文件,但它仍然是32位,而您需要的库是32位而不是64.如果假设您可以在某个32位上运行64位可执行文件操作系统,你需要64位库。这是przemelek试图解释的。 “os.arch”对于任何事物来说都是足够好的,只要它存在,我的回答就是针对不安全的情况,但某些系统属性可能不存在。 – bestsss 2011-03-27 14:12:47

回答

5

为什么不可预测?你只想检测它是否是32位系统,在这种情况下,它总是x86(当然对于x86处理器),其他的意味着64位。

如果您知道您的代码也可能在PPC或其他非x86处理器上执行,则会出现问题。但在这种情况下,您可能会使用带有异常驱动流控制的丑陋攻击,并使用try {} catch()来“检测”这种情况。

恕我直言os.arch将是最好的解决方案。

+0

@przemelek - 'os.arch'是不可靠的,因为它返回用于编译jar的系统属性,而不是它运行的系统(参见我的回答链接) – MByD 2011-03-27 13:00:32

+1

@MByD:不,系统属性' os.arch' ---所有的Java系统属性---是一个运行时的概念,而不是编译时的概念。因此,它返回运行时体系结构。 – jmg 2011-03-27 13:03:12

+0

@jmg。我犯了一个错误。 os.arch的返回值是运行时的值,但是它依赖于JRE的位数,而不是实际的体系结构,所以如果你有一个在64位Windows机器上运行的32位JRE,你会得到'x86'作为结果。看到这篇文章:http://mark.koli.ch/2009/10/javas-osarch-system-property-is-the-bitness-of-the-jre-not-the-operating-system.html – MByD 2011-03-27 13:09:43

0

Unsafe.addressSize();

报告大小在天然指针的字节,作为经由{@link #putAddress}存储。此值将为4或8.

您可以从此处将其取出。

+0

如果你的意思是_sun.misc.Unsafe_,那么这是一件坏事,因为其他Java实现不提供它。 – kayahr 2011-03-27 15:08:59

+0

@ kayahr,让本机库在不带安全性的Java版本上工作的几率几乎没有。 – bestsss 2011-03-27 15:17:20