我为java桌面开发了一个JNI动态库。目前它适用于MacOS和Windows,但在Linux上我有一种奇怪的行为。
我将库编译为32位和64位,但是当我只放入64位库并且我调用System.loadLibrary (myLibrary);
时它无法找到它,但是在我只添加了它能找到32位(我把它命名为libMyLibrary.so)。
所以我的问题是,对于32位,我需要将其命名为libMyLibrary.so
,但它应该如何命名为64位架构?我应该根据体系结构编写一些加载正确库的代码吗?
谢谢!
答案 0 :(得分:0)
标准解决方案是将32位和64位版本(以及其他架构)放在不同的目录中,并确保java.library.path指向正确的版本。
答案 1 :(得分:0)
您的JVM应该加载什么版本的库取决于运行代码的JVM版本以及os体系结构。 32位JVM应加载32位库,64位应加载库64位。
我有安装了两个JVM的Ubuntu 64位操作系统。一个是64位
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
另一个是32位
$ /opt/jdk1.7.0_72/bin/java -version
java version "1.7.0_72"
Java(TM) SE Runtime Environment (build 1.7.0_72-b14)
Java HotSpot(TM) Server VM (build 24.72-b04, mixed mode)
我使用以下代码为在不同JVM中运行的app加载库。
static {
if (System.getProperty("os.name").equals("Linux")) {
if (System.getProperty("os.arch").equals("i386")) {
System.out.println("loading i386 library");
} else if (System.getProperty("os.arch").equals("amd64")) {
System.out.println("loading x86_64 library");
}
}
}