mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-10-12 09:08:23 +03:00
Android: Use {Push,Pop}LocalFrame to track local references
This commit is contained in:
+16
-5
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user