Android: Use {Push,Pop}LocalFrame to track local references

This commit is contained in:
kichikuou
2020-02-02 11:32:38 +09:00
parent 1b4f44384e
commit f16f768a69
2 changed files with 36 additions and 10 deletions
+16 -5
View File
@@ -19,6 +19,7 @@
#include <SDL.h>
#include <jni.h>
#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);
+20 -5
View File
@@ -19,6 +19,7 @@
#include <SDL.h>
#include <jni.h>
#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;