Fixes issue #1500 "SDL_RWops fails under Android 4" by removing stale Local Refs

and replacing them for their global equivalents.
This commit is contained in:
Gabriel Jacobo 2012-05-25 15:35:41 -03:00
parent 4576303b58
commit f6e83ac6a2
2 changed files with 9 additions and 10 deletions

View file

@ -85,11 +85,8 @@ typedef struct SDL_RWops
#if defined(ANDROID)
struct
{
void *fileName;
void *fileNameRef;
void *inputStream;
void *inputStreamRef;
void *readableByteChannel;
void *readableByteChannelRef;
void *readMethod;
long position;

View file

@ -442,7 +442,7 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx)
goto failure;
}
fileNameJString = (jstring)ctx->hidden.androidio.fileName;
fileNameJString = (jstring)ctx->hidden.androidio.fileNameRef;
// context = SDLActivity.getContext();
mid = mEnv->GetStaticMethodID(mActivityClass,
@ -462,7 +462,6 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx)
goto failure;
}
ctx->hidden.androidio.inputStream = inputStream;
ctx->hidden.androidio.inputStreamRef = mEnv->NewGlobalRef(inputStream);
// Despite all the visible documentation on [Asset]InputStream claiming
@ -490,7 +489,6 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx)
goto failure;
}
ctx->hidden.androidio.readableByteChannel = readableByteChannel;
ctx->hidden.androidio.readableByteChannelRef =
mEnv->NewGlobalRef(readableByteChannel);
@ -510,6 +508,11 @@ failure:
if(ctx->hidden.androidio.inputStreamRef != NULL) {
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.inputStreamRef);
}
if(ctx->hidden.androidio.readableByteChannelRef != NULL) {
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.readableByteChannelRef);
}
}
return result;
@ -529,7 +532,6 @@ extern "C" int Android_JNI_FileOpen(SDL_RWops* ctx,
}
jstring fileNameJString = mEnv->NewStringUTF(fileName);
ctx->hidden.androidio.fileName = fileNameJString;
ctx->hidden.androidio.fileNameRef = mEnv->NewGlobalRef(fileNameJString);
ctx->hidden.androidio.inputStreamRef = NULL;
@ -547,7 +549,7 @@ extern "C" size_t Android_JNI_FileRead(SDL_RWops* ctx, void* buffer,
return -1;
}
jobject readableByteChannel = (jobject)ctx->hidden.androidio.readableByteChannel;
jobject readableByteChannel = (jobject)ctx->hidden.androidio.readableByteChannelRef;
jmethodID readMethod = (jmethodID)ctx->hidden.androidio.readMethod;
jobject byteBuffer = mEnv->NewDirectByteBuffer(buffer, bytesRemaining);
@ -593,7 +595,7 @@ static int Android_JNI_FileClose(SDL_RWops* ctx, bool release)
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.fileNameRef);
}
jobject inputStream = (jobject)ctx->hidden.androidio.inputStream;
jobject inputStream = (jobject)ctx->hidden.androidio.inputStreamRef;
// inputStream.close();
jmethodID mid = mEnv->GetMethodID(mEnv->GetObjectClass(inputStream),
@ -640,7 +642,7 @@ extern "C" long Android_JNI_FileSeek(SDL_RWops* ctx, long offset, int whence)
}
long movement = newPosition - ctx->hidden.androidio.position;
jobject inputStream = (jobject)ctx->hidden.androidio.inputStream;
jobject inputStream = (jobject)ctx->hidden.androidio.inputStreamRef;
if (movement > 0) {
unsigned char buffer[1024];