Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
Fixes issue #1500 "SDL_RWops fails under Android 4" by removing stale…
… Local Refs

and replacing them for their global equivalents.
  • Loading branch information
gabomdq committed May 25, 2012
1 parent 0f1520a commit 19f2068a95157d87af5df3ea87d9b52f3456680f
Showing with 9 additions and 10 deletions.
  1. +0 −3 include/SDL_rwops.h
  2. +9 −7 src/core/android/SDL_android.cpp
@@ -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;
@@ -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];

0 comments on commit 19f2068

Please sign in to comment.