linux上64位体系结构的JNI库名称

JNI library name for 64 bit architecture on linux

本文关键字:JNI 64位 体系结构 linux      更新时间:2023-10-16

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

我已经为32位和64位编译了库,但当我只放入64位库并调用System.loadLibrary (myLibrary);时,它找不到它,但在32位架构中,当我只添加32位时,它能找到它(我将其命名为libMyLibrary.so)

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

谢谢!

标准解决方案是将32位和64位版本(以及其他体系结构)放在不同的目录中,并确保java.library.path指向正确的目录。

JVM应该加载哪个版本的库取决于代码运行的JVM版本以及操作系统体系结构。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中运行的应用程序加载库。

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