【问题标题】:Error while loading shared libraries; cannot open shared object file: No such file or directory加载共享库时出错;无法打开共享对象文件:没有这样的文件或目录
【发布时间】:2015-06-07 17:50:16
【问题描述】:

在 Ubuntu 操作系统上从 java 类加载共享库 (JNI) 时遇到问题

Exception in thread "main" java.lang.UnsatisfiedLinkError: /opt/ETcpsdk/lib/linux-x86_64/libjcryptoki.so: libcryptoki.so: cannot open shared object file: No such file or directory
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1880)
    at java.lang.Runtime.loadLibrary0(Runtime.java:849)
    at java.lang.System.loadLibrary(System.java:1088)
    at tutorialjni.Test.<clinit>(Test.java:7)

-Test.java

package tutorialjni;

public class Test {

    // Load an external library, called "jcryptoki"
    static {
        System.loadLibrary("jcryptoki");
    }

    public static void main(String[] args) {
        System.out.println(System.getProperty("java.library.path"));
    }

}

- LD_LIBRARY_PATH 分配在 /etc/environment

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
JAVA_HOME="/opt/jdk1.7.0_75"
LD_LIBRARY_PATH="/opt/ETcpsdk/lib/linux-x86_64:/opt/ETcpsdk/lib/"

我拥有 ETcpsdk 文件夹。

  • libcryptoki.so 放入 /opt/ETcpsdk/lib/linux-x86_64/libcryptoki.so

  • 运行file libcryptoki.so命令

    libjcryptoki.so:ELF 64 位 LSB 共享对象,x86-64, 版本 1 (SYSV),动态链接,未剥离

- JDK 版本:

java version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)

- Ubuntu:

Distributor ID: Ubuntu
Description:    Ubuntu 14.04.2 LTS
Release:    14.04
Codename:   trusty

我将库目录添加到 ldconfig 缓存

你能帮帮我吗?

【问题讨论】:

    标签: java ubuntu java-native-interface shared-libraries unsatisfiedlinkerror


    【解决方案1】:

    我遇到了这个问题,因为我的共享库依赖于另一个无法正常工作的共享库。

    【讨论】:

    • 我遇到了类似的问题:Test.java 依赖于 libfoo.so,而 libfoo.so 又依赖于 libbar.so。你是怎么解决的?
    【解决方案2】:

    如果您在 Linux 中遇到这种情况,通常有 3 个主要原因:

    1. 您的库依赖于环境 PATH。

    解决方案: 将路径变量设置为 .bashrc,以便在启动时加载。 重新启动 Linux 或运行 . ~/.bashrc.

    1. 库文件符号链接已损坏。 Linux 应用程序用于在集中位置创建文件作为符号链接,而不是将它们指向专用路径的实际文件。

    解决方案:检查您的库文件是否作为链接存在,以及它是否指向有效文件。

    1. 用户访问权限不足。

    当我的 Web 应用程序在 Linux 中由用户登录但访问权限不足时启动时,我遇到了这个错误。此错误通常伴随着其他错误/异常,尤其是来自您的应用程序服务器,即 Tomcat:

    org.apache.catalina.LifecycleException: 初始化组件失败...

    org.hibernate.engine.jdbc.internal.LobCreatorBuilder - HHH000424:禁用上下文 LOB 创建作为 createClob() 方法抛出错误:java.lang.reflect.InvocationTargetException

    解决方案: 停止您的 Web / 应用程序服务器当前实例。 使用超级用户或具有足够访问权限的用户(即 root)登录 重新启动服务器或再次调用之前的函数。

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2015-02-27
      • 2012-05-10
      相关资源
      最近更新 更多