android_jni.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include <jni.h>
  2. #include <android/log.h>
  3. #define TAG "sdlpal-jni"
  4. #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,__VA_ARGS__)
  5. #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG,__VA_ARGS__)
  6. #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG,__VA_ARGS__)
  7. #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG,__VA_ARGS__)
  8. #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG,__VA_ARGS__)
  9. #define EXTERN_C_LINKAGE extern "C"
  10. #include "palcommon.h"
  11. #include "global.h"
  12. #include "palcfg.h"
  13. #include "util.h"
  14. char externalStoragePath[1024];
  15. char midiInterFile[1024];
  16. static int jstring_to_utf8(JNIEnv* env, jstring j_str, char *buffer, int capacity)
  17. {
  18. jsize length = env->GetStringUTFLength(j_str);
  19. const char * const base = env->GetStringUTFChars(j_str, NULL);
  20. if (base == NULL)
  21. {
  22. return 0;
  23. }
  24. if (capacity <= length)
  25. length = capacity - 1;
  26. strncpy(buffer, base, length);
  27. env->ReleaseStringUTFChars(j_str, base);
  28. buffer[length] = '\0';
  29. return length;
  30. }
  31. static JavaVM* gJVM;
  32. EXTERN_C_LINKAGE jint JNI_OnLoad(JavaVM* vm, void* reserved)
  33. {
  34. JNIEnv* env;
  35. if (vm->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
  36. return -1;
  37. }
  38. gJVM = vm;
  39. return JNI_VERSION_1_2;
  40. }
  41. static JNIEnv* getJNIEnv()
  42. {
  43. JNIEnv* env;
  44. if (gJVM->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
  45. return NULL;
  46. }
  47. return env;
  48. }
  49. /*
  50. * Class: io_github_sdlpal_PalActivity
  51. * Method: setExternalStorage
  52. * Signature: (Ljava/lang/String;)V
  53. */
  54. EXTERN_C_LINKAGE
  55. JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setExternalStorage(JNIEnv *env, jclass cls, jstring j_str)
  56. {
  57. jstring_to_utf8(env, j_str, externalStoragePath, sizeof(externalStoragePath) - 8);
  58. strcat(externalStoragePath, "/sdlpal/");
  59. LOGV("JNI got externalStoragePath:%s", externalStoragePath);
  60. }
  61. /*
  62. * Class: io_github_sdlpal_PalActivity
  63. * Method: setMIDIInterFile
  64. * Signature: (Ljava/lang/String;)V
  65. */
  66. EXTERN_C_LINKAGE
  67. JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setMIDIInterFile(JNIEnv *env, jclass cls, jstring j_str)
  68. {
  69. jstring_to_utf8(env, j_str, midiInterFile, sizeof(midiInterFile));
  70. LOGV("JNI got midi inter filename:%s", midiInterFile);
  71. }
  72. EXTERN_C_LINKAGE
  73. void* JNI_mediaplayer_load(const char *filename)
  74. {
  75. JNIEnv* env = getJNIEnv();
  76. jclass clazz = env->FindClass("io/github/sdlpal/PalActivity");
  77. jmethodID mid = env->GetStaticMethodID(clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
  78. jstring str = env->NewStringUTF(filename);
  79. jobject player = env->CallStaticObjectMethod(clazz, mid, str);
  80. env->DeleteLocalRef(str);
  81. return env->NewGlobalRef(player);
  82. }
  83. EXTERN_C_LINKAGE
  84. void JNI_mediaplayer_free(void *player)
  85. {
  86. getJNIEnv()->DeleteGlobalRef((jobject)player);
  87. }
  88. EXTERN_C_LINKAGE
  89. void JNI_mediaplayer_play(void *player, int looping)
  90. {
  91. JNIEnv* env = getJNIEnv();
  92. jclass clazz = env->FindClass("android/media/MediaPlayer");
  93. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setLooping", "(Z)V"), looping ? JNI_TRUE : JNI_FALSE);
  94. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "start", "()V"));
  95. }
  96. EXTERN_C_LINKAGE
  97. void JNI_mediaplayer_stop(void *player)
  98. {
  99. JNIEnv* env = getJNIEnv();
  100. jclass clazz = env->FindClass("android/media/MediaPlayer");
  101. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "stop", "()V"));
  102. }
  103. EXTERN_C_LINKAGE
  104. int JNI_mediaplayer_isplaying(void *player)
  105. {
  106. JNIEnv* env = getJNIEnv();
  107. jclass clazz = env->FindClass("android/media/MediaPlayer");
  108. return env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
  109. }
  110. EXTERN_C_LINKAGE
  111. void JNI_mediaplayer_setvolume(void *player, int volume)
  112. {
  113. float vol = (float)volume / 127.0f;
  114. JNIEnv* env = getJNIEnv();
  115. jclass clazz = env->FindClass("android/media/MediaPlayer");
  116. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setVolume", "(FF)V"), vol, vol);
  117. }
  118. EXTERN_C_LINKAGE
  119. LPCSTR
  120. UTIL_BasePath(
  121. VOID
  122. )
  123. {
  124. return externalStoragePath;
  125. }
  126. EXTERN_C_LINKAGE
  127. LPCSTR
  128. UTIL_SavePath(
  129. VOID
  130. )
  131. {
  132. return externalStoragePath;
  133. }
  134. EXTERN_C_LINKAGE
  135. BOOL
  136. UTIL_GetScreenSize(
  137. DWORD *pdwScreenWidth,
  138. DWORD *pdwScreenHeight
  139. )
  140. {
  141. *pdwScreenWidth = 640;
  142. *pdwScreenHeight = 400;
  143. return TRUE;
  144. }
  145. EXTERN_C_LINKAGE
  146. BOOL
  147. UTIL_IsAbsolutePath(
  148. LPCSTR lpszFileName
  149. )
  150. {
  151. return lpszFileName[0] == '/';
  152. }
  153. EXTERN_C_LINKAGE
  154. INT
  155. UTIL_Platform_Init(
  156. int argc,
  157. char* argv[]
  158. )
  159. {
  160. gConfig.fLaunchSetting = FALSE;
  161. return 0;
  162. }
  163. EXTERN_C_LINKAGE
  164. VOID
  165. UTIL_Platform_Quit(
  166. VOID
  167. )
  168. {
  169. }
  170. #ifdef ENABLE_NEWLOG
  171. static int maxLogLevel = LOG_WARNING;
  172. PAL_C_LINKAGE VOID
  173. UTIL_SetLogLevel(
  174. int level
  175. )
  176. {
  177. if (level >= LOG_EMERG && level < LOG_LAST_PRIORITY)
  178. {
  179. maxLogLevel = level;
  180. }
  181. }
  182. EXTERN_C_LINKAGE
  183. VOID
  184. UTIL_WriteLog(
  185. int Priority,
  186. const char *Fmt,
  187. ...
  188. )
  189. {
  190. if (Priority < LOG_EMERG || Priority > maxLogLevel)
  191. {
  192. return;
  193. }
  194. switch(Priority)
  195. {
  196. case LOG_EMERG: Priority = ANDROID_LOG_FATAL; break;
  197. case LOG_ALERT: Priority = ANDROID_LOG_FATAL; break;
  198. case LOG_CRIT: Priority = ANDROID_LOG_ERROR; break;
  199. case LOG_ERR: Priority = ANDROID_LOG_ERROR; break;
  200. case LOG_WARNING: Priority = ANDROID_LOG_WARN; break;
  201. case LOG_NOTICE: Priority = ANDROID_LOG_INFO; break;
  202. case LOG_INFO: Priority = ANDROID_LOG_INFO; break;
  203. case LOG_DEBUG: Priority = ANDROID_LOG_DEBUG; break;
  204. default: Priority = ANDROID_LOG_VERBOSE; break;
  205. }
  206. va_list ap;
  207. va_start(ap, Fmt);
  208. __android_log_vprint(ANDROID_LOG_VERBOSE, TAG, Fmt, ap);
  209. va_end(ap);
  210. }
  211. #endif