出于某种原因,我在我的java应用程序中遇到了令人讨厌的不满意的链接错误。
这是有问题的罪犯:
System.loadLibrary("psjw");
尽管库psjw.dll显然与此类在同一个源包中。
请帮忙。
答案 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 ),必须有不同的名称:
你可以从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