0

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

4

2 回答 2

2

从例外:

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)

于 2014-02-17T16:33:37.983 回答
1

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

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

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

于 2013-10-03T12:21:25.430 回答