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

时间:2013-09-04 11:32:14

标签: java jar jvm swt

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

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

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

但是这台机器无法启动该应用程序。 然后我尝试使用:java -jar myapp.jar在CMD上运行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才能在两台机器上工作?

提前感谢您的时间

2 个答案:

答案 0 :(得分: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.jars)

答案 1 :(得分:1)

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

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>