我使用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才能在两台机器上工作?
提前感谢您的时间
答案 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位。
<强>结论强>:
答案 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>