From f16f768a69f65b2029ad983c24fc30caecd43d8f Mon Sep 17 00:00:00 2001 From: kichikuou Date: Sun, 2 Feb 2020 11:32:38 +0900 Subject: [PATCH] Android: Use {Push,Pop}LocalFrame to track local references --- src/cdrom.android.c | 21 ++++++++++++++++----- src/midi.android.c | 25 ++++++++++++++++++++----- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/src/cdrom.android.c b/src/cdrom.android.c index 069d73f..a5a5a49 100644 --- a/src/cdrom.android.c +++ b/src/cdrom.android.c @@ -19,6 +19,7 @@ #include #include +#include "system.h" #include "portab.h" #include "cdrom.h" @@ -48,35 +49,45 @@ int cdrom_exit() { return OK; } -#define COMMAND_CDROM_START 0x8000 - int cdrom_start(int trk, int loop) { JNIEnv *env = SDL_AndroidGetJNIEnv(); + if ((*env)->PushLocalFrame(env, 16) < 0) { + WARNING("Failed to allocate JVM local references"); + return NG; + } jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), "cddaStart", "(II)V"); (*env)->CallVoidMethod(env, context, mid, trk, loop); - (*env)->DeleteLocalRef(env, context); + (*env)->PopLocalFrame(env, NULL); return OK; } int cdrom_stop() { JNIEnv *env = SDL_AndroidGetJNIEnv(); + if ((*env)->PushLocalFrame(env, 16) < 0) { + WARNING("Failed to allocate JVM local references"); + return NG; + } jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), "cddaStop", "()V"); (*env)->CallVoidMethod(env, context, mid); - (*env)->DeleteLocalRef(env, context); + (*env)->PopLocalFrame(env, NULL); return OK; } int cdrom_getPlayingInfo (cd_time *info) { JNIEnv *env = SDL_AndroidGetJNIEnv(); + if ((*env)->PushLocalFrame(env, 16) < 0) { + WARNING("Failed to allocate JVM local references"); + return NG; + } jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), "cddaCurrentPosition", "()I"); int t = (*env)->CallIntMethod(env, context, mid); - (*env)->DeleteLocalRef(env, context); + (*env)->PopLocalFrame(env, NULL); info->t = t & 0xff; FRAMES_TO_MSF(t >> 8, &info->m, &info->s, &info->f); diff --git a/src/midi.android.c b/src/midi.android.c index c91e639..6cafe65 100644 --- a/src/midi.android.c +++ b/src/midi.android.c @@ -19,6 +19,7 @@ #include #include +#include "system.h" #include "portab.h" #include "midi.h" @@ -69,10 +70,17 @@ static int midi_start(int no, int loop, char *data, int datalen) { return OK; JNIEnv *env = SDL_AndroidGetJNIEnv(); + if ((*env)->PushLocalFrame(env, 16) < 0) { + WARNING("Failed to allocate JVM local references"); + return NG; + } jbyteArray array = (*env)->NewByteArray(env, datalen); - if (!array) + if (!array) { + WARNING("Failed to allocate an array"); + (*env)->PopLocalFrame(env, NULL); return NG; + } jbyte *buf = (*env)->GetByteArrayElements(env, array, NULL); memcpy(buf, data, datalen); (*env)->ReleaseByteArrayElements(env, array, buf, 0); @@ -81,8 +89,7 @@ static int midi_start(int no, int loop, char *data, int datalen) { jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), "midiStart", "([BI)V"); (*env)->CallVoidMethod(env, context, mid, array, loop); - (*env)->DeleteLocalRef(env, array); - (*env)->DeleteLocalRef(env, context); + (*env)->PopLocalFrame(env, NULL); midino = no; return OK; @@ -90,11 +97,15 @@ static int midi_start(int no, int loop, char *data, int datalen) { static int midi_stop() { JNIEnv *env = SDL_AndroidGetJNIEnv(); + if ((*env)->PushLocalFrame(env, 16) < 0) { + WARNING("Failed to allocate JVM local references"); + return NG; + } jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), "midiStop", "()V"); (*env)->CallVoidMethod(env, context, mid); - (*env)->DeleteLocalRef(env, context); + (*env)->PopLocalFrame(env, NULL); midino = 0; return OK; @@ -116,11 +127,15 @@ static int midi_get_playing_info(midiplaystate *st) { return OK; JNIEnv *env = SDL_AndroidGetJNIEnv(); + if ((*env)->PushLocalFrame(env, 16) < 0) { + WARNING("Failed to allocate JVM local references"); + return NG; + } jobject context = SDL_AndroidGetActivity(); jmethodID mid = (*env)->GetMethodID(env, (*env)->GetObjectClass(env, context), "midiCurrentPosition", "()I"); int pos = (*env)->CallIntMethod(env, context, mid); - (*env)->DeleteLocalRef(env, context); + (*env)->PopLocalFrame(env, NULL); if (pos >= 0) { st->in_play = TRUE;