123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- #include <jni.h>
- #include <android/log.h>
- #define TAG "sdlpal-jni"
- #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG,__VA_ARGS__)
- #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , TAG,__VA_ARGS__)
- #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , TAG,__VA_ARGS__)
- #define LOGW(...) __android_log_print(ANDROID_LOG_WARN , TAG,__VA_ARGS__)
- #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR , TAG,__VA_ARGS__)
- #define EXTERN_C_LINKAGE extern "C"
- #include "palcommon.h"
- #include "global.h"
- #include "palcfg.h"
- #include "util.h"
- #include "generated.h"
- #include <string>
- static std::string g_basepath, g_configpath, g_cachepath, g_midipath;
- static int g_screenWidth = 640, g_screenHeight = 400;
- const char* midiInterFile;
- static std::string jstring_to_utf8(JNIEnv* env, jstring j_str)
- {
- jsize length = env->GetStringUTFLength(j_str);
- const char * const base = env->GetStringUTFChars(j_str, NULL);
- if (base == NULL) return "";
- std::string value(base, length);
- env->ReleaseStringUTFChars(j_str, base);
- return value;
- }
- static JavaVM* gJVM;
- EXTERN_C_LINKAGE jint JNI_OnLoad(JavaVM* vm, void* reserved)
- {
- JNIEnv* env;
- if (vm->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
- return -1;
- }
- gJVM = vm;
- return JNI_VERSION_1_2;
- }
- static JNIEnv* getJNIEnv()
- {
- JNIEnv* env;
- if (gJVM->GetEnv((void**)&env, JNI_VERSION_1_2) != JNI_OK) {
- return NULL;
- }
- return env;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT void JNICALL Java_com_sdlpal_sdlpal_MainActivity_setAppPath(JNIEnv *env, jclass cls, jstring base_path, jstring data_path, jstring cache_path)
- {
- g_basepath = jstring_to_utf8(env, base_path);
- g_configpath = jstring_to_utf8(env, data_path);
- g_cachepath = jstring_to_utf8(env, cache_path);
- LOGV("got basepath:%s,configpath:%s,cachepath:%s\n",g_basepath.c_str(),g_configpath.c_str(),g_cachepath.c_str());
- if (*g_basepath.rbegin() != '/') g_basepath.append("/");
- if (*g_configpath.rbegin() != '/') g_configpath.append("/");
- if (*g_cachepath.rbegin() != '/') g_cachepath.append("/");
- g_midipath = g_cachepath + "intermediates.mid";
- midiInterFile = g_midipath.c_str();
- }
- EXTERN_C_LINKAGE
- JNIEXPORT void JNICALL Java_com_sdlpal_sdlpal_PalActivity_setScreenSize(JNIEnv *env, jclass cls, int width, int height)
- {
- g_screenWidth = width;
- g_screenHeight = height;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jstring JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getGitRevision(JNIEnv *env, jclass cls)
- {
- return env->NewStringUTF(PAL_GIT_REVISION);
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_loadConfigFile(JNIEnv *env, jclass cls)
- {
- PAL_LoadConfig(TRUE);
- return gConfig.fLaunchSetting ? JNI_TRUE : JNI_FALSE;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_saveConfigFile(JNIEnv *env, jclass cls)
- {
- return PAL_SaveConfig() ? JNI_TRUE : JNI_FALSE;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getConfigBoolean(JNIEnv *env, jclass cls, jstring j_str, jboolean defval)
- {
- PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
- return item >= 0 ? PAL_GetConfigBoolean(item, defval) : JNI_FALSE;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT int JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getConfigInt(JNIEnv *env, jclass cls, jstring j_str, jboolean defval)
- {
- PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
- return item >= 0 ? (int)PAL_GetConfigNumber(item, defval) : 0;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jstring JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_getConfigString(JNIEnv *env, jclass cls, jstring j_str, jboolean defval)
- {
- PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
- return item >= 0 ? env->NewStringUTF(PAL_GetConfigString(item, defval)) : nullptr;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_setConfigBoolean(JNIEnv *env, jclass cls, jstring j_str, jboolean val)
- {
- PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
- return item >= 0 ? PAL_SetConfigBoolean(item, val ? TRUE : FALSE) : JNI_FALSE;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_setConfigInt(JNIEnv *env, jclass cls, jstring j_str, int val)
- {
- PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
- return item >= 0 ? PAL_SetConfigNumber(item, (long)val) : JNI_FALSE;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_setConfigString(JNIEnv *env, jclass cls, jstring j_str, jstring v_str)
- {
- PALCFG_ITEM item = PAL_ConfigIndex(jstring_to_utf8(env, j_str).c_str());
- return item >= 0 ? PAL_SetConfigString(item, v_str ? jstring_to_utf8(env, v_str).c_str() : nullptr) : JNI_FALSE;
- }
- EXTERN_C_LINKAGE
- JNIEXPORT jboolean JNICALL Java_com_sdlpal_sdlpal_SettingsActivity_checkResourceFiles(JNIEnv *env, jclass cls, jstring path_str, jstring msg_str)
- {
- return PAL_MISSING_REQUIRED(UTIL_CheckResourceFiles(
- jstring_to_utf8(env, path_str).c_str(),
- jstring_to_utf8(env, msg_str).c_str()
- )) ? JNI_FALSE : JNI_TRUE;
- }
- EXTERN_C_LINKAGE
- void* JNI_mediaplayer_load(const char *filename)
- {
- JNIEnv* env = getJNIEnv();
- jclass clazz = env->FindClass("com/sdlpal/sdlpal/PalActivity");
- jmethodID mid = env->GetStaticMethodID(clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
- jstring str = env->NewStringUTF(filename);
- jobject player_local = env->CallStaticObjectMethod(clazz, mid, str);
- jobject player = env->NewGlobalRef(player_local);
- env->DeleteLocalRef(str);
- env->DeleteLocalRef(player_local);
- env->DeleteLocalRef(clazz);
- return player;
- }
- EXTERN_C_LINKAGE
- void JNI_mediaplayer_free(void *player)
- {
- JNIEnv* env = getJNIEnv();
- jclass clazz = env->FindClass("android/media/MediaPlayer");
-
- env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "release", "()V"));
- env->DeleteLocalRef(clazz);
- env->DeleteGlobalRef((jobject)player);
- }
- EXTERN_C_LINKAGE
- void JNI_mediaplayer_play(void *player, int looping)
- {
- JNIEnv* env = getJNIEnv();
- jclass clazz = env->FindClass("android/media/MediaPlayer");
- env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setLooping", "(Z)V"), looping ? JNI_TRUE : JNI_FALSE);
- env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "start", "()V"));
- env->DeleteLocalRef(clazz);
- }
- EXTERN_C_LINKAGE
- void JNI_mediaplayer_stop(void *player)
- {
- JNIEnv* env = getJNIEnv();
- jclass clazz = env->FindClass("android/media/MediaPlayer");
- env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "stop", "()V"));
- env->DeleteLocalRef(clazz);
- }
- EXTERN_C_LINKAGE
- int JNI_mediaplayer_isplaying(void *player)
- {
- JNIEnv* env = getJNIEnv();
- jclass clazz = env->FindClass("android/media/MediaPlayer");
- int playing = env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
- env->DeleteLocalRef(clazz);
- return playing;
- }
- EXTERN_C_LINKAGE
- void JNI_mediaplayer_setvolume(void *player, int volume)
- {
- float vol = (float)volume / 127.0f;
- JNIEnv* env = getJNIEnv();
- jclass clazz = env->FindClass("android/media/MediaPlayer");
- env->CallVoidMethod((jobject)player, env->GetMethodID(clazz, "setVolume", "(FF)V"), vol, vol);
- env->DeleteLocalRef(clazz);
- }
- EXTERN_C_LINKAGE
- LPCSTR
- UTIL_BasePath(
- VOID
- )
- {
- return g_basepath.c_str();
- }
- EXTERN_C_LINKAGE
- LPCSTR
- UTIL_ConfigPath(
- VOID
- )
- {
- return g_configpath.c_str();
- }
- EXTERN_C_LINKAGE
- BOOL
- UTIL_GetScreenSize(
- DWORD *pdwScreenWidth,
- DWORD *pdwScreenHeight
- )
- {
- if (*pdwScreenWidth) *pdwScreenWidth = g_screenWidth;
- if (*pdwScreenHeight) *pdwScreenHeight = g_screenHeight;
- return (pdwScreenWidth && pdwScreenHeight && *pdwScreenWidth && *pdwScreenHeight);
- }
- EXTERN_C_LINKAGE
- BOOL
- UTIL_IsAbsolutePath(
- LPCSTR lpszFileName
- )
- {
- return lpszFileName[0] == '/';
- }
- EXTERN_C_LINKAGE
- INT
- UTIL_Platform_Init(
- int argc,
- char* argv[]
- )
- {
- UTIL_LogAddOutputCallback([](LOGLEVEL level, const char*, const char* str)->void {
- const static int level_mapping[] = {
- ANDROID_LOG_VERBOSE,
- ANDROID_LOG_DEBUG,
- ANDROID_LOG_INFO,
- ANDROID_LOG_WARN,
- ANDROID_LOG_ERROR
- };
- __android_log_print(level_mapping[level], TAG, "%s", str);
- }, PAL_DEFAULT_LOGLEVEL);
- FILE *fp = fopen((g_cachepath + "running").c_str(), "w");
- if (fp) fclose(fp);
- return 0;
- }
- EXTERN_C_LINKAGE
- VOID
- UTIL_Platform_Quit(
- VOID
- )
- {
- unlink((g_cachepath + "running").c_str());
- }
|