0

我用 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 Runtime Environment (build 1.7.0_17-b02) Java HotSpot(TM) 64-Bit Server VM (build 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 以在两台机器上工作?

在此先感谢您的时间

4

2 回答 2

1

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

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

要让你的 jar 在 32 位和 64 位上工作,你应该看看这个答案:

创建跨平台 Java SWT 应用程序

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


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


结论

  • 为不同的操作系统和位版本创建单独的 jar(每个仅包含一个 swt.jar)
  • 或者创建一个罐子来统治它们(包含所有 swt.jars)
于 2013-09-04T11:37:43.877 回答
1

问题来自您的 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>
于 2013-09-04T11:45:43.907 回答