在cocos2d-x 2.2.6基于OpenSL ES重构simpleaudioengine在android平台的音效部分

cocos2d-x在3.3版本以后添加了NewAudioEngine,以解决Android5.0上背景音乐导致卡顿等异常现象。但在2.2.6里还没有添加NewAudioEngine,现贴出相应解决办法:

1.修改的相关文件压缩包已上传到百度网盘http://pan.baidu.com/s/1k6lXG?qq-pf-to=pcqq.c2c2.也可通过github查看文件差异 https://github.com/WenhaiLin/cocos2d-x/commit/be0ac68a5e8512c665956acfab90ba5c4e18686f3.后续相关的更新会上传到 https://github.com/WenhaiLin/cocos2d-x/tree/v2-227
主要修改的内容有:
1.cocos2dx/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java
删除Cocos2dxSound相关的代码

2.CocosDenshion/android/Android.mk
添加依赖库:
LOCAL_EXPORT_LDLIBS := -lOpenSLES
-landroid

3.CocosDenshion/android/jni/SimpleAudioEngineJni.h
将音效的api从extern "C"代码块移出

4.https://github.com/WenhaiLin/cocos2d-x/blob/v2-227/CocosDenshion/android/jni/SimpleAudioEngineJni.cpp 1).将音效的api从extern "C"代码块移出

2).添加需要的头文件

#include<SLES/OpenSLES.h>
#include<SLES/OpenSLES_Android.h>
#include<map>
#include<unistd.h>
#include<sys/types.h>
#include<android/asset_manager.h>
#include<android/asset_manager_jni.h>
 
#include"platform/android/CCFileUtilsAndroid.h"
#include"platform/android/jni/JniHelper.h"
#include"CCDirector.h"
#include"CCScheduler.h"

3).添加相关变量及宏

#define LOGEX(msg) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, "fun:%s,line:%d,msg:%s",__func__,__LINE__,#msg)
 
        / / engineinterfaces
       staticSLObjectItf s_engineObject = NULL;
       staticSLEngineItf s_engineEngine = NULL;
       // output mixinterfaces
       staticSLObjectItf s_outputMixObject = NULL;
       static ints_currentAudioID = 1;
       static floats_effectVolume = 1.0f;
       staticAAssetManager* s_assetManager = NULL;

4).添加AudioPlayer、AudioPlayerController 及相关音效api,具体请参考https://github.com/WenhaiLin/cocos2d-x/blob/v2-227/CocosDenshion/android/jni/SimpleAudioEngineJni.cpp

5).在void endJNI()函数添加opensl相关资源的释放

stopAllEffectsJNI();
 
        if(s_outputMixObject)
        {
           (*s_outputMixObject)->Destroy(s_outputMixObject);
           s_outputMixObject = NULL;
        }
 
        if(s_engineObject)
        {
            (*s_engineObject)->Destroy(s_engineObject);
           s_engineObject = NULL;
           s_engineEngine = NULL;
        }