【问题标题】:Unable to load so file from Java in Eclipse On Ubuntu无法在 Ubuntu 上的 Eclipse 中从 Java 加载 so 文件
【发布时间】:2013-10-03 03:46:55
【问题描述】:

我有一些代码尝试加载 C 库,如下所示:-

public ThreadAffinity() {
    ctest = (CTest) Native.loadLibrary("ctest", CTest.class);
}

但是在尝试构建项目时出现以下错误;我得到的错误如下:-

UnsatisfiedLinkError: Unable to load library 'libctest': liblibctest.so: cannot open shared object file: No such file or directory
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:166)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:239)
    at com.sun.jna.Library$Handler.<init>(Library.java:140)
    at com.sun.jna.Native.loadLibrary(Native.java:393)
    at com.sun.jna.Native.loadLibrary(Native.java:378)
    at com.threads.ThreadAffinity.<init>(ThreadAffinity.java:11)
    at com.threads.ThreadAffinity.main(ThreadAffinity.java:45)

当前工作目录是项目的根目录,也是so文件所在的位置。我还尝试修改 LD_PRELOAD 变量以指向我的 so 文件;但是错误仍然存​​在。

它在我的 OSX 上运行良好,其中 dylib 正好位于 so 文件当前所在的位置(项目根目录)。 我做错了什么?

【问题讨论】:

    标签: linux ubuntu shared-libraries jna


    【解决方案1】:

    来自异常:

    UnsatisfiedLinkError: Unable to load library 'libctest': liblibctest.so: cannot open shared object file: No such file or directory
    

    这意味着你使用了类似的东西:

    public ThreadAffinity() {
        ctest = (CTest) Native.loadLibrary("libctest", CTest.class);
    }
    

    而不是:

    public ThreadAffinity() {
        ctest = (CTest) Native.loadLibrary("ctest", CTest.class);
    }
    

    因此您会看到 JNA 添加了 lib 前缀和 .so 后缀添加到 libctest (liblibctest.so)

    【讨论】:

      【解决方案2】:

      LD_PRELOAD 用于当您希望使用同一共享库的一个特定版本而不是另一个版本时,这在此处不适用。

      定义jna.library.path 指向您的项目根目录,JNA 应该能够找到它。

      还要确保您的库已构建为 libctest.so,并且没有被无意命名为 libctest.dylib

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多