/lib/cocos2d-x/CocosDenshion/android/jni/SimpleAudioEngineJni.cpp

https://bitbucket.org/kevin_sun/sanguo_client · C++ · 443 lines · 305 code · 107 blank · 31 comment · 30 complexity · 47e178e1b841282ece6ad79b400cc443 MD5 · raw file

  1. #include "SimpleAudioEngineJni.h"
  2. #include "platform/android/jni/JniHelper.h"
  3. #include <android/log.h>
  4. #define LOG_TAG "libSimpleAudioEngine"
  5. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
  6. #define CLASS_NAME "org/cocos2dx/lib/Cocos2dxHelper"
  7. typedef struct JniMethodInfo_
  8. {
  9. JNIEnv * env;
  10. jclass classID;
  11. jmethodID methodID;
  12. } JniMethodInfo;
  13. extern "C"
  14. {
  15. // get env and cache it
  16. static JNIEnv* getJNIEnv(void)
  17. {
  18. JavaVM* jvm = cocos2d::JniHelper::getJavaVM();
  19. if (NULL == jvm) {
  20. LOGD("%s", "Failed to get JNIEnv. JniHelper::getJavaVM() is NULL");
  21. return NULL;
  22. }
  23. JNIEnv *env = NULL;
  24. // get jni environment
  25. jint ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_4);
  26. switch (ret) {
  27. case JNI_OK :
  28. // Success!
  29. return env;
  30. case JNI_EDETACHED :
  31. // Thread not attached
  32. // TODO : If calling AttachCurrentThread() on a native thread
  33. // must call DetachCurrentThread() in future.
  34. // see: http://developer.android.com/guide/practices/design/jni.html
  35. if (jvm->AttachCurrentThread(&env, NULL) < 0)
  36. {
  37. LOGD("%s", "Failed to get the environment using AttachCurrentThread()");
  38. return NULL;
  39. } else {
  40. // Success : Attached and obtained JNIEnv!
  41. return env;
  42. }
  43. case JNI_EVERSION :
  44. // Cannot recover from this error
  45. LOGD("%s", "JNI interface version 1.4 not supported");
  46. default :
  47. LOGD("%s", "Failed to get the environment using GetEnv()");
  48. return NULL;
  49. }
  50. }
  51. // get class and make it a global reference, release it at endJni().
  52. static jclass getClassID(JNIEnv *pEnv)
  53. {
  54. jclass ret = pEnv->FindClass(CLASS_NAME);
  55. if (! ret)
  56. {
  57. LOGD("Failed to find class of %s", CLASS_NAME);
  58. }
  59. return ret;
  60. }
  61. static bool getStaticMethodInfo(JniMethodInfo &methodinfo, const char *methodName, const char *paramCode)
  62. {
  63. jmethodID methodID = 0;
  64. JNIEnv *pEnv = 0;
  65. bool bRet = false;
  66. do
  67. {
  68. pEnv = getJNIEnv();
  69. if (! pEnv)
  70. {
  71. break;
  72. }
  73. jclass classID = getClassID(pEnv);
  74. methodID = pEnv->GetStaticMethodID(classID, methodName, paramCode);
  75. if (! methodID)
  76. {
  77. LOGD("Failed to find static method id of %s", methodName);
  78. break;
  79. }
  80. methodinfo.classID = classID;
  81. methodinfo.env = pEnv;
  82. methodinfo.methodID = methodID;
  83. bRet = true;
  84. } while (0);
  85. return bRet;
  86. }
  87. void preloadBackgroundMusicJNI(const char *path)
  88. {
  89. // void playBackgroundMusic(String,boolean)
  90. JniMethodInfo methodInfo;
  91. if (! getStaticMethodInfo(methodInfo, "preloadBackgroundMusic", "(Ljava/lang/String;)V"))
  92. {
  93. return;
  94. }
  95. jstring stringArg = methodInfo.env->NewStringUTF(path);
  96. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg);
  97. methodInfo.env->DeleteLocalRef(stringArg);
  98. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  99. }
  100. void playBackgroundMusicJNI(const char *path, bool isLoop)
  101. {
  102. // void playBackgroundMusic(String,boolean)
  103. JniMethodInfo methodInfo;
  104. if (! getStaticMethodInfo(methodInfo, "playBackgroundMusic", "(Ljava/lang/String;Z)V"))
  105. {
  106. return;
  107. }
  108. jstring stringArg = methodInfo.env->NewStringUTF(path);
  109. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg, isLoop);
  110. methodInfo.env->DeleteLocalRef(stringArg);
  111. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  112. }
  113. void stopBackgroundMusicJNI()
  114. {
  115. // void stopBackgroundMusic()
  116. JniMethodInfo methodInfo;
  117. if (! getStaticMethodInfo(methodInfo, "stopBackgroundMusic", "()V"))
  118. {
  119. return;
  120. }
  121. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  122. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  123. }
  124. void pauseBackgroundMusicJNI()
  125. {
  126. // void pauseBackgroundMusic()
  127. JniMethodInfo methodInfo;
  128. if (! getStaticMethodInfo(methodInfo, "pauseBackgroundMusic", "()V"))
  129. {
  130. return;
  131. }
  132. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  133. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  134. }
  135. void resumeBackgroundMusicJNI()
  136. {
  137. // void resumeBackgroundMusic()
  138. JniMethodInfo methodInfo;
  139. if (! getStaticMethodInfo(methodInfo, "resumeBackgroundMusic", "()V"))
  140. {
  141. return;
  142. }
  143. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  144. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  145. }
  146. void rewindBackgroundMusicJNI()
  147. {
  148. // void rewindBackgroundMusic()
  149. JniMethodInfo methodInfo;
  150. if (! getStaticMethodInfo(methodInfo, "rewindBackgroundMusic", "()V"))
  151. {
  152. return;
  153. }
  154. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  155. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  156. }
  157. bool isBackgroundMusicPlayingJNI()
  158. {
  159. // boolean rewindBackgroundMusic()
  160. JniMethodInfo methodInfo;
  161. jboolean ret = false;
  162. if (! getStaticMethodInfo(methodInfo, "isBackgroundMusicPlaying", "()Z"))
  163. {
  164. return ret;
  165. }
  166. ret = methodInfo.env->CallStaticBooleanMethod(methodInfo.classID, methodInfo.methodID);
  167. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  168. return ret;
  169. }
  170. float getBackgroundMusicVolumeJNI()
  171. {
  172. // float getBackgroundMusicVolume()
  173. JniMethodInfo methodInfo;
  174. jfloat ret = -1.0;
  175. if (! getStaticMethodInfo(methodInfo, "getBackgroundMusicVolume", "()F"))
  176. {
  177. return ret;
  178. }
  179. ret = methodInfo.env->CallStaticFloatMethod(methodInfo.classID, methodInfo.methodID);
  180. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  181. return ret;
  182. }
  183. void setBackgroundMusicVolumeJNI(float volume)
  184. {
  185. // void setBackgroundMusicVolume()
  186. JniMethodInfo methodInfo;
  187. if (! getStaticMethodInfo(methodInfo, "setBackgroundMusicVolume", "(F)V"))
  188. {
  189. return ;
  190. }
  191. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, volume);
  192. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  193. }
  194. unsigned int playEffectJNI(const char* path, bool bLoop)
  195. {
  196. // int playEffect(String)
  197. JniMethodInfo methodInfo;
  198. int ret = 0;
  199. if (! getStaticMethodInfo(methodInfo, "playEffect", "(Ljava/lang/String;Z)I"))
  200. {
  201. return ret;
  202. }
  203. jstring stringArg = methodInfo.env->NewStringUTF(path);
  204. ret = methodInfo.env->CallStaticIntMethod(methodInfo.classID, methodInfo.methodID, stringArg, bLoop);
  205. methodInfo.env->DeleteLocalRef(stringArg);
  206. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  207. return (unsigned int)ret;
  208. }
  209. void stopEffectJNI(unsigned int nSoundId)
  210. {
  211. // void stopEffect(int)
  212. JniMethodInfo methodInfo;
  213. if (! getStaticMethodInfo(methodInfo, "stopEffect", "(I)V"))
  214. {
  215. return ;
  216. }
  217. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, (int)nSoundId);
  218. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  219. }
  220. void endJNI()
  221. {
  222. // void end()
  223. JniMethodInfo methodInfo;
  224. if (! getStaticMethodInfo(methodInfo, "end", "()V"))
  225. {
  226. return ;
  227. }
  228. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  229. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  230. }
  231. float getEffectsVolumeJNI()
  232. {
  233. // float getEffectsVolume()
  234. JniMethodInfo methodInfo;
  235. jfloat ret = -1.0;
  236. if (! getStaticMethodInfo(methodInfo, "getEffectsVolume", "()F"))
  237. {
  238. return ret;
  239. }
  240. ret = methodInfo.env->CallStaticFloatMethod(methodInfo.classID, methodInfo.methodID);
  241. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  242. return ret;
  243. }
  244. void setEffectsVolumeJNI(float volume)
  245. {
  246. // void setEffectsVolume(float)
  247. JniMethodInfo methodInfo;
  248. if (! getStaticMethodInfo(methodInfo, "setEffectsVolume", "(F)V"))
  249. {
  250. return ;
  251. }
  252. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, volume);
  253. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  254. }
  255. void preloadEffectJNI(const char *path)
  256. {
  257. // void preloadEffect(String)
  258. JniMethodInfo methodInfo;
  259. if (! getStaticMethodInfo(methodInfo, "preloadEffect", "(Ljava/lang/String;)V"))
  260. {
  261. return ;
  262. }
  263. jstring stringArg = methodInfo.env->NewStringUTF(path);
  264. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg);
  265. methodInfo.env->DeleteLocalRef(stringArg);
  266. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  267. }
  268. void unloadEffectJNI(const char* path)
  269. {
  270. // void unloadEffect(String)
  271. JniMethodInfo methodInfo;
  272. if (! getStaticMethodInfo(methodInfo, "unloadEffect", "(Ljava/lang/String;)V"))
  273. {
  274. return ;
  275. }
  276. jstring stringArg = methodInfo.env->NewStringUTF(path);
  277. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg);
  278. methodInfo.env->DeleteLocalRef(stringArg);
  279. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  280. }
  281. void pauseEffectJNI(unsigned int nSoundId)
  282. {
  283. // void pauseEffect(int)
  284. JniMethodInfo methodInfo;
  285. if (! getStaticMethodInfo(methodInfo, "pauseEffect", "(I)V"))
  286. {
  287. return ;
  288. }
  289. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, (int)nSoundId);
  290. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  291. }
  292. void pauseAllEffectsJNI()
  293. {
  294. // void pauseAllEffects()
  295. JniMethodInfo methodInfo;
  296. if (! getStaticMethodInfo(methodInfo, "pauseAllEffects", "()V"))
  297. {
  298. return ;
  299. }
  300. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  301. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  302. }
  303. void resumeEffectJNI(unsigned int nSoundId)
  304. {
  305. // void resumeEffect(int)
  306. JniMethodInfo methodInfo;
  307. if (! getStaticMethodInfo(methodInfo, "resumeEffect", "(I)V"))
  308. {
  309. return ;
  310. }
  311. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, (int)nSoundId);
  312. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  313. }
  314. void resumeAllEffectsJNI()
  315. {
  316. // void resumeAllEffects()
  317. JniMethodInfo methodInfo;
  318. if (! getStaticMethodInfo(methodInfo, "resumeAllEffects", "()V"))
  319. {
  320. return ;
  321. }
  322. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  323. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  324. }
  325. void stopAllEffectsJNI()
  326. {
  327. // void stopAllEffects()
  328. JniMethodInfo methodInfo;
  329. if (! getStaticMethodInfo(methodInfo, "stopAllEffects", "()V"))
  330. {
  331. return ;
  332. }
  333. methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID);
  334. methodInfo.env->DeleteLocalRef(methodInfo.classID);
  335. }
  336. }