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; }}