我知道,这不是第一个库路径问题,但我真的不知道问题是什么。
我的项目需要一个KernelWrapper
库,将它包含在Linux上完全没问题。
但是,当我尝试将它包含在Mac中(通过终端或直接在IDE中)时,我总是得到
Exception in thread "main" java.lang.UnsatisfiedLinkError: no KernelWrapper 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 cTools.KernelWrapper.<clinit>(KernelWrapper.java:6)
at shell.main(shell.java:18)
我使用
打印出库路径System.out.println(System.getProperty("java.library.path"));
它告诉我文件夹的路径是正确的并包含在内。但是,KernelWrapper类以某种方式无法正常工作。但它与Unix中包含的文件完全相同。 我错过了什么?
答案 0 :(得分:1)
当应用程序尝试加载Linux中的.so,Windows上的.dll或Mac中的.dylib(在您的情况下)并且该库不存在时,会引发UnsatisfiedLinkError。具体来说,为了找到所需的本机库,JVM同时查找PATH环境变量和java.library.path系统属性。
首先,您必须验证System.loadLibrary方法中传递的参数是否正确以及库实际存在。请注意,不需要扩展库。因此,如果您的库名为SampleLibrary.dll,则必须将SampleLibrary值作为参数传递。 此外,如果应用程序已加载库并且应用程序尝试再次加载它,则JVM将抛出UnsatisfiedLinkError。此外,您必须验证本机库是否存在于应用程序的java.library.path或PATH环境库中。如果仍无法找到库,请尝试提供System.loadLibrary方法的绝对路径。 要执行应用程序,请使用-Djava.library.path参数显式指定本机库。例如,使用终端(Linux或Mac)或命令提示符(Windows),通过发出以下命令来执行您的应用程序:
java -Djava.library.path= "<path_of_your_application>" –jar <ApplicationJAR.jar>