使用System.loadLibrary()时出现不满意的链接错误?

出于某种原因,我在我的Java应用程序中遇到了令人讨厌的不满意的链接错误。

这是有问题的罪犯:

System.loadLibrary("psjw"); 

尽管库psjw.dll显然与此类在同一个源包中。

请帮忙。

确保psjw.dll位于PATH或java.library.path上。

例如:psjw.dll可能在/ usr / lib中,那么你的命令就是java -Djava.library.path = / usr / lib ur.package.UrClass

使用精简课程测试您的设置:

 public class TestLoadLibrary { public static void main(String[] args) { String libPath = System.getProperty("java.library.path"); System.out.println("java.library.path=" + libPath); String libraryName = "psjw"; System.out.println("Trying to load '" + libraryName + "'"); System.loadLibrary(libraryName); } } 

尝试在启动JVM时设置explicity库路径: -Djava.library.path="Directory of DLL"

为了正确查找不同操作系统的库(来自java.library.path ),必须具有不同的名称:

  • Linux: libpsjw.so
  • Windows: psjw.dll

你可以从Java调用:

 System.loadLibrary( "psjw" ); 

根据我的经验,我可以说,如果从java类文件中的静态初始化块执行loadLib(libraryName),则libraray应该存在于java.library.path中。 否则无法加载类。 但是如果我们将loadLibrary()调用移动到其他方法(例如Main())下,则可以从环境路径中读取它。

我已经在同一个问题上工作了两天,但我最终找到了答案。 首先,我为库创建了一个目录,并将PATH环境变量设置为该目录。 我不喜欢堵塞我的路径,所以现在我给你我在http://blog.cedarsoft.com/2010/11/setting-java-library-path-programmatically/找到的东西。 我的演绎如下

 package yourpackage; import java.io.File; import java.lang.reflect.Field ; public class YourClass { public native void print () ; static { String mPath = new File (".").getAbsolutePath () ; String langKey = "java.library.path" ; System.setProperty ( langKey, mPath ) ; // Tested both with and without the following, and worked either way. /* try { Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" ); fieldSysPath.setAccessible( true ); fieldSysPath.set( null, null ); } catch ( NoSuchFieldException e ) { System.err.println ( "Unable to reset system path field: \n" + e + '\n' ) ; } catch ( IllegalAccessException e ) { System.err.println ( "Unable to access system path after reset: \n" + e + '\n' ) ; } */ try { System.loadLibrary ( "YourLibrary" ) ; } catch ( UnsatisfiedLinkError e ) { System.err.println ( "Native code library failed to load.\n" + e ) ; System.exit ( 1 ) ; } } public static void main ( String[] args) { YourClass yc = new YourClass() ; yc.print(); } } 

对于上面的代码,您的dll需要与.java位于同一个文件夹中。 如果从命令行运行,请记住从javac的同一目录调用,以及java调用的root包目录。 因此,对于.java是C:\ workspace \ yourpackage \ YourClass.java,您可以从命令行调用:

 cd "C:\workspace" java yourpackage.YourClass