本机JNI/JAWT Swing应用程序在Java 6上成功运行,但在Java 7(64位Windows 7操作系统)上失败
我想我对我的问题有一个很好的认识,但我想知道是否有人对正在发生的事情有更多的了解。这可能与以下因素有关 我有一个相当简单的JavaGUI应用程序,我正在尝试将WindowsHwnd连接到它,这样我就可以附加一个子应用程序。基本上,我注意到的是,每当我在本机代码中使用JAWT资源时,它都会崩溃。它甚至不一定会在我的代码上崩溃,而且它甚至不必碰到JAWT代码。在jawt.dll/jawt.lib中链接似乎就足够了。例如,在呈现Swing GUI时,我在Java的fontmanager.dll中的类本机JNI/JAWT Swing应用程序在Java 6上成功运行,但在Java 7(64位Windows 7操作系统)上失败,java,windows,swing,java-native-interface,jawt,Java,Windows,Swing,Java Native Interface,Jawt,我想我对我的问题有一个很好的认识,但我想知道是否有人对正在发生的事情有更多的了解。这可能与以下因素有关 我有一个相当简单的JavaGUI应用程序,我正在尝试将WindowsHwnd连接到它,这样我就可以附加一个子应用程序。基本上,我注意到的是,每当我在本机代码中使用JAWT资源时,它都会崩溃。它甚至不一定会在我的代码上崩溃,而且它甚至不必碰到JAWT代码。在jawt.dll/jawt.lib中链接似乎就足够了。例如,在呈现Swing GUI时,我在Java的fontmanager.dll中的类s
sun.java2d.loops.DrawGlyphListLCD.DrawGlyphListLCD(Lsun/java2d/SunGraphics2D;Lsun/java2d/SurfaceData;Lsun/font/GlyphList;)V+0
中看到了大量的崩溃。完整hs_err_pid9108.日志可在以下位置获得:
一些有趣的注释:
- 如果我将JRE切换到Java 1.6.0_33而不是Java 1.7.0_05,应用程序将不再崩溃
- 如果在本机代码中删除对JAWT的所有引用,应用程序将不再崩溃
- 如果我删除了所有业务逻辑,只在本机代码中实例化JAWT,那么它仍然会崩溃
- 我甚至不需要在代码中进行本机调用。通过
System.load(…)
加载链接到jawt.lib
的DLL就足够了。我的应用程序在呈现GUI(使用JRE 7)时仍然会崩溃
我已经尽可能地将代码提炼成一个仍然会失败的示例。下面是Java类:
JawtTestApp.h(本机标题)
请记住,编译时必须包含JDK/include和JDK/include/win32,链接时必须包含JDK/lib/jawt.lib
我仍在进行跨平台、JDK等的测试,但基于这些信息,有人有什么想法吗?我丢失了一个神奇的编译器标志吗?有Java补丁吗?我的想法都快用完了
这是我的系统信息:
OS: Windows 7 , 64 bit Build 7601 Service Pack 1
CPU:total 4 (2 cores per cpu, 2 threads per core) family 6 model 37 stepping 2, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, ht, tsc, tscinvbit
Memory: 4k page, physical 3985080k(1468212k free), swap 7968308k(4277740k free)
vm_info: Java HotSpot(TM) Client VM (23.1-b03) for windows-x86 JRE (1.7.0_05-b06), built on Jun 27 2012 00:51:27 by "java_re" with unknown MS VC++:1600
======================================
更新
似乎这只是使用Swing组件的一个问题。如果我将上述示例更改为使用AWT组件(将JFrame切换到Frame),则应用程序将成功运行 你对此有进一步的了解吗?这一定是我的设置所特有的。我已经稍微重新实现了它,不再看到这个问题了。我将发布一些工作代码的更新…谢谢你提醒我。你对此有进一步的了解吗?这一定是我的设置所特有的。我已经稍微重新实现了它,不再看到这个问题了。我会发布一些工作代码的更新…谢谢你提醒我。
#include <jawt_md.h>
#include <assert.h>
JNIEXPORT void JNICALL Java_com_stackoverflow_JawtTestApp_testJawt(JNIEnv *env, jobject jawtTestApp, jobject component)
{
JAWT awt;
awt.version = JAWT_VERSION_1_4;
assert(JAWT_GetAWT(env,&awt) != JNI_FALSE);
}
package com.stackoverflow;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class JawtTestApp
{
private final JFrame frame;
/*
//AWT ONLY (this works)
private final Frame frame;
public JawtTestApp()
{
frame = new Frame();
frame.add(new Label("Please stop crashing!"));
frame.pack();
frame.setVisible(true);
}
*/
//SWING ONLY (this crashes)
private final JFrame frame;
public JawtTestApp()
{
frame = new JFrame();
frame.add(new JLabel("Please stop crashing!"));
frame.pack();
frame.setVisible(true);
}
public native void testJawt(Object o);
public static void main(final String args[])
{
System.load("C:\\Users\\username\\Documents\\Visual Studio 2005\\Projects\\JawtTestApp\\debug\\JawtTestApp.dll");
JawtTestApp app = new JawtTestApp();
app.testJawt(app.frame);
//NOTE: I don't actually even have to call the native method! System.load is enough
}
}
OS: Windows 7 , 64 bit Build 7601 Service Pack 1
CPU:total 4 (2 cores per cpu, 2 threads per core) family 6 model 37 stepping 2, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, ht, tsc, tscinvbit
Memory: 4k page, physical 3985080k(1468212k free), swap 7968308k(4277740k free)
vm_info: Java HotSpot(TM) Client VM (23.1-b03) for windows-x86 JRE (1.7.0_05-b06), built on Jun 27 2012 00:51:27 by "java_re" with unknown MS VC++:1600