在Linux中如何将.so文件添加到java.library.path?

54

我正在使用一个需要在windows的java.library.path中有.dll文件的Java应用程序。为了在Linux中运行相同的应用程序,我需要将对应的.so文件添加到linux机器上的java.library.path中。目前我还没有找到任何简单的解决方案。

我将.so文件放在已经在类路径中的文件夹里,但是我的应用程序仍然抱怨在java.library.path中没有所需的.so文件。

我想知道以下内容:

  1. 如何将.so添加到java.library.path
  2. 如何确定是否已经添加(当已添加时)
5个回答

82
在启动应用程序之前,将包含目录添加到LD_LIBRARY_PATH中。
        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/some/pathOfContainingDirectory

使用 java -XshowSettings:properties 命令来显示 java.library.path (以及其他) 的值。


谢谢Jose,这对我很有帮助。 我甚至通过这个java.library.path找到了其他重要的东西。 这个路径在重新启动系统后会丢失,所以我通过/etc/profile文件添加它,这样当系统重新启动时就会自动添加, 即使CLASSPATH使用这些java.library.path .so文件相关的.jar文件被我的应用程序初始化/catalina.sh的CLASSPATH覆盖,因此我的应用程序抱怨.jars和相关.so文件。 一旦ClASSPATH具有所需的.jar文件,并且java.library.path中具有所需的.so文件,则问题得到解决。 - Lihkinisak
2
对于运行 java -XshowSettings:properties 的困惑者。我的 Java 版本会先打印出属性,然后再打印出 --help。因此我需要向上滚动才能看到设置。 - Tarrasch
重要提示是不要在“等于”符号处留空格。新手用户可能会直接复制命令,然后想知道为什么会出现“无效标识符”的错误。 - Abdel Aleem

8

我在解决这个问题时遇到了许多困难,请确保库名前缀为lib

因此,步骤如下:

  1. export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/some/pathOfContainingDirectory"

  2. Rename libraries to have lib as a prefix. [Add this as part of build script]

    mv JNIDemo.so libJNIDemo.so
    

请查看此答案以获取详细解释:https://dev59.com/GG865IYBdhLWcg3wKLb6#3987567


3

我使用了java -XshowSettings:properties方法,找到之前设置的文件夹路径并将我的so文件复制到该文件夹中。


1
嗨@Ravindu,我尝试了你的方法。对我没用。我把权限改成了777只是为了确保。但什么也没有发生,有什么建议吗? - Utsav Gupta

1
我认为这是更好的方法,因为它只需要创建一个单一的链接,不需要编辑文件,不需要导出或运行源代码即可运行应用程序。也不需要bashrc行。
话虽如此,如果您升级可能会导致未来Java版本的意外错误,因为它可能会加载过时的库,但是删除一个链接也可以解决这个问题。
这适用于已安装Java 11 OpenSDK的Ubuntu 18.04。
$ locate libjawt.so
$ java -XshowSettings:properties

从上述两个命令中,您可以找到需要调整为您自己系统的两个路径。

sudo ln -s /path/from/locate/libjawt.so /path/from/properties/libawt.so

我为Java Open SDK创建了一个符号链接,以便找到库文件,我的操作如下,因为 /usr/lib 是输出路径之一。如果你想将Java库(甚至符号链接)放在一起,可以选择使用输出中的Java路径,而不是 /usr/lib。
sudo ln -s /usr/lib/jvm/java-11-openjdk-amd64/lib/libjawt.so /usr/lib/libjawt.so

0
File file = null;
private String[] libs_path = System.getProperty("java.library.path").split(":");
public boolean isInstalled() {
    boolean isInstalled = false;
    for(String lib : libs_path) {
            file = new File(lib+"/"+"yourlib.so");
            if(file.exists()) {
                isInstalled = true;
                break;
            }
        }
    return isInstalled;
}


public void install() {
    if(!isInstalled) {
        for(String lib: lib_path) {
             // copy your .so to lib
             break;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接