Creator 里JNI的 nativeOnAudioFocusChange的具体实现为什么是注释掉的?

  • Creator 版本: 2.2.2 和 2.1.2

  • 目标平台: android

  • 重现方式:Google 后台crash记录

  • 首个报错: Caused by java.lang.NullPointerException

Attempt to invoke virtual method ‘void org.cocos2dx.lib.Cocos2dxGLSurfaceView.queueEvent(java.lang.Runnable)’ on a null object reference

org.cocos2dx.lib.Cocos2dxActivity.runOnGLThread (Cocos2dxActivity.java:400)

org.cocos2dx.lib.Cocos2dxHelper.runOnGLThread (Cocos2dxHelper.java:180)

org.cocos2dx.lib.Cocos2dxAudioFocusManager.unregisterAudioFocusListener (Cocos2dxAudioFocusManager.java:118)

org.cocos2dx.lib.Cocos2dxActivity.onDestroy (Cocos2dxActivity.java:378)

org.cocos2dx.javascript.AppActivity.onDestroy (AppActivity.java:294)

android.app.Activity.performDestroy (Activity.java:7532)

  • 之前哪个版本是正常的: 一直有这个bug
  • 手机型号: Redmi 7A | Galaxy A10 等等 各种型号都有
  • 重现概率: 较低

Google后台和firebase 后台一直报这个错,但是出现概率不高,我看了下出错的代码块:

static void unregisterAudioFocusListener(Context context) {
    AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int result = am.abandonAudioFocus(sAfChangeListener);
    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        Log.d(TAG, "abandonAudioFocus succeed!");
    } else {
        Log.e(TAG, "abandonAudioFocus failed!");
    }

    Cocos2dxHelper.runOnGLThread(new Runnable() {
        @Override
        public void run() {
            nativeOnAudioFocusChange(AUDIOFOCUS_GAIN); // <----------------------【出错代码行】----------------
        }
    });
}

主要就是这个nativeOnAudioFocusChange 报错,空指针错误,
然后我看了下对应的JNI文件JniImp.cpp,发现了如下代码:

/***********************************************************
 * Cocos2dxAudioFocusManager native functions implementation.
 ***********************************************************/

JNIEXPORT void JNICALL JNI_AUDIO(nativeOnAudioFocusChange)(JNIEnv* env, jobject thiz, jint focusChange)
{
    // cocos_audioengine_focus_change(focusChange);
}

} // end of extern “C”

那这个是不是本质就是个空函数?我是不是把
Cocos2dxHelper.runOnGLThread(new Runnable() {
@Override
public void run() {
nativeOnAudioFocusChange(AUDIOFOCUS_GAIN);
}
});
这个删掉就可以了?
但是这个出现概率比较低,如果run()里面传入个空方法是不应该会报错的吧?如果每个都报错肯定一堆错啊。

跪求引擎大佬指点。 谢谢。

同问,同样遇到这个问题。