日期:2014-05-20  浏览次数:20615 次

寻 JNI高手帮忙解决一个问题,万分感谢!
JNI 达人,我改写了一个全局监听的 java调用 dll的代码,可是一运行就 JVM crash.

请达人帮我看看是什么原因,非常感谢!


运行环境:

OS: Windows XP Build 2600 Service Pack 3

CPU:total 2 (2 cores per cpu, 1 threads per core) family 6 model 23 stepping 10, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1

Memory: 4k page, physical 2091204k(875764k free), swap 4029236k(2644760k free)

vm_info: Java HotSpot(TM) Client VM (20.4-b02) for windows-x86 JRE (1.6.0_29-b11), built on Oct 3 2011 01:01:08 by "java_re" with MS VC++ 7.1 (VS2003)


Example.java
Java code
package jni;

public class Example  implements KeyboardEventListener {

    static GlobalEventListener gl;

    public static void main(String[] args) throws Exception  
    {
        Example inst = new Example();
        gl = new GlobalEventListener();
          gl.addKeyboardEventListener(inst);
    }
            
    public void GlobalKeyPressed( KeyboardEvent event )
    {
        
        System.out.println( "Key Pressed: " + event.getVirtualKeyCode() );
    }

    public void GlobalKeyReleased( KeyboardEvent event )
    {
        System.out.println( "Key Released: " + event.getVirtualKeyCode() );
    }
    
}




GlobalEventListener.java
Java code
package jni;

public class GlobalEventListener
{
    PoolHook pt;
    public GlobalEventListener()
    {
        pt = new PoolHook(this);
        pt.start();
            
    }
 
    protected javax.swing.event.EventListenerList listenerList = new javax.swing.event.EventListenerList();
     
    public void addKeyboardEventListener(KeyboardEventListener listener)
    {
        listenerList.add( KeyboardEventListener.class, listener );
    }
 
    public void removeKeyboardEventListener(KeyboardEventListener listener)
    {
        listenerList.remove( KeyboardEventListener.class, listener );
    }
    
    
    void keyPressed(KeyboardEvent event)
    {
        Object[] listeners = listenerList.getListenerList();
        for ( int i = 0; i < listeners.length; i += 2 )
        {
            if ( listeners[ i ] == KeyboardEventListener.class )
            {
                ( (KeyboardEventListener)listeners[i + 1] ).GlobalKeyPressed( event );
            }
        }
    }
 
    void keyReleased(KeyboardEvent event)
    {
        Object[] listeners = listenerList.getListenerList();
        for ( int i = 0; i < listeners.length; i += 2 )
        {
            if ( listeners[ i ] == KeyboardEventListener.class )
            {
                ( (KeyboardEventListener)listeners[i + 1] ).GlobalKeyReleased( event );
            }
        }
    }
    
    
}
 





KeyboardEventListener.java
Java code
package jni;

import java.util.*;
 
public interface KeyboardEventListener extends EventListener
{
    public void GlobalKeyPressed( KeyboardEvent event );
    public void GlobalKeyReleased( KeyboardEvent event );
}


class KeyboardEvent extends EventObject
{
    private static final long serialVersionUID = 2341653211621224652L;
    boolean ts, ap, ek;
    int vk;
 
    public KeyboardEvent( Object source, boolean ts, int vk, boolean ap, boolean ek )
    {
        super(source);
        this.ts = ts;
        this.vk = vk;
        this.ap = ap;
        this.ek = ek;
    }
 
    public boolean getTransitionState()
    {
        return ts;
    }
 
    public long getVirtualKeyCode()
    {
        return vk;
    }
 
    public boolean isAltPressed()
    {
        return ap;
    }
 
    public boolean isExtendedKey()
    {
        return ek;
    }
 
    public boolean equals( KeyboardEvent event )
    {
        if( event.getVirtualKeyCode() == vk )
        {
            if( event.isExtendedKey() == ek )
            {
                if( event.isAltPressed() == ap )
                {
                    return true;
                }
            }
        }
        return false;
    }
}