【问题标题】:How to add .so file to the java.library.path in Linux如何在 Linux 中将 .so 文件添加到 java.library.path
【发布时间】:2023-03-18 06:40:02
【问题描述】:

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

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

我想找:

  1. .so 添加到java.library.path 的方法
  2. 如何知道它是否已经添加(添加时)

【问题讨论】:

    标签: linux java.library.path


    【解决方案1】:

    在启动应用程序之前将包含目录添加到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有相关的.jar文件使用这些 java.library.path .so 文件被我的应用程序启动/catalina.sh 的 CLASSPATH 覆盖,因此我的应用程序抱怨 .jars 和相关的 .so 文件。一旦ClASSPATH 具有所需的 .jar 文件以及java.library.path 中所需的 .so 文件,问题就会得到解决。
    • 对于java -XshowSettings:properties 的困惑跑步者。我的java版本打印出属性,然后打印出--help。所以我需要向上滚动才能看到设置。
    • 重要提示是“等号”不能有空格。新手用户可能会直接复制命令并想知道为什么会收到“不是有效标识符”错误。
    【解决方案2】:

    我在弄清楚这一点时遇到了很多麻烦,请确保库名称中有 lib 前缀。

    所以步骤,

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

    2. 重命名库以将 lib 作为前缀。 [将此作为构建脚本的一部分添加]

      mv JNIDemo.so libJNIDemo.so
      

    查看这个答案以获得详细解释https://stackoverflow.com/a/3987567/2076566

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 嗨@Ravindu 我试过你的方法。它不适合我。为了确定,我将权限更改为 777。但是什么也没发生有什么建议吗?
      【解决方案4】:

      我相信这是一种更好的方法,因为它只需要创建一个链接,不需要文件编辑,在运行应用程序之前不需要导出或运行源代码。并且不需要 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 ll 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
      

      【讨论】:

        【解决方案5】:
        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;
                }
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 2012-01-17
          • 1970-01-01
          • 1970-01-01
          • 2018-07-17
          • 1970-01-01
          相关资源
          最近更新 更多