0

我在 linux 上遇到了 java.library.path 的一个奇怪问题,我不确定问题是 IntelliJ 的想法还是 java.library.path 在 windows 和 linux 上的使用方式不同。

设置是在 Intellij 中创建一个简单的 JUnit4 测试用例,如下所示:

     System.out.println("java.library.path = " + System.getProperty("java.library.path"));
    System.out.println("LD_LIBRARY_PATH = " + System.getenv("LD_LIBRARY_PATH"));

    String directory = Paths.get("../../../../test-project/linux32").toAbsolutePath().toRealPath().toString();

    System.out.println("Loading: " + directory + "/dummy.so" + " with System.load(..)");
    System.load(directory + "/dummy.so");
    System.out.println("SUCCESS!");

    System.out.println("Loading: " + "dummy" + " with System.loadLibrary(..)");
    System.loadLibrary("dummy");
    System.out.println("SUCCESS!");

为了为给定的测试用例设置 java.library.path 我去Edit Configurations...设置-ea -Djava.library.path=</path/to/directory/containing/dummy.so>in VM options,但是在运行测试用例之后,这是输出:

java.library.path = </path/to/directory/containing/dummy.so>
LD_LIBRARY_PATH = </path/to/directory/containing/dummy.so>
Loading: </path/to/directory/containing/dummy.so>/dummy.so with System.load(..)
SUCCESS!
Loading: dummy with System.loadLibrary(..)

java.lang.UnsatisfiedLinkError: no dummy in java.library.path

    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at LoadLibraryTest.loadLibraryTest(LoadLibraryTest.java:21)

如您所见,我尝试使用System.load(...)first 加载该库,并且我还尝试将LD_LIBRARY_PATHunder Environment variablesin设置为与没有任何成功Edit Configurations...的目录相同的目录。java.library.path由于给定的java.lang.UnsatisfiedLinkError: no dummy in java.library.path错误,该问题与未找到依赖库无关。

当我在 Windows 中尝试相同的设置时,一切正常,只要我设置java.library.path正确,库就会成功加载。如果java.library.path不正确,则测试显然也会在 Windows 上失败。我已经尝试过设置和不设置LD_LIBRARY_PATHjava.library.path以及两者的每一种组合,在 Linux 上的结果没有变化。似乎设置java.library.path对linux没有影响,但我不知道这是IntelliJ中的错误还是与linux相关的东西。

编辑:

在此处显示的原始测试用例中,调用了库libdummy.so,在这种情况下,只需删除lib调用中的前缀即可System.loadLibrary工作,但在我的真实情况下,库没有lib前缀,因此我现在相应地更新了测试用例并重新编译具有名称的测试库,dummy.so现在测试用例再次失败并出现相同的错误,如上所述。感谢 KC Wong 的提示!

在此先感谢您对此事的任何帮助!

-马丁

4

0 回答 0