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