0

我正在尝试使用 Java 中的默认 Windows 浏览器打开一个 URL。不幸的是,我不能使用 Desktop 类实用程序,因为代码必须与 1.5 兼容。

作为一种解决方案,我使用本机方法调用 ShellExecute:

public class ShellExec {
   public native int execute(String document);

   {
       System.loadLibrary("HSWShellExec");
   }

   public static void main(String args[]) throws IOException {
       new ShellExec().execute("http://www.google.com/");
   }

}

我将 DLL 文件放在显然包含在 java.library.path 中的 Eclipse 项目根目录中。

如果 ShellExec 在默认包中,一切都可以正常工作,但是如果我将它移动到任何其他包中,本机调用将失败,并显示:

Exception in thread "main" java.lang.UnsatisfiedLinkError: apackage.ShellExec.execute(Ljava/lang/String;)I
at apackage.ShellExec.execute(Native Method)
at apackage.ShellExec.main(ShellExec.java:13)

有人知道为什么吗?我正在使用来自http://www.heimetli.ch/shellexec.html的 DLL

谢谢

..稍后编辑:

最终,这个类和其他类将成为 Eclipse RCP 应用程序中的实用程序类,所有外部 DLL 都将放置在 java.library.path 指向的公共 lib 文件夹中。可以看到 DLL,但我得到的错误类型与上面的简单示例相同。

4

2 回答 2

0

将 VM 参数传递-Djava.library.path=<path-to-dll-folder>给您的项目启动配置。

于 2012-01-06T17:38:54.813 回答
0

您加载库的块对于类来说不是静态的,只是在 ShellExec 的实例中定义为匿名块。由于您从未创建 ShellExec 的实例,因此永远不会调用匿名块并且永远不会加载库。

相反,你应该有

static {
   System.loadLibrary("HSWShellExec");
}

我认为这将解决您的问题。

于 2012-01-20T21:48:16.700 回答