From 6e7c479ec256f3b845cb648a985f4febccae0c2e Mon Sep 17 00:00:00 2001 From: Philipp Wiesemann Date: Thu, 17 Sep 2015 22:30:24 +0200 Subject: [PATCH] Android: Fixed trying to read from APK expansion files without version hint set. This also fixed overwriting the asset error message which is more useful if no APK expansion files are available and the requested file was not found. --- .../src/org/libsdl/app/SDLActivity.java | 15 +++++++++++++-- src/core/android/SDL_android.c | 5 ++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/android-project/src/org/libsdl/app/SDLActivity.java b/android-project/src/org/libsdl/app/SDLActivity.java index 48d0edee2ff17..0662e60f5266e 100644 --- a/android-project/src/org/libsdl/app/SDLActivity.java +++ b/android-project/src/org/libsdl/app/SDLActivity.java @@ -688,12 +688,23 @@ public InputStream openAPKExtensionInputStream(String fileName) throws IOExcepti /** * This method is called by SDL using JNI. + * @return an InputStream on success or null if no expansion file was used. + * @throws IOException on errors. Message is set for the SDL error message. */ public InputStream openAPKExpansionInputStream(String fileName) throws IOException { // Get a ZipResourceFile representing a merger of both the main and patch files if (expansionFile == null) { - Integer mainVersion = Integer.valueOf(nativeGetHint("SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION")); - Integer patchVersion = Integer.valueOf(nativeGetHint("SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION")); + String mainHint = nativeGetHint("SDL_ANDROID_APK_EXPANSION_MAIN_FILE_VERSION"); + if (mainHint == null) { + return null; // no expansion use if no main version was set + } + String patchHint = nativeGetHint("SDL_ANDROID_APK_EXPANSION_PATCH_FILE_VERSION"); + if (patchHint == null) { + return null; // no expansion use if no patch version was set + } + + Integer mainVersion = Integer.valueOf(mainHint); + Integer patchVersion = Integer.valueOf(patchHint); try { // To avoid direct dependency on Google APK expansion library that is diff --git a/src/core/android/SDL_android.c b/src/core/android/SDL_android.c index d16d4be1ec51c..96cc486998955 100644 --- a/src/core/android/SDL_android.c +++ b/src/core/android/SDL_android.c @@ -790,7 +790,10 @@ static int Internal_Android_JNI_FileOpen(SDL_RWops* ctx) "openAPKExpansionInputStream", "(Ljava/lang/String;)Ljava/io/InputStream;"); inputStream = (*mEnv)->CallObjectMethod(mEnv, context, mid, fileNameJString); - if (Android_JNI_ExceptionOccurred(SDL_FALSE)) { + /* Exception is checked first because it always needs to be cleared. + * If no exception occurred then the last SDL error message is kept. + */ + if (Android_JNI_ExceptionOccurred(SDL_FALSE) || !inputStream) { goto failure; } }