我认为我对我遇到的问题有一个体面的认识,但我想知道是否有人更了解正在发生的事情。这可能与trying-to-use-jawt-on-64-bit-windows-7-os有关。
我有一个相当简单的Java GUI应用程序,我试图能够获得Windows HWND,因此我可以附加一个孩子。基本上,我注意到,无论何时我在本机代码中使用JAWT资源,它都会崩溃。它甚至不一定会崩溃我的代码,它甚至不必命中JAWT代码。在jawt.dll / jawt.lib中链接似乎已经足够了。例如,当我的Swing GUI被渲染时,我在Java的fontmanager.dll中看到了类sun.java2d.loops.DrawGlyphListLCD.DrawGlyphListLCD(Lsun/java2d/SunGraphics2D;Lsun/java2d/SurfaceData;Lsun/font/GlyphList;)V+0
中的大量崩溃。完整hs_err_pid9108.log
可在此处获取:http://pastebin.com/2QS0fDuf
一些有趣的说明:
jawt.lib
加载与System.load(...)
关联的DLL就足够了。在渲染GUI(使用JRE 7)时,我的应用程序仍会崩溃。我尽可能地将代码提炼到一个仍然会失败的示例。这是Java类:
JawtTestApp.h (原生标题)
#include <jni.h>
#ifndef _Included_com_stackoverflow_JawtTestApp
#define _Included_com_stackoverflow_JawtTestApp
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT void JNICALL Java_com_stackoverflow_JawtTestApp_testJawt(JNIEnv *, jobject, jobject);
#ifdef __cplusplus
}
#endif
#endif
JawtTestApp.cpp (原生实施)
#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);
}
JawtTestApp.h (Java文件)
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
}
}
请记住,编译时必须包含JDK / include和JDK / include / win32,链接时必须包含JDK / lib / jawt.lib。
我仍然在跨平台,JDK等进行测试,但基于这些信息,有没有人有任何想法?是否有一个神奇的编译器标志我不见了?有补丁吗?我这里的想法已经不多了。
这是我的系统信息:
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),则应用程序将成功运行。