android_jni.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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. #include <string>
  15. static std::string g_basepath, g_configpath, g_midipath;
  16. static int g_screenWidth = 640, g_screenHeight = 400;
  17. const char* midiInterFile;
  18. static std::string jstring_to_utf8(JNIEnv* env, jstring j_str)
  19. {
  20. jsize length = env->GetStringUTFLength(j_str);
  21. const char * const base = env->GetStringUTFChars(j_str, NULL);
  22. if (base == NULL) return "";
  23. std::string value(base, length);
  24. env->ReleaseStringUTFChars(j_str, base);
  25. return value;
  26. }
  27. static JavaVM* gJVM;
  28. EXTERN_C_LINKAGE jint JNI_OnLoad(JavaVM* vm, void* reserved)
  29. {
  30. JNIEnv* env;
  31. if (vm->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
  32. return -1;
  33. }
  34. gJVM = vm;
  35. return JNI_VERSION_1_2;
  36. }
  37. static JNIEnv* getJNIEnv()
  38. {
  39. JNIEnv* env;
  40. if (gJVM->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
  41. return NULL;
  42. }
  43. return env;
  44. }
  45. /*
  46. * Class: io_github_sdlpal_PalActivity
  47. * Method: setAppPath
  48. * Signature: (Ljava/lang/String;Ljava/lang/String;)V
  49. */
  50. EXTERN_C_LINKAGE
  51. JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setAppPath(JNIEnv *env, jclass cls, jstring base_path, jstring cache_path)
  52. {
  53. g_basepath = jstring_to_utf8(env, base_path);
  54. g_configpath = jstring_to_utf8(env, cache_path);
  55. if (*g_basepath.rbegin() != '/') g_basepath.append("/");
  56. if (*g_configpath.rbegin() != '/') g_configpath.append("/");
  57. g_midipath = g_configpath + "intermediates.mid";
  58. midiInterFile = g_midipath.c_str();
  59. }
  60. /*
  61. * Class: io_github_sdlpal_PalActivity
  62. * Method: setScreenSize
  63. * Signature: (II)V
  64. */
  65. EXTERN_C_LINKAGE
  66. JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setScreenSize(JNIEnv *env, jclass cls, int width, int height)
  67. {
  68. g_screenWidth = width;
  69. g_screenHeight = height;
  70. }
  71. /*
  72. * Class: io_github_sdlpal_SettingsActivity
  73. * Method: loadConfigFile
  74. * Signature: (V)Z
  75. */
  76. EXTERN_C_LINKAGE
  77. JNIEXPORT jboolean JNICALL Java_io_github_sdlpal_SettingsActivity_loadConfigFile(JNIEnv *env, jclass cls)
  78. {
  79. PAL_LoadConfig(TRUE);
  80. return gConfig.fLaunchSetting ? JNI_TRUE : JNI_FALSE;
  81. }
  82. /*
  83. * Class: io_github_sdlpal_SettingsActivity
  84. * Method: saveConfigFile
  85. * Signature: (V)Z
  86. */
  87. EXTERN_C_LINKAGE
  88. JNIEXPORT jboolean JNICALL Java_io_github_sdlpal_SettingsActivity_saveConfigFile(JNIEnv *env, jclass cls)
  89. {
  90. return PAL_SaveConfig() ? JNI_TRUE : JNI_FALSE;
  91. }
  92. /*
  93. * Class: io_github_sdlpal_SettingsActivity
  94. * Method: getConfigBoolean
  95. * Signature: (Ljava/lang/String;)Z
  96. */
  97. EXTERN_C_LINKAGE
  98. JNIEXPORT jboolean JNICALL Java_io_github_sdlpal_SettingsActivity_getConfigBoolean(JNIEnv *env, jclass cls, jstring j_str)
  99. {
  100. ConfigValue value;
  101. std::string name = jstring_to_utf8(env, j_str);
  102. return PAL_GetConfigItem(name.c_str(), &value) ? value.bValue : JNI_FALSE;
  103. }
  104. /*
  105. * Class: io_github_sdlpal_SettingsActivity
  106. * Method: getConfigInt
  107. * Signature: (Ljava/lang/String;)I
  108. */
  109. EXTERN_C_LINKAGE
  110. JNIEXPORT int JNICALL Java_io_github_sdlpal_SettingsActivity_getConfigInt(JNIEnv *env, jclass cls, jstring j_str)
  111. {
  112. ConfigValue value;
  113. std::string name = jstring_to_utf8(env, j_str);
  114. return PAL_GetConfigItem(name.c_str(), &value) ? value.iValue : JNI_FALSE;
  115. }
  116. /*
  117. * Class: io_github_sdlpal_SettingsActivity
  118. * Method: getConfigString
  119. * Signature: (Ljava/lang/String;)ILjava/lang/String;
  120. */
  121. EXTERN_C_LINKAGE
  122. JNIEXPORT jstring JNICALL Java_io_github_sdlpal_SettingsActivity_getConfigString(JNIEnv *env, jclass cls, jstring j_str)
  123. {
  124. ConfigValue value;
  125. std::string name = jstring_to_utf8(env, j_str);
  126. return PAL_GetConfigItem(name.c_str(), &value) ? env->NewStringUTF(value.sValue) : nullptr;
  127. }
  128. /*
  129. * Class: io_github_sdlpal_SettingsActivity
  130. * Method: setConfigBoolean
  131. * Signature: (Ljava/lang/String;Z)Z
  132. */
  133. EXTERN_C_LINKAGE
  134. JNIEXPORT jboolean JNICALL Java_io_github_sdlpal_SettingsActivity_setConfigBoolean(JNIEnv *env, jclass cls, jstring j_str, jboolean val)
  135. {
  136. ConfigValue value = { (LPCSTR)(val ? TRUE : FALSE) };
  137. std::string name = jstring_to_utf8(env, j_str);
  138. return PAL_SetConfigItem(name.c_str(), &value) ? JNI_TRUE : JNI_FALSE;
  139. }
  140. /*
  141. * Class: io_github_sdlpal_SettingsActivity
  142. * Method: setConfigInt
  143. * Signature: (Ljava/lang/String;I)Z
  144. */
  145. EXTERN_C_LINKAGE
  146. JNIEXPORT jboolean JNICALL Java_io_github_sdlpal_SettingsActivity_setConfigInt(JNIEnv *env, jclass cls, jstring j_str, int val)
  147. {
  148. ConfigValue value = { (LPCSTR)val };
  149. std::string name = jstring_to_utf8(env, j_str);
  150. return PAL_SetConfigItem(name.c_str(), &value) ? JNI_TRUE : JNI_FALSE;
  151. }
  152. /*
  153. * Class: io_github_sdlpal_SettingsActivity
  154. * Method: setConfigString
  155. * Signature: (Ljava/lang/String;Ljava/lang/String;)I
  156. */
  157. EXTERN_C_LINKAGE
  158. JNIEXPORT jboolean JNICALL Java_io_github_sdlpal_SettingsActivity_setConfigString(JNIEnv *env, jclass cls, jstring j_str, jstring v_str)
  159. {
  160. std::string name = jstring_to_utf8(env, j_str);
  161. std::string val = jstring_to_utf8(env, v_str);
  162. ConfigValue value = { val.c_str() };
  163. return PAL_SetConfigItem(name.c_str(), &value) ? JNI_TRUE : JNI_FALSE;
  164. }
  165. EXTERN_C_LINKAGE
  166. void* JNI_mediaplayer_load(const char *filename)
  167. {
  168. JNIEnv* env = getJNIEnv();
  169. jclass clazz = env->FindClass("io/github/sdlpal/PalActivity");
  170. jmethodID mid = env->GetStaticMethodID(clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
  171. jstring str = env->NewStringUTF(filename);
  172. jobject player = env->CallStaticObjectMethod(clazz, mid, str);
  173. env->DeleteLocalRef(str);
  174. return env->NewGlobalRef(player);
  175. }
  176. EXTERN_C_LINKAGE
  177. void JNI_mediaplayer_free(void *player)
  178. {
  179. getJNIEnv()->DeleteGlobalRef((jobject)player);
  180. }
  181. EXTERN_C_LINKAGE
  182. void JNI_mediaplayer_play(void *player, int looping)
  183. {
  184. JNIEnv* env = getJNIEnv();
  185. jclass clazz = env->FindClass("android/media/MediaPlayer");
  186. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setLooping", "(Z)V"), looping ? JNI_TRUE : JNI_FALSE);
  187. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "start", "()V"));
  188. }
  189. EXTERN_C_LINKAGE
  190. void JNI_mediaplayer_stop(void *player)
  191. {
  192. JNIEnv* env = getJNIEnv();
  193. jclass clazz = env->FindClass("android/media/MediaPlayer");
  194. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "stop", "()V"));
  195. }
  196. EXTERN_C_LINKAGE
  197. int JNI_mediaplayer_isplaying(void *player)
  198. {
  199. JNIEnv* env = getJNIEnv();
  200. jclass clazz = env->FindClass("android/media/MediaPlayer");
  201. return env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
  202. }
  203. EXTERN_C_LINKAGE
  204. void JNI_mediaplayer_setvolume(void *player, int volume)
  205. {
  206. float vol = (float)volume / 127.0f;
  207. JNIEnv* env = getJNIEnv();
  208. jclass clazz = env->FindClass("android/media/MediaPlayer");
  209. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setVolume", "(FF)V"), vol, vol);
  210. }
  211. EXTERN_C_LINKAGE
  212. LPCSTR
  213. UTIL_BasePath(
  214. VOID
  215. )
  216. {
  217. return g_basepath.c_str();
  218. }
  219. EXTERN_C_LINKAGE
  220. LPCSTR
  221. UTIL_SavePath(
  222. VOID
  223. )
  224. {
  225. return g_basepath.c_str();
  226. }
  227. EXTERN_C_LINKAGE
  228. LPCSTR
  229. UTIL_ConfigPath(
  230. VOID
  231. )
  232. {
  233. return g_configpath.c_str();
  234. }
  235. EXTERN_C_LINKAGE
  236. BOOL
  237. UTIL_GetScreenSize(
  238. DWORD *pdwScreenWidth,
  239. DWORD *pdwScreenHeight
  240. )
  241. {
  242. if (*pdwScreenWidth) *pdwScreenWidth = g_screenWidth;
  243. if (*pdwScreenHeight) *pdwScreenHeight = g_screenHeight;
  244. return (pdwScreenWidth && pdwScreenHeight && *pdwScreenWidth && *pdwScreenHeight);
  245. }
  246. EXTERN_C_LINKAGE
  247. BOOL
  248. UTIL_IsAbsolutePath(
  249. LPCSTR lpszFileName
  250. )
  251. {
  252. return lpszFileName[0] == '/';
  253. }
  254. EXTERN_C_LINKAGE
  255. INT
  256. UTIL_Platform_Init(
  257. int argc,
  258. char* argv[]
  259. )
  260. {
  261. UTIL_LogAddOutputCallback([](LOGLEVEL level, const char*, const char* str)->void {
  262. const static int level_mapping[] = {
  263. ANDROID_LOG_VERBOSE,
  264. ANDROID_LOG_DEBUG,
  265. ANDROID_LOG_INFO,
  266. ANDROID_LOG_WARN,
  267. ANDROID_LOG_ERROR
  268. };
  269. __android_log_print(level_mapping[level], TAG, "%s", str);
  270. });
  271. FILE *fp = fopen((g_configpath + "running").c_str(), "w");
  272. if (fp) fclose(fp);
  273. return 0;
  274. }
  275. EXTERN_C_LINKAGE
  276. VOID
  277. UTIL_Platform_Quit(
  278. VOID
  279. )
  280. {
  281. unlink((g_configpath + "running").c_str());
  282. }