如何在 xp 和 windows 7 上运行 SWT 应用程序

Posted

技术标签:

【中文标题】如何在 xp 和 windows 7 上运行 SWT 应用程序【英文标题】:How To Run SWT application on both xp and windows 7 【发布时间】:2013-09-07 21:25:32 【问题描述】:

我用 SWT 创建了一个应用程序并导出了它的 jar,然后我就可以运行它了。 我的机器是(win xp)。

还有我的 Java 版本:java 版本“1.6.0_39” Java(TM) SE 运行时环境 (build 1.6.0_39-b04) Java HotSpot(TM) Client VM(build 20.14-b01,混合模式,共享)

然后我尝试在机器 windows 7 上运行我的 jar: java版本“1.7.0_17” Java(TM) SE 运行时环境 (build 1.7.0_17-b02) Java HotSpot(TM) 64 位服务器 VM(内部版本 23.7-b01,混合模式)

但是这台机器无法启动应用程序。 然后我尝试使用以下命令在 CMD 上运行 Jar:java -jar myapp.jar 然后我得到了异常:`

Exception in thread "main" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)Caused by: java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
    at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
    at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
    at org.eclipse.swt.internal.C.<clinit>(Unknown Source)
    at org.eclipse.swt.widgets.Display.<clinit>(Unknown Source)
    at projectPackage.G.init(G.java:258)
    at projectPackage.G.main(G.java:225)
    ... 5 more`

而我的 Eclipse 正在使用 jre6

那么我怎样才能生成 Jar 以在两台机器上工作?

提前感谢您的宝贵时间

【问题讨论】:

【参考方案1】:

嗯,这个例外是不言自明的:

UnsatisfiedLinkError:无法在 64 位 JVM 上加载 32 位 SWT 库

要让您的 jar 在 32 位和 64 位上运行,您应该看看这个答案:

Create cross platform Java SWT Application

您基本上必须为您计划将应用部署到的所有平台包含 swt.jar,并且给定的代码将在运行时确定要使用的 .jar 版本。


一个快速而肮脏的解决方法是打开您的 jar 文件并将包含的 swt.jar(32 位)与其他版本(64 位)交换。但是,这会将您的应用程序限制为 64 位。


结论

为不同的操作系统和位版本创建单独的 jar(每个仅包含一个 swt.jar) 或者创建一个 jar 来统治它们(包含所有 swt.jar)

【讨论】:

哦,是的,我明白了。我现在的问题是如何生成仅在 64 位 JVM 上运行的版本我将用 64 位替换我机器中的 32 位 JVM 还是我必须修复 Eclipse 配置以生成适当的 jar?抱歉,我完全误解了这个问题 @HebaAhmed 如果您将 64 位版本添加到构建路径并删除 32 位版本,您应该没问题。 @HebaAhmed 不需要下载 64bit eclipse,只需要 64bit 版本的 SWT:SWT Binary and Source【参考方案2】:

问题来自您的 swt dll:它们适用于 32 位 java,而您有 Win7 64 位操作系统。 去这里下载正确的jar http://download.eclipse.org/eclipse/downloads/drops4/R-4.3-201306052000/#SWT 现在,要在每个拱门上都可用,您需要根据操作系统下载库,然后在运行时加载它,如下所示:

URLClassLoader child = new URLClassLoader (swtJar.toURL(), this.getClass().getClassLoader());
Class classToLoad = Class.forName ("org.eclipse.swt.widgets.Display", true, child);
Method method = classToLoad.getDeclaredMethod ("getDefault");
Object instance = classToLoad.newInstance ();
Object result = method.invoke (instance);

或者你可以使用我的 jnlp 文件:

<resources os="Windows" arch="x86">
    <nativelib href="swt-native-win32-windows-x86.jar" />
</resources>

<resources os="Windows" arch="x86_64">
    <nativelib href="swt-native-win32-windows-x86_64.jar" />
</resources>

【讨论】:

以上是关于如何在 xp 和 windows 7 上运行 SWT 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 7 上崩溃但在 XP 上运行

在 XP 和 Windows 7 上的外部硬盘驱动器上运行 xampp

如何在 windows 7/visual studio 2008 下为 windows XP 编译

在 Windows 7 机器上编写/编译的 .NET 4 程序无法在 XP 上运行

在 Windows XP 模式下使用 IE6 访问在主机上运行的 Tomcat 实例(Windows 7)

Windows 7 XP 模式和 Visual Studio 2003