Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本机JNI/JAWT Swing应用程序在Java 6上成功运行,但在Java 7(64位Windows 7操作系统)上失败_Java_Windows_Swing_Java Native Interface_Jawt - Fatal编程技术网

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

本机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

我想我对我的问题有一个很好的认识,但我想知道是否有人对正在发生的事情有更多的了解。这可能与以下因素有关

我有一个相当简单的JavaGUI应用程序,我正在尝试将WindowsHwnd连接到它,这样我就可以附加一个子应用程序。基本上,我注意到的是,每当我在本机代码中使用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.日志
可在以下位置获得:

一些有趣的注释:

  • 如果我将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