【问题标题】:Adding new methods to Cocos2d-x SimpleAudioEngine为 Cocos2d-x SimpleAudioEngine 添加新方法
【发布时间】:2015-06-10 21:55:48
【问题描述】:

在 Cocos2d-x (3.6) 中,我正在尝试向 SimpleAudioEngine 添加更多功能。具体来说,关于 Android 的 SoundPool(SimpleAudioEngine 至少基于 Android),我正在尝试添加一些尚未实现但在 Android Developer 网站中记录的方法。

例如,SoundPool 的 play 方法包括一个 int 类型的循环变量,而在 SimpleAudioEngine 中它是 bool 类型(Java 端的布尔值)。如果我能实现一个新方法,循环变量为int类型,我就可以在调用playEffect方法时直接控制重复次数。

我已经弄清楚了大部分所需的更改,包括各种 C++ 头文件和 .cpp 文件(cocos/audio/include/SimpleAudioEngine.h、cocos/audio/android/cddSimpleAudioEngine.cpp、cocos/audio/android/jni/ cddandroidAndroidJavaEngine.h 和 cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp) 以及 Cocos2dxSound.java 文件,但我仍然收到错误消息,提示找不到我的新方法(我称之为 playEffectN)。

我可以看到可能需要添加的唯一其他地方是在 cocos/audio/openal/SimpleAudioEngineOpenAL.cpp 文件中,但我不太确定如何修改它以添加我的新方法。

谁能指出我还需要做什么才能将这个附加功能添加到 SimpleAudioEngine 的正确方向?如果我成功了,我会很乐意分享结果。 (如果成功,我还可以在 SoundPool 中添加一些其他未实现的方法,例如 setLoop、setPriority、setRate 和 setVolume,用于已分配 soundID 的声音。)

【问题讨论】:

    标签: java android c++ audio cocos2d-x


    【解决方案1】:

    首先,添加c++ api,在:

    cocos/audio/include/AudioEngine.h 
    

    虽然cddSimpleAudioEngine.cpp中没有实现,但仍需要在AudioEngine.h中声明函数

    那么,c++ 和 java 之间的桥梁:

    cocos/audio/android/jni/cddandroidAndroidJavaEngine.h
    cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp
    

    这里,在cddandroidAndroidJavaEngine.h中声明,在cddandroidAndroidJavaEngine.cpp中实现,比如

     void AndroidJavaEngine::playEffectN(int times) {
            cocos2d::JniMethodInfo methodInfo;
    
            if (! getJNIStaticMethodInfo(methodInfo, "playEffectN", "(I)V")) {
                return ;
            }
    
            methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, times);
            methodInfo.env->DeleteLocalRef(methodInfo.classID);
        }
    

    然后在java中

    cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java
    

    添加函数如:

    public static void playEffectN(int times) {
    
    }
    

    终于是你的java实现了,在

    cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxMusic.java
    

    【讨论】:

    • 感谢您的帮助。我不认为 cocos/audio/include/AudioEngine.h 需要更改,因为它不包含原始(playEffect)。同样适用于 Cocos2dxMusic.java。原来我错过了 Cocos2dxHelper.java,但我仍然无法编译它。文档说 CocosDenshion 是基于 openAL 的,并且 cocos/audio/openal/SimpleAudioEngineOpenAL.cpp 中有对 playEffect 的引用,所以我强烈怀疑我也需要将 playEffectN 添加到该源文件中。
    • 我在这方面取得了一些进展。看来,为了添加新方法(在Android中,使用现有的SoundPool方法),需要编辑以下文件: cocos/audio/include/SimpleAudioEngine.h cocos/audio/android/cddSimpleAudioEngine.cpp cocos/audio/android /jni/cddandroidAndroidJavaEngine.h cocos/audio/android/jni/cddandroidAndroidJavaEngine.cpp 平台/android/java/src/org/cocos2dx/lib/Cocos2dxHelper.java 平台/android/java/src/org/cocos2dx/lib/Cocos2dxSound。爪哇
    • 那么,如果您在已经存在的项目中使用新方法,则必须将新文件复制到现有项目目录结构中的 cocos 和平台目录中。在重新编译之前,要强制包含您的新方法,请从您的 proj.android 目录执行“rm -r obj”。我完成了上述所有操作,重新编译,并且能够成功编译和安装我的 Android 应用程序,但随后出现运行时错误 (E/JniHelper(32099): Failed to find static method id of playEffectN),导致没有声音输出。
    • 我追踪到 cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java 中的一个错字(我错误地称为“doPlayEffect”而不是“doPlayEffectN”,这导致JNI 方法签名不匹配(布尔而不是 int)。但是,我仍然收到相同的错误(无法找到 playEffectN 的静态方法 id),并且没有声音输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多