Java 向Cocos2d-x SimpleAudioEngine添加新方法

Java 向Cocos2d-x SimpleAudioEngine添加新方法,java,android,c++,audio,cocos2d-x,Java,Android,C++,Audio,Cocos2d X,在Cocos2d-x(3.6)中,我试图向SimpleAudioEngine添加更多的功能。具体地说,关于Android的SoundPool(SimpleAudioEngine是基于它的,至少对于Android来说是如此),我试图添加一些尚未实现但在Android开发者网站上记录的方法 例如,SoundPool的play方法包含一个int类型的循环变量,而在SimpleAudioEngine中,它是bool类型(Java端的布尔值)。如果我可以用循环变量int类型实现一个新方法,那么在调用pla

在Cocos2d-x(3.6)中,我试图向SimpleAudioEngine添加更多的功能。具体地说,关于Android的SoundPool(SimpleAudioEngine是基于它的,至少对于Android来说是如此),我试图添加一些尚未实现但在Android开发者网站上记录的方法

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

我已经了解了大部分的更改,包括各种C++头文件和.cp文件(COCOS/Addio/SimeEdioOnEngy.h,COOS/Acdio/CDDSimeAdioOntudio.CPP,COCOS/Addio/Android /JNI/CDDANDROIDANDROIDJavaVaunix.h,和COCOS/Addio/JNI/CDDANDROIDANDROIDJavaEng.CPP),以及COCOS2DXSoNo.java文件,但我仍然收到错误消息,说找不到我的新方法(我称之为playEffectN)

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


有人能给我指出正确的方向吗?我还需要做些什么才能将这个附加功能添加到SimpleAudioEngine中?如果我成功了,我会很高兴地分享结果。(如果成功的话,我还可以在SooPoo销中添加一些其他未实现的方法,例如StError、StEdvestPosits、SeReTATE和SETSUBLE,对于已经分配了SunDID的声音)。

< P>,首先添加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
在这里,在cddandrodroidjavaengine.h中声明并在cddandrodroidjavaengine.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

首先,添加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
在这里,在cddandrodroidjavaengine.h中声明并在cddandrodroidjavaengine.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/simpleaudioEnginePenal.cpp中有一个对playEffect的引用,所以我强烈怀疑我也需要将playEffectN添加到源文件中。我在这方面取得了一些进展。似乎为了添加新方法(在Android中,使用现有的声音池方法),需要编辑以下文件:cocos/audio/include/SimpleAudioEngine.h cococos/audio/android/cddSimpleAudioEngine.cpp cococos/audio/android/jni/cddandroidroidjavaengine.h cococos/audio/android/cddandroidroidjavaengine.cpp platform/android/java/src/org/cococos2dx/lib/cocoos2dxhelper.javaplatform/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java然后,如果您在已经存在的项目中使用新方法,则必须将新文件复制到现有项目目录结构中的cocos和platform目录。在重新编译之前,要强制包含新方法,请从proj.android目录执行“rm-r obj”。我完成了上述所有操作,重新编译,并成功编译和安装了我的Android应用程序,但随后出现了一个运行时错误(E/JniHelper(32099):未能找到playEffectN的静态方法id),导致没有声音输出。我在cocos/platform/Android/java/src/org/cococos2dx/lib/Cocos2dxSound.java中发现了一个错误(我错误地调用了“DopLayeEffect”而不是“DopLayeEffectn”,这导致JNI方法签名不匹配(boolean而不是int)。但是,我仍然收到相同的错误(未能找到playEffectN的静态方法id),并且没有声音输出。我感谢您的帮助。我认为cocos/audio/include/AudioEngine.h不需要更改,因为它不包括原始版本(playEffect).Cocos2dxMusic.java也是如此。事实证明我错过了Cocos2dxHelper.java,但我仍然无法编译它。文档中说CocosDenshion是基于openAL的,在cocos/audio/openAL/simpleaudioenginepenal.cpp中有一个对playEffect的引用,因此我强烈怀疑需要将playEffectN添加到该源文件中我在这方面也取得了一些进展。似乎为了添加新方法(在Android中,使用现有的声音池方法),需要编辑以下文件:cocos/audio/include/SimpleAudioEngine.h cococos/audio/android/cddSimpleAudioEngine.cpp cococos/audio/android/jni/cddandrodroidroidjavaengine.h cococos/audio/jni/cddandrodroidjavaengine.cpp platform/android/java/src/org/cococos2dx/lib/cocoso2dxhelper.java平台/android/java/src/org/cocos2dx/lib/Cocos2dxSound.java然后,如果您在已经存在的项目中使用新方法,您必须将新文件复制到现有项目目录结构中的cocos和platform目录中。在重新编译之前,要强制包含proj.android目录中的新方法,请执行“rm-r obj”。我完成了上述所有操作,重新编译,并成功编译和安装了我的Android应用程序,但随后出现了一个运行时错误(E/JniHelper(32099):失败