我将Java更改为32位模式,允许SWT运行,当我调试时,它运行良好。但是当我使用Eclipse导出.jar时,它会显示此错误。
我已经添加了chmod 777.我做错了什么?
以下是控制台结果:
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] Exception in thread "main"
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] at org.eclipse.swt.internal.Library.loadLibrary(Unknown Source)
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] at org.eclipse.swt.internal.C.<clinit>(Unknown Source)
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] at org.eclipse.swt.widgets.Display.<clinit>(Unknown Source)
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] at com.testing.SWTApp.main(SWTApp.java:54)
MANIFEST如下:
Manifest-Version: 1.0
Class-Path: .
Main-Class: com.testing.SWTApp
答案 0 :(得分:2)
试试这个:
java -d32 -XstartOnFirstThread -jar myapp.jar
-d32
选项将使VM以32位模式运行。 SWT应用程序需要-XstartOnFirstThread
选项。
答案 1 :(得分:0)
问题是Eclipse不是正在执行你构建的jar,它是Finder / java启动器。您需要做的是转到/Applications/Utilities/Java Preferences.app
并重新排序(单击拖动),以便在64位版本之前选择32位版本。作为参考,我的看起来像这样:
然后当您执行java -version
(无-d
参数)时,您将获得32位JRE。当你在finder中双击jar或使用open app.jar
它应该可以工作。
答案 2 :(得分:0)
20/11/2011 12:10:36 AM [0x0-0x3d89d86].com.apple.JarLauncher[73111] java.lang.UnsatisfiedLinkError: Cannot load 32-bit SWT libraries on 64-bit JVM
请关注此错误。您需要64位依赖库才能启动它。这取决于默认的java加载。如果是32位软件包,则需要将默认的jvm类路径设置为32位java。您可以选择在eclipse中更改它。
答案 3 :(得分:0)
swt jar执行依赖于您的操作系统的本机库
你有一个版本的swt:
macosx 32&amp; 64位
winsows 32&amp; 64位
linux 32&amp; 64位
您可以指定-d32
jvm选项。它将强制JVM以32位模式运行。但是,您需要在操作系统中使用32位JVM实现。
您还可以在运行时动态加载正确的SWT Jar:您在应用程序中包含jar(swt-macosx-32bits&amp; swt-macosx-64bits)并以编程方式加载所需的jar:
String osArch = System.getProperty ("sun.arch.data.model");
if (osArch == null) {
osArch = System.getProperty ("com.ibm.vm.bitmode");
}
URLClassLoader classLoader = (URLClassLoader) JarLoaderUtils.class.getClassLoader();
URL.setURLStreamHandlerFactory(new RsrcURLStreamHandlerFactory(classLoader));
Method addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
addUrlMethod.setAccessible(true);
swtFileName = osArch.contains("64") ? SWT_MAC_x86_64 : SWT_MAC_x86;
URL swtFileUrl = new URL("rsrc:" + swtFileName);
addUrlMethod.invoke(classLoader, swtFileUrl);
请注意,您似乎在macosx中运行应用程序,还应添加-XstartOnFirstThread
选项。