无法在Eclipse中从Java加载so文件在Ubuntu上

时间:2013-10-03 03:46:55

标签: linux ubuntu shared-libraries jna

我有一些代码尝试按如下方式加载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文件当前所在的位置(项目根目录)。 我做错了什么?

2 个答案:

答案 0 :(得分:1)

如果您希望偏好同一共享库的某个特定版本而不是另一个共享库,则使用

LD_PRELOAD,这在此处不适用。

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

另外,请确保您的资源库已构建为libctest.so,并且无意中将其命名为libctest.dylib

答案 1 :(得分: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)