【已解决】2.0.0 安卓返回键/按键 JNI不调用CC引擎

  • Creator 版本:2.0.0

  • 目标平台: Android

  • 详细报错信息,包含调用堆栈:无

  • 重现方式:

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:

  • 额外线索:

  public init (): void {
    cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this._keyDown, this)
  }

  private _keyDown (event): void {
    cc.error("ASDASDASDASDASDASD", event.keyCode, cc.KEY.back)
    if (event.keyCode === cc.KEY.back) {
      this.onBackPressed()
    }
  }

Jnilmp.cpp

    JNIEXPORT jboolean JNICALL Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeKeyEvent(JNIEnv * env, jobject thiz, jint keyCode, jboolean isPressed)
    {
        if (g_isGameFinished) {
            return JNI_TRUE;
        }
        //TODO
        cocos2d::log("JNI JNI JNI JNI JNI");
        return JNI_TRUE;
    }

js里面,事件正常注册,logcat也能看到按键事件
但是,就是不执行js里面的回调部分
追根溯源,找到了上面的jni代码,发现引擎就是跑到这里然后直接返回true,不会去调用js

logcat


08-09 18:43:57.460 7989-7989/app.xixi.haha I/View: Key down dispatch to org.cocos2dx.lib.Cocos2dxGLSurfaceView{34e00a72 VFE..... .F...... 0,0-1080,1920}, event = KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x8, repeatCount=0, eventTime=558523998, downTime=558523998, deviceId=18, source=0x101 }
08-09 18:43:57.466 7989-8019/app.xixi.haha D/cocos2d-x debug info: JNI JNI JNI JNI JNI
08-09 18:43:57.602 7989-7989/app.xixi.haha I/View: Key up dispatch to org.cocos2dx.lib.Cocos2dxGLSurfaceView{34e00a72 VFE..... .F...... 0,0-1080,1920}, event = KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x8, repeatCount=0, eventTime=558524150, downTime=558523998, deviceId=18, source=0x101 }
08-09 18:43:57.617 7989-8019/app.xixi.haha D/cocos2d-x debug info: JNI JNI JNI JNI JNI
08-09 18:44:04.688 7989-7989/app.xixi.haha I/View: Key down dispatch to org.cocos2dx.lib.Cocos2dxGLSurfaceView{34e00a72 VFE..... .F...... 0,0-1080,1920}, event = KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x8, repeatCount=0, eventTime=558531232, downTime=558531232, deviceId=18, source=0x101 }
08-09 18:44:04.699 7989-8019/app.xixi.haha D/cocos2d-x debug info: JNI JNI JNI JNI JNI
08-09 18:44:04.803 7989-7989/app.xixi.haha I/View: Key up dispatch to org.cocos2dx.lib.Cocos2dxGLSurfaceView{34e00a72 VFE..... .F...... 0,0-1080,1920}, event = KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BACK, scanCode=158, metaState=0, flags=0x8, repeatCount=0, eventTime=558531350, downTime=558531232, deviceId=18, source=0x101 }
08-09 18:44:04.817 7989-8019/app.xixi.haha D/cocos2d-x debug info: JNI JNI JNI JNI JNI

并且在代码头部找到了

//	std::unordered_map<int, cocos2d::EventKeyboard::KeyCode> g_keyCodeMap =
//	{
//        { KEYCODE_BACK , cocos2d::EventKeyboard::KeyCode::KEY_ESCAPE },
//        { KEYCODE_MENU , cocos2d::EventKeyboard::KeyCode::KEY_MENU },
//        { KEYCODE_DPAD_UP  , cocos2d::EventKeyboard::KeyCode::KEY_DPAD_UP },
//        { KEYCODE_DPAD_DOWN , cocos2d::EventKeyboard::KeyCode::KEY_DPAD_DOWN },
//        { KEYCODE_DPAD_LEFT , cocos2d::EventKeyboard::KeyCode::KEY_DPAD_LEFT },
//        { KEYCODE_DPAD_RIGHT , cocos2d::EventKeyboard::KeyCode::KEY_DPAD_RIGHT },
//        { KEYCODE_ENTER  , cocos2d::EventKeyboard::KeyCode::KEY_ENTER },
//        { KEYCODE_PLAY  , cocos2d::EventKeyboard::KeyCode::KEY_PLAY },
//        { KEYCODE_DPAD_CENTER  , cocos2d::EventKeyboard::KeyCode::KEY_DPAD_CENTER },
//    };

所以这个要弃用了?

1赞

关注。不能处理返回键的话,很影响原生平台用户体验。

顶一下

收到反馈,近期完善

@yatyricky 参考这个修复,或者等 2.0.1

https://github.com/cocos-creator/cocos2d-x-lite/pull/1453

收到,多谢。

可以监听按键了,但是按钮会一直重复,例如我按下键它就一直向下。跟了下代码发现,这里 event.action 强制写死成了 PRESS,只能监听onKeyDown,不能监听onKeyUp。我提了个PR 帮忙看一下:
https://github.com/cocos-creator/cocos2d-x-lite/pull/1514

2赞

多谢修复,PR 已合并。

develop 分支会在 2.1 版本包含,使用 2.0.x 的参考上面的 PR 修复

mark

2.0.4也还没修复,哪个版本修复了?

我看了2.0.10的代码没有问题,但是js还是没有响应回调呢@leda