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:
parent
4576303b58
commit
f6e83ac6a2
2 changed files with 9 additions and 10 deletions
|
@ -85,11 +85,8 @@ typedef struct SDL_RWops
|
||||||
#if defined(ANDROID)
|
#if defined(ANDROID)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
void *fileName;
|
|
||||||
void *fileNameRef;
|
void *fileNameRef;
|
||||||
void *inputStream;
|
|
||||||
void *inputStreamRef;
|
void *inputStreamRef;
|
||||||
void *readableByteChannel;
|
|
||||||
void *readableByteChannelRef;
|
void *readableByteChannelRef;
|
||||||
void *readMethod;
|
void *readMethod;
|
||||||
long position;
|
long position;
|
||||||
|
|
|
@ -442,7 +442,7 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx)
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
fileNameJString = (jstring)ctx->hidden.androidio.fileName;
|
fileNameJString = (jstring)ctx->hidden.androidio.fileNameRef;
|
||||||
|
|
||||||
// context = SDLActivity.getContext();
|
// context = SDLActivity.getContext();
|
||||||
mid = mEnv->GetStaticMethodID(mActivityClass,
|
mid = mEnv->GetStaticMethodID(mActivityClass,
|
||||||
|
@ -462,7 +462,6 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx)
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->hidden.androidio.inputStream = inputStream;
|
|
||||||
ctx->hidden.androidio.inputStreamRef = mEnv->NewGlobalRef(inputStream);
|
ctx->hidden.androidio.inputStreamRef = mEnv->NewGlobalRef(inputStream);
|
||||||
|
|
||||||
// Despite all the visible documentation on [Asset]InputStream claiming
|
// Despite all the visible documentation on [Asset]InputStream claiming
|
||||||
|
@ -490,7 +489,6 @@ static int Android_JNI_FileOpen(SDL_RWops* ctx)
|
||||||
goto failure;
|
goto failure;
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->hidden.androidio.readableByteChannel = readableByteChannel;
|
|
||||||
ctx->hidden.androidio.readableByteChannelRef =
|
ctx->hidden.androidio.readableByteChannelRef =
|
||||||
mEnv->NewGlobalRef(readableByteChannel);
|
mEnv->NewGlobalRef(readableByteChannel);
|
||||||
|
|
||||||
|
@ -510,6 +508,11 @@ failure:
|
||||||
if(ctx->hidden.androidio.inputStreamRef != NULL) {
|
if(ctx->hidden.androidio.inputStreamRef != NULL) {
|
||||||
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.inputStreamRef);
|
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.inputStreamRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(ctx->hidden.androidio.readableByteChannelRef != NULL) {
|
||||||
|
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.readableByteChannelRef);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -529,7 +532,6 @@ extern "C" int Android_JNI_FileOpen(SDL_RWops* ctx,
|
||||||
}
|
}
|
||||||
|
|
||||||
jstring fileNameJString = mEnv->NewStringUTF(fileName);
|
jstring fileNameJString = mEnv->NewStringUTF(fileName);
|
||||||
ctx->hidden.androidio.fileName = fileNameJString;
|
|
||||||
ctx->hidden.androidio.fileNameRef = mEnv->NewGlobalRef(fileNameJString);
|
ctx->hidden.androidio.fileNameRef = mEnv->NewGlobalRef(fileNameJString);
|
||||||
ctx->hidden.androidio.inputStreamRef = NULL;
|
ctx->hidden.androidio.inputStreamRef = NULL;
|
||||||
|
|
||||||
|
@ -547,7 +549,7 @@ extern "C" size_t Android_JNI_FileRead(SDL_RWops* ctx, void* buffer,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject readableByteChannel = (jobject)ctx->hidden.androidio.readableByteChannel;
|
jobject readableByteChannel = (jobject)ctx->hidden.androidio.readableByteChannelRef;
|
||||||
jmethodID readMethod = (jmethodID)ctx->hidden.androidio.readMethod;
|
jmethodID readMethod = (jmethodID)ctx->hidden.androidio.readMethod;
|
||||||
jobject byteBuffer = mEnv->NewDirectByteBuffer(buffer, bytesRemaining);
|
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);
|
mEnv->DeleteGlobalRef((jobject)ctx->hidden.androidio.fileNameRef);
|
||||||
}
|
}
|
||||||
|
|
||||||
jobject inputStream = (jobject)ctx->hidden.androidio.inputStream;
|
jobject inputStream = (jobject)ctx->hidden.androidio.inputStreamRef;
|
||||||
|
|
||||||
// inputStream.close();
|
// inputStream.close();
|
||||||
jmethodID mid = mEnv->GetMethodID(mEnv->GetObjectClass(inputStream),
|
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;
|
long movement = newPosition - ctx->hidden.androidio.position;
|
||||||
jobject inputStream = (jobject)ctx->hidden.androidio.inputStream;
|
jobject inputStream = (jobject)ctx->hidden.androidio.inputStreamRef;
|
||||||
|
|
||||||
if (movement > 0) {
|
if (movement > 0) {
|
||||||
unsigned char buffer[1024];
|
unsigned char buffer[1024];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue