Linux上64位架构的JNI库名

时间:2015-03-19 22:10:27

标签: java c++ c linux java-native-interface

我为java桌面开发了一个JNI动态库。目前它适用于MacOS和Windows,但在Linux上我有一种奇怪的行为。

我将库编译为32位和64位,但是当我只放入64位库并且我调用System.loadLibrary (myLibrary);时它无法找到它,但是在我只添加了它能找到32位(我把它命名为libMyLibrary.so)。

所以我的问题是,对于32位,我需要将其命名为libMyLibrary.so,但它应该如何命名为64位架构?我应该根据体系结构编写一些加载正确库的代码吗?

谢谢!

2 个答案:

答案 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");
        }
    }
}