从外部目录运行JAR时出现UnsatisfiedLinkError

时间:2015-06-04 14:19:16

标签: java dll jar java-native-interface native

我有一个JavaFX应用程序,我将其部署为JAR。 应用程序加载并使用本机库(JNI接口)。

预计DLL与JAR位于同一目录中。 这是我加载库的方式。我已经验证了DLL的路径始终是正确的。

            String jarPath = ClassLoader.getSystemClassLoader().getResource(".").getPath();
            System.out.println(jarPath);
            System.load(jarPath + "_JNI.dll");

以下是问题: 当我执行java以从jar运行jar的同一目录时,它工作正常。 当我执行java以从外部目录运行jar时,它会抛出:

java.lang.UnsatisfiedLinkError:C:/Test/_JNI.dll:%1不是有效的Win32应用程序         at java.lang.ClassLoader $ NativeLibrary.load(Native Method)

例如:

::This works. The dll loads and executes successfully.
cd C:/test
java -jar PDWIN.jar

::This does not work. UnsatisifedLinkerror
java -jar "C:/test/PDWIN.jar"

我的想法是组件中存在比特差异,或者JNI方法签名错误,但事实并非如此,我已经验证JVM是64位,而DLL是64位。

当我从包含JAR的目录中运行java时DLL工作正常,但是当我从外面运行时没有工作这一事实很奇怪......(注意:我打印路径' jarPath'并且在两种情况下都是相同的正确路径)

1 个答案:

答案 0 :(得分:0)

问题是: Windows自动搜索系统目录和当前工作目录中的DLL。 在第一个示例中,工作目录在第二个中未正确设置。

有多种解决方案: 创建一个始终更改工作目录的启动脚本可能是最简单的。

我首选的解决方案是: 把DLL放在jar里面。使用类加载器将DLL作为InputStream打开,将其复制到临时文件中并使用绝对系统路径加载此临时文件。 (见这里:Extract and load DLL from JAR

此解决方案甚至可以适用于不同平台。