本机JNI / JAWT Swing应用程序在Java 6上成功运行,但在Java 7(64位Windows 7 OS)上失败

时间:2012-08-10 21:16:51

标签: java windows swing java-native-interface jawt

我认为我对我遇到的问题有一个体面的认识,但我想知道是否有人更了解正在发生的事情。这可能与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

一些有趣的说明:

  • 如果我将JRE切换到Java 1.6.0_33而不是Java 1.7.0_05,则应用程序不再崩溃
  • 如果我在本机代码中删除了对JAWT的所有引用,则应用程序不再崩溃
  • 如果我删除了所有业务逻辑,除了在我的本机代码中实例化JAWT之外​​什么也没做,它仍然崩溃
  • 我甚至不必在我的代码中进行本机调用。通过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),则应用程序将成功运行。

0 个答案:

没有答案