当前位置: 代码迷 >> J2SE >> 寻 JNI高手帮忙解决一个有关问题,万分感谢
  详细解决方案

寻 JNI高手帮忙解决一个有关问题,万分感谢

热度:8392   发布时间:2013-02-25 00:00:00.0
寻 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;    }}
  相关解决方案