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

时间:2010-06-18 17:50:41

标签: java

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

这是有问题的罪犯:

System.loadLibrary("psjw");

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

请帮忙。

5 个答案:

答案 0 :(得分:4)

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

Ex: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);
    }
}

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

你可以从Java打电话:

System.loadLibrary( "psjw" );

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我已经在同一个问题上工作了两天,但我最终找到了答案。首先,我为库创建了一个目录,并将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