android_jni.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  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 "generated.h"
  15. #include <unistd.h>
  16. #include <sys/stat.h>
  17. #include <string>
  18. static std::string g_basepath, g_configpath, g_cachepath, g_midipath;
  19. static int g_screenWidth = 640, g_screenHeight = 400;
  20. const char* midiInterFile;
  21. static std::string jstring_to_utf8(JNIEnv* env, jstring j_str)
  22. {
  23. jsize length = env->GetStringUTFLength(j_str);
  24. const char * const base = env->GetStringUTFChars(j_str, NULL);
  25. if (base == NULL) return "";
  26. std::string value(base, length);
  27. env->ReleaseStringUTFChars(j_str, base);
  28. return value;
  29. }
  30. static JavaVM* gJVM;
  31. EXTERN_C_LINKAGE jint JNI_OnLoad(JavaVM* vm, void* reserved)
  32. {
  33. JNIEnv* env;
  34. if (vm->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
  35. return -1;
  36. }
  37. gJVM = vm;
  38. return JNI_VERSION_1_2;
  39. }
  40. static JNIEnv* getJNIEnv()
  41. {
  42. JNIEnv* env;
  43. if (gJVM->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
  44. return NULL;
  45. }
  46. return env;
  47. }
  48. /*
  49. * Class: com_sdlpal_sdlpal_MainActivity
  50. * Method: setAppPath
  51. * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
  52. */
  53. EXTERN_C_LINKAGE
  54. JNIEXPORT void JNICALL Java_com_sdlpal_sdlpal_MainActivity_setAppPath(JNIEnv *env, jclass cls, jstring base_path, jstring data_path, jstring cache_path)
  55. {
  56. g_basepath = jstring_to_utf8(env, base_path);
  57. g_configpath = jstring_to_utf8(env, data_path);
  58. g_cachepath = jstring_to_utf8(env, cache_path);
  59. LOGV("got basepath:%s,configpath:%s,cachepath:%s\n",g_basepath.c_str(),g_configpath.c_str(),g_cachepath.c_str());
  60. if (*g_basepath.rbegin() != '/') g_basepath.append("/");
  61. if (*g_configpath.rbegin() != '/') g_configpath.append("/");
  62. if (*g_cachepath.rbegin() != '/') g_cachepath.append("/");
  63. g_midipath = g_cachepath + "intermediates.mid";
  64. midiInterFile = g_midipath.c_str();
  65. }
  66. /*
  67. * Class: com_sdlpal_sdlpal_PalActivity
  68. * Method: setScreenSize
  69. * Signature: (II)V
  70. */
  71. EXTERN_C_LINKAGE
  72. JNIEXPORT void JNICALL Java_com_sdlpal_sdlpal_PalActivity_setScreenSize(JNIEnv *env, jclass cls, int width, int height)
  73. {
  74. g_screenWidth = width;
  75. g_screenHeight = height;
  76. }
  77. /*
  78. * Class: com_sdlpal_sdlpal_SettingsActivity
  79. * Method: getGitRevision
  80. * Signature: (V)Ljava/lang/String;
  81. */
  82. EXTERN_C_LINKAGE
  83. JNIEXPORT jstring JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getGitRevision(JNIEnv *env, jclass cls)
  84. {
  85. return env->NewStringUTF(PAL_GIT_REVISION);
  86. }
  87. /*
  88. * Class: com_sdlpal_sdlpal_SettingsActivity
  89. * Method: loadConfigFile
  90. * Signature: (V)Z
  91. */
  92. EXTERN_C_LINKAGE
  93. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_loadConfigFile(JNIEnv *env, jclass cls)
  94. {
  95. PAL_LoadConfig(TRUE);
  96. return gConfig.fLaunchSetting ? JNI_TRUE : JNI_FALSE;
  97. }
  98. /*
  99. * Class: com_sdlpal_sdlpal_SettingsActivity
  100. * Method: saveConfigFile
  101. * Signature: (V)Z
  102. */
  103. EXTERN_C_LINKAGE
  104. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_saveConfigFile(JNIEnv *env, jclass cls)
  105. {
  106. return PAL_SaveConfig() ? JNI_TRUE : JNI_FALSE;
  107. }
  108. /*
  109. * Class: com_sdlpal_sdlpal_SettingsActivity
  110. * Method: getConfigBoolean
  111. * Signature: (Ljava/lang/String;Z)Z
  112. */
  113. EXTERN_C_LINKAGE
  114. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getConfigBoolean(JNIEnv *env, jclass cls, jstring j_str, jboolean defval)
  115. {
  116. PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
  117. return item >= 0 ? PAL_GetConfigBoolean(item, defval) : JNI_FALSE;
  118. }
  119. /*
  120. * Class: com_sdlpal_sdlpal_SettingsActivity
  121. * Method: getConfigInt
  122. * Signature: (Ljava/lang/String;Z)I
  123. */
  124. EXTERN_C_LINKAGE
  125. JNIEXPORT int JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getConfigInt(JNIEnv *env, jclass cls, jstring j_str, jboolean defval)
  126. {
  127. PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
  128. return item >= 0 ? (int)PAL_GetConfigNumber(item, defval) : 0;
  129. }
  130. /*
  131. * Class: com_sdlpal_sdlpal_SettingsActivity
  132. * Method: getConfigString
  133. * Signature: (Ljava/lang/String;Z)ILjava/lang/String;
  134. */
  135. EXTERN_C_LINKAGE
  136. JNIEXPORT jstring JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getConfigString(JNIEnv *env, jclass cls, jstring j_str, jboolean defval)
  137. {
  138. PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
  139. return item >= 0 ? env->NewStringUTF(PAL_GetConfigString(item, defval)) : nullptr;
  140. }
  141. /*
  142. * Class: com_sdlpal_sdlpal_SettingsActivity
  143. * Method: setConfigBoolean
  144. * Signature: (Ljava/lang/String;Z)Z
  145. */
  146. EXTERN_C_LINKAGE
  147. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_setConfigBoolean(JNIEnv *env, jclass cls, jstring j_str, jboolean val)
  148. {
  149. PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
  150. return item >= 0 ? PAL_SetConfigBoolean(item, val ? TRUE : FALSE) : JNI_FALSE;
  151. }
  152. /*
  153. * Class: com_sdlpal_sdlpal_SettingsActivity
  154. * Method: setConfigInt
  155. * Signature: (Ljava/lang/String;I)Z
  156. */
  157. EXTERN_C_LINKAGE
  158. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_setConfigInt(JNIEnv *env, jclass cls, jstring j_str, int val)
  159. {
  160. PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
  161. return item >= 0 ? PAL_SetConfigNumber(item, (long)val) : JNI_FALSE;
  162. }
  163. /*
  164. * Class: com_sdlpal_sdlpal_SettingsActivity
  165. * Method: setConfigString
  166. * Signature: (Ljava/lang/String;Ljava/lang/String;)I
  167. */
  168. EXTERN_C_LINKAGE
  169. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_setConfigString(JNIEnv *env, jclass cls, jstring j_str, jstring v_str)
  170. {
  171. PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
  172. return item >= 0 ? PAL_SetConfigString(item, v_str ? jstring_to_utf8(env, v_str).c_str() : nullptr) : JNI_FALSE;
  173. }
  174. /*
  175. * Class: com_sdlpal_sdlpal_SettingsActivity
  176. * Method: checkResourceFiles
  177. * Signature: (Ljava/lang/String;Ljava/lang/String;)Z
  178. */
  179. EXTERN_C_LINKAGE
  180. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_checkResourceFiles(JNIEnv *env, jclass cls, jstring path_str, jstring msg_str)
  181. {
  182. return PAL_MISSING_REQUIRED(UTIL_CheckResourceFiles(
  183. jstring_to_utf8(env, path_str).c_str(),
  184. jstring_to_utf8(env, msg_str).c_str()
  185. )) ? JNI_FALSE : JNI_TRUE;
  186. }
  187. /*
  188. * Class: com_sdlpal_sdlpal_SettingsActivity
  189. * Method: isDirWritable
  190. * Signature: (Ljava/lang/String;)Z
  191. */
  192. EXTERN_C_LINKAGE
  193. JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_isDirWritable(JNIEnv *env, jclass cls, jstring path)
  194. {
  195. std::string str_path = jstring_to_utf8(env, path);
  196. mkdir(str_path.c_str(), 0755);
  197. str_path += "/test";
  198. FILE *fp = fopen(str_path.c_str(), "wb");
  199. if (fp == NULL) {
  200. return JNI_FALSE;
  201. }
  202. fclose(fp);
  203. unlink(str_path.c_str());
  204. return JNI_TRUE;
  205. }
  206. EXTERN_C_LINKAGE
  207. void* JNI_mediaplayer_load(const char *filename)
  208. {
  209. JNIEnv* env = getJNIEnv();
  210. jclass clazz = env->FindClass("com/sdlpal/sdlpal/PalActivity");
  211. jmethodID mid = env->GetStaticMethodID(clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
  212. jstring str = env->NewStringUTF(filename);
  213. jobject player_local = env->CallStaticObjectMethod(clazz, mid, str);
  214. jobject player = env->NewGlobalRef(player_local);
  215. env->DeleteLocalRef(str);
  216. env->DeleteLocalRef(player_local);
  217. env->DeleteLocalRef(clazz);
  218. return player;
  219. }
  220. EXTERN_C_LINKAGE
  221. void JNI_mediaplayer_free(void *player)
  222. {
  223. getJNIEnv()->DeleteGlobalRef((jobject)player);
  224. }
  225. EXTERN_C_LINKAGE
  226. void JNI_mediaplayer_play(void *player, int looping)
  227. {
  228. JNIEnv* env = getJNIEnv();
  229. jclass clazz = env->FindClass("android/media/MediaPlayer");
  230. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setLooping", "(Z)V"), looping ? JNI_TRUE : JNI_FALSE);
  231. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "start", "()V"));
  232. env->DeleteLocalRef(clazz);
  233. }
  234. EXTERN_C_LINKAGE
  235. void JNI_mediaplayer_stop(void *player)
  236. {
  237. JNIEnv* env = getJNIEnv();
  238. jclass clazz = env->FindClass("android/media/MediaPlayer");
  239. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "stop", "()V"));
  240. env->DeleteLocalRef(clazz);
  241. }
  242. EXTERN_C_LINKAGE
  243. int JNI_mediaplayer_isplaying(void *player)
  244. {
  245. JNIEnv* env = getJNIEnv();
  246. jclass clazz = env->FindClass("android/media/MediaPlayer");
  247. int playing = env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
  248. env->DeleteLocalRef(clazz);
  249. return playing;
  250. }
  251. EXTERN_C_LINKAGE
  252. void JNI_mediaplayer_setvolume(void *player, int volume)
  253. {
  254. float vol = (float)volume / 127.0f;
  255. JNIEnv* env = getJNIEnv();
  256. jclass clazz = env->FindClass("android/media/MediaPlayer");
  257. env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setVolume", "(FF)V"), vol, vol);
  258. env->DeleteLocalRef(clazz);
  259. }
  260. EXTERN_C_LINKAGE
  261. LPCSTR
  262. UTIL_BasePath(
  263. VOID
  264. )
  265. {
  266. return g_basepath.c_str();
  267. }
  268. EXTERN_C_LINKAGE
  269. LPCSTR
  270. UTIL_ConfigPath(
  271. VOID
  272. )
  273. {
  274. return g_configpath.c_str();
  275. }
  276. EXTERN_C_LINKAGE
  277. BOOL
  278. UTIL_GetScreenSize(
  279. DWORD *pdwScreenWidth,
  280. DWORD *pdwScreenHeight
  281. )
  282. {
  283. if (*pdwScreenWidth) *pdwScreenWidth = g_screenWidth;
  284. if (*pdwScreenHeight) *pdwScreenHeight = g_screenHeight;
  285. return (pdwScreenWidth && pdwScreenHeight && *pdwScreenWidth && *pdwScreenHeight);
  286. }
  287. EXTERN_C_LINKAGE
  288. BOOL
  289. UTIL_IsAbsolutePath(
  290. LPCSTR lpszFileName
  291. )
  292. {
  293. return lpszFileName[0] == '/';
  294. }
  295. EXTERN_C_LINKAGE
  296. INT
  297. UTIL_Platform_Init(
  298. int argc,
  299. char* argv[]
  300. )
  301. {
  302. UTIL_LogAddOutputCallback([](LOGLEVEL level, const char*, const char* str)->void {
  303. const static int level_mapping[] = {
  304. ANDROID_LOG_VERBOSE,
  305. ANDROID_LOG_DEBUG,
  306. ANDROID_LOG_INFO,
  307. ANDROID_LOG_WARN,
  308. ANDROID_LOG_ERROR
  309. };
  310. __android_log_print(level_mapping[level], TAG, "%s", str);
  311. }, PAL_DEFAULT_LOGLEVEL);
  312. FILE *fp = fopen((g_cachepath + "running").c_str(), "w");
  313. if (fp) fclose(fp);
  314. return 0;
  315. }
  316. EXTERN_C_LINKAGE
  317. VOID
  318. UTIL_Platform_Quit(
  319. VOID
  320. )
  321. {
  322. unlink((g_cachepath + "running").c_str());
  323. }