浏览代码

Android MIDI play fix

LouYihua 7 年之前
父节点
当前提交
c263fd2ebb

+ 13 - 11
android/jni/src/Android.mk

@@ -1,23 +1,25 @@
-SDLPAL_LOCAL_PATH := $(call my-dir)
-SDL_PATH := $(SDLPAL_LOCAL_PATH)/../../../3rd/SDL
+NDK_LOCAL_PATH := $(call my-dir)
+SDLPAL_PATH := $(NDK_LOCAL_PATH)/../../..
+SDL_PATH := $(SDLPAL_PATH)/3rd/SDL
 
 include $(SDL_PATH)/Android.mk
 
 include $(CLEAR_VARS)
-LOCAL_PATH := $(SDLPAL_LOCAL_PATH)
+LOCAL_PATH := $(NDK_LOCAL_PATH)
 LOCAL_MODULE := main
 
-OGG_PATH := ../../../liboggvorbis
+OGG_PATH := $(SDLPAL_PATH)/liboggvorbis
 
-LOCAL_C_INCLUDES := $(LOCAL_PATH) $(LOCAL_PATH)/../../.. $(LOCAL_PATH)/$(SDL_PATH)/include $(LOCAL_PATH)/$(OGG_PATH)/include $(LOCAL_PATH)/$(OGG_PATH)/src
+LOCAL_C_INCLUDES := $(LOCAL_PATH) $(SDLPAL_PATH) $(SDL_PATH)/include $(OGG_PATH)/include $(OGG_PATH)/src
 
 LOCAL_SRC_FILES := $(SDL_PATH)/src/main/android/SDL_android_main.c \
-    $(wildcard $(LOCAL_PATH)/../../../*.cpp) $(wildcard $(LOCAL_PATH)/../../../*.c) \
-    $(wildcard $(LOCAL_PATH)/../../../adplug/*.c) $(wildcard $(LOCAL_PATH)/../../../adplug/*.cpp) \
-    $(wildcard $(LOCAL_PATH)/../../../liboggvorbis/src/*.c) \
-    $(wildcard $(LOCAL_PATH)/../../../libmad/*.c) \
-    $(wildcard $(LOCAL_PATH)/../../../native_midi/*.c) \
-    $(wildcard $(LOCAL_PATH)/*.c) \
+    $(wildcard $(SDLPAL_PATH)/*.cpp) $(wildcard $(SDLPAL_PATH)/*.c) \
+    $(wildcard $(SDLPAL_PATH)/adplug/*.c) $(wildcard $(SDLPAL_PATH)/adplug/*.cpp) \
+    $(wildcard $(SDLPAL_PATH)/liboggvorbis/src/*.c) \
+    $(wildcard $(SDLPAL_PATH)/libmad/*.c) \
+    $(wildcard $(SDLPAL_PATH)/native_midi/*.c) \
+    $(wildcard $(LOCAL_PATH)/*.cpp) \
+    $(wildcard $(LOCAL_PATH)/*.c)
 
 LOCAL_CFLAGS += -std=gnu99 -DPAL_HAS_PLATFORM_SPECIFIC_UTILS
 

+ 0 - 174
android/jni/src/android_jni.c

@@ -1,174 +0,0 @@
-#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__)
-
-#include "palcommon.h"
-#include "global.h"
-#include "palcfg.h"
-
-char externalStoragePath[1024];
-char midiInterFile[1024];
-
-static int jstring_to_utf8(JNIEnv *env, jstring j_str, char *buffer, int capacity)
-{
-    jsize length = (*env)->GetStringUTFLength(env, j_str);
-    const char * const base = (*env)->GetStringUTFChars(env, j_str, NULL);
-    if (base == NULL)
-    {
-        return 0;
-    }
-    if (capacity <= length)
-        length = capacity - 1;
-    strncpy(buffer, base, length);
-    (*env)->ReleaseStringUTFChars(env, j_str, base);
-    base[length] = '\0';
-    return length;
-}
-
-JavaVM *globalVM;
-
-jint JNI_OnLoad(JavaVM* vm, void* reserved)
-{
-    JNIEnv* env;
-    if ((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_2) != JNI_OK) {
-        return -1;
-    }
-    globalVM = vm;
-    return JNI_VERSION_1_2;
-}
-
-JNIEnv *getJNIEnv()
-{
-    JNIEnv* env;
-    if ((*globalVM)->GetEnv(globalVM, (void**)&env, JNI_VERSION_1_2) != JNI_OK) {
-        return NULL;
-    }
-    return env;
-}
-
-/* 
- * Class:     io_github_sdlpal_PalActivity 
- * Method:    setExternalStorage 
- * Signature: (Ljava/lang/String;)V
- */  
-JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setExternalStorage(JNIEnv *env, jclass cls, jstring j_str)  
-{
-    jstring_to_utf8(env, j_str, externalStoragePath, sizeof(externalStoragePath) - 8);
-    strcat(externalStoragePath, "/sdlpal/");
-}
-
-/* 
- * Class:     io_github_sdlpal_PalActivity 
- * Method:    setMIDIInterFile 
- * Signature: (Ljava/lang/String;)V
- */  
-JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setMIDIInterFile(JNIEnv *env, jclass cls, jstring j_str)  
-{
-    jstring_to_utf8(env, j_str, midiInterFile, sizeof(midiInterFile));
-    LOGV("JNI got midi inter filename:%s", midiInterFile);
-}
-
-void* JNI_mediaplayer_load(const char *filename)
-{
-    JNIEnv *env = getJNIEnv();
-    jclass clazz = (*env)->FindClass(env, "io/github/sdlpal/PalActivity");
-    jmethodID mid = (*env)->GetStaticMethodID(env, clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
-    jstring str = (*env)->NewStringUTF(env, filename);
-    jobject player = (*env)->CallStaticObjectMethod(env, clazz, mid, str);
-    (*env)->DeleteLocalRef(env, str);
-    return (*env)->NewGlobalRef(env, player);
-}
-
-void JNI_mediaplayer_free(void *player)
-{
-    JNIEnv *env = getJNIEnv();
-    (*env)->DeleteGlobalRef(env, (jobject)player);
-}
-
-void JNI_mediaplayer_play(void *player, int looping)
-{
-    JNIEnv *env = getJNIEnv();
-    jclass clazz = (*env)->FindClass(env, "android/media/MediaPlayer");
-    (*env)->CallVoidMethod(env, (jobject)player, (*env)->GetMethodID(env, clazz, "setLooping", "(Z)V"), looping ? JNI_TRUE : JNI_FALSE);
-    (*env)->CallVoidMethod(env, (jobject)player, (*env)->GetMethodID(env, clazz, "start", "()V"));
-}
-
-void JNI_mediaplayer_stop(void *player)
-{
-    JNIEnv *env = getJNIEnv();
-    jclass clazz = (*env)->FindClass(env, "android/media/MediaPlayer");
-    (*env)->CallVoidMethod(env, (jobject)player, (*env)->GetMethodID(env, clazz, "stop", "()V"));
-}
-
-int JNI_mediaplayer_isplaying(void *player)
-{
-    JNIEnv *env = getJNIEnv();
-    jclass clazz = (*env)->FindClass(env, "android/media/MediaPlayer");
-    return (*env)->CallBooleanMethod(env, (jobject)player, (*env)->GetMethodID(env, clazz, "isPlaying", "()Z"));
-}
-
-void JNI_mediaplayer_setvolume(void *player, int volume)
-{
-    float vol = (float)volume / 127.0f;
-    JNIEnv *env = getJNIEnv();
-    jclass clazz = (*env)->FindClass(env, "android/media/MediaPlayer");
-    return (*env)->CallVoidMethod(env, (jobject)player, (*env)->GetMethodID(env, clazz, "setVolume", "(FF)V"), vol, vol);
-}
-
-LPCSTR
-UTIL_BasePath(
-   VOID
-)
-{
-    return externalStoragePath;
-}
-
-LPCSTR
-UTIL_SavePath(
-   VOID
-)
-{
-    return externalStoragePath;
-}
-
-BOOL
-UTIL_GetScreenSize(
-   DWORD *pdwScreenWidth,
-   DWORD *pdwScreenHeight
-)
-{
-    *pdwScreenWidth  = 640;
-    *pdwScreenHeight = 400;
-    return TRUE;
-}
-
-BOOL
-UTIL_IsAbsolutePath(
-	LPCSTR  lpszFileName
-)
-{
-	return FALSE;
-}
-
-INT
-UTIL_Platform_Init(
-   int argc,
-   char* argv[]
-)
-{
-   gConfig.fLaunchSetting = FALSE;
-   return 0;
-}
-
-VOID
-UTIL_Platform_Quit(
-   VOID
-)
-{
-}

+ 240 - 0
android/jni/src/android_jni.cpp

@@ -0,0 +1,240 @@
+#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"
+
+char externalStoragePath[1024];
+char midiInterFile[1024];
+
+static int jstring_to_utf8(JNIEnv* env, jstring j_str, char *buffer, int capacity)
+{
+    jsize length = env->GetStringUTFLength(j_str);
+    const char * const base = env->GetStringUTFChars(j_str, NULL);
+    if (base == NULL)
+    {
+        return 0;
+    }
+    if (capacity <= length)
+        length = capacity - 1;
+    strncpy(buffer, base, length);
+    env->ReleaseStringUTFChars(j_str, base);
+    buffer[length] = '\0';
+    return length;
+}
+
+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;
+}
+
+/* 
+ * Class:     io_github_sdlpal_PalActivity 
+ * Method:    setExternalStorage 
+ * Signature: (Ljava/lang/String;)V
+ */  
+EXTERN_C_LINKAGE
+JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setExternalStorage(JNIEnv *env, jclass cls, jstring j_str)  
+{
+    jstring_to_utf8(env, j_str, externalStoragePath, sizeof(externalStoragePath) - 8);
+    strcat(externalStoragePath, "/sdlpal/");
+    LOGV("JNI got externalStoragePath:%s", externalStoragePath);
+}
+
+/* 
+ * Class:     io_github_sdlpal_PalActivity 
+ * Method:    setMIDIInterFile 
+ * Signature: (Ljava/lang/String;)V
+ */  
+EXTERN_C_LINKAGE
+JNIEXPORT void JNICALL Java_io_github_sdlpal_PalActivity_setMIDIInterFile(JNIEnv *env, jclass cls, jstring j_str)  
+{
+    jstring_to_utf8(env, j_str, midiInterFile, sizeof(midiInterFile));
+    LOGV("JNI got midi inter filename:%s", midiInterFile);
+}
+
+EXTERN_C_LINKAGE
+void* JNI_mediaplayer_load(const char *filename)
+{
+    JNIEnv* env = getJNIEnv();
+    jclass clazz = env->FindClass("io/github/sdlpal/PalActivity");
+    jmethodID mid = env->GetStaticMethodID(clazz, "JNI_mediaplayer_load", "(Ljava/lang/String;)Landroid/media/MediaPlayer;");
+    jstring str = env->NewStringUTF(filename);
+    jobject player = env->CallStaticObjectMethod(clazz, mid, str);
+    env->DeleteLocalRef(str);
+    return env->NewGlobalRef(player);
+}
+
+EXTERN_C_LINKAGE
+void JNI_mediaplayer_free(void *player)
+{
+    getJNIEnv()->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"));
+}
+
+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"));
+}
+
+EXTERN_C_LINKAGE
+int JNI_mediaplayer_isplaying(void *player)
+{
+    JNIEnv* env = getJNIEnv();
+    jclass clazz = env->FindClass("android/media/MediaPlayer");
+    return env->CallBooleanMethod((jobject)player, env->GetMethodID(clazz, "isPlaying", "()Z"));
+}
+
+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);
+}
+
+EXTERN_C_LINKAGE
+LPCSTR
+UTIL_BasePath(
+   VOID
+)
+{
+    return externalStoragePath;
+}
+
+EXTERN_C_LINKAGE
+LPCSTR
+UTIL_SavePath(
+   VOID
+)
+{
+    return externalStoragePath;
+}
+
+EXTERN_C_LINKAGE
+BOOL
+UTIL_GetScreenSize(
+   DWORD *pdwScreenWidth,
+   DWORD *pdwScreenHeight
+)
+{
+    *pdwScreenWidth  = 640;
+    *pdwScreenHeight = 400;
+    return TRUE;
+}
+
+EXTERN_C_LINKAGE
+BOOL
+UTIL_IsAbsolutePath(
+	LPCSTR  lpszFileName
+)
+{
+	return lpszFileName[0] == '/';
+}
+
+EXTERN_C_LINKAGE
+INT
+UTIL_Platform_Init(
+   int argc,
+   char* argv[]
+)
+{
+   gConfig.fLaunchSetting = FALSE;
+   return 0;
+}
+
+EXTERN_C_LINKAGE
+VOID
+UTIL_Platform_Quit(
+   VOID
+)
+{
+}
+
+#ifdef ENABLE_NEWLOG
+
+static int maxLogLevel = LOG_WARNING;
+
+PAL_C_LINKAGE VOID
+UTIL_SetLogLevel(
+	int             level
+)
+{
+	if (level >= LOG_EMERG && level < LOG_LAST_PRIORITY)
+	{
+		maxLogLevel = level;
+	}
+}
+
+EXTERN_C_LINKAGE
+VOID
+UTIL_WriteLog(
+   int             Priority,
+   const char     *Fmt,
+   ...
+)
+{
+	if (Priority < LOG_EMERG || Priority > maxLogLevel)
+	{
+		return;
+	}
+    
+    switch(Priority)
+    {
+    case LOG_EMERG:   Priority = ANDROID_LOG_FATAL; break;
+    case LOG_ALERT:   Priority = ANDROID_LOG_FATAL; break;
+    case LOG_CRIT:    Priority = ANDROID_LOG_ERROR; break;
+    case LOG_ERR:     Priority = ANDROID_LOG_ERROR; break;
+    case LOG_WARNING: Priority = ANDROID_LOG_WARN; break;
+    case LOG_NOTICE:  Priority = ANDROID_LOG_INFO; break;
+    case LOG_INFO:    Priority = ANDROID_LOG_INFO; break;
+    case LOG_DEBUG:   Priority = ANDROID_LOG_DEBUG; break;
+    default:          Priority = ANDROID_LOG_VERBOSE; break;
+    }
+
+    va_list ap;
+    va_start(ap, Fmt);
+    __android_log_vprint(ANDROID_LOG_VERBOSE, TAG, Fmt, ap);
+    va_end(ap);
+}
+
+#endif

+ 10 - 2
android/jni/src/android_jni.h

@@ -1,8 +1,12 @@
 #ifndef SDLPAL_JNI_H
 #define SDLPAL_JNI_H
 
-extern char externalStoragePath[255];
-extern char midiInterFile[255];
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char externalStoragePath[1024];
+extern char midiInterFile[1024];
 
 void* JNI_mediaplayer_load(const char *);
 void JNI_mediaplayer_free(void *);
@@ -11,4 +15,8 @@ void JNI_mediaplayer_stop(void *);
 int JNI_mediaplayer_isplaying(void *);
 void JNI_mediaplayer_setvolume(void *, int);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif // SDLPAL_JNI_H

+ 1 - 1
android/jni/src/native_midi.c

@@ -72,6 +72,7 @@ void native_midi_freesong(NativeMidiSong *song)
 {
     if (song != NULL)
     {
+        JNI_mediaplayer_stop(song->player);
         JNI_mediaplayer_free(song->player);
         free(song);
     }
@@ -79,7 +80,6 @@ void native_midi_freesong(NativeMidiSong *song)
 
 void native_midi_start(NativeMidiSong *song, int looping)
 {
-    native_midi_stop(song);
     if (song != NULL)
     {
         JNI_mediaplayer_play(song->player, looping);

+ 1 - 2
android/src/io/github/sdlpal/PalActivity.java

@@ -32,8 +32,7 @@ public class PalActivity extends SDLActivity {
     @Override
     public void onCreate(Bundle savedInstanceState) {  
         super.onCreate(savedInstanceState);
-        String appDataPath = mSingleton.getApplicationContext().getCacheDir().getPath();
-        String interFilePath = appDataPath+"/intermediates.midi";
+        String interFilePath = mSingleton.getApplicationContext().getCacheDir().getPath() + "/intermediates.mid";
         Log.v(TAG, "java interfile path " + interFilePath);
         setMIDIInterFile(interFilePath);
         String externalStorageState = Environment.getExternalStorageState();