From 19f2068a95157d87af5df3ea87d9b52f3456680f Mon Sep 17 00:00:00 2001 From: Gabriel Jacobo Date: Fri, 25 May 2012 15:35:41 -0300 Subject: [PATCH] Fixes issue #1500 "SDL_RWops fails under Android 4" by removing stale Local Refs and replacing them for their global equivalents. --- include/SDL_rwops.h | 3 --- src/core/android/SDL_android.cpp | 16 +++++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/include/SDL_rwops.h b/include/SDL_rwops.h index fb03cea49..87715f5ba 100644 --- a/include/SDL_rwops.h +++ b/include/SDL_rwops.h @@ -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; diff --git a/src/core/android/SDL_android.cpp b/src/core/android/SDL_android.cpp index 26b1fd217..f1b5ead07 100755 --- a/src/core/android/SDL_android.cpp +++ b/src/core/android/SDL_android.cpp @@ -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 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx) 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];