diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index 534214803..f59e12c90 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -17,6 +17,8 @@ * 02110-1301, USA. */ +#include + #include "AndroidUtil.h" JavaVM *AndroidUtil::ourJavaVM = 0; @@ -37,6 +39,7 @@ const char * const AndroidUtil::Class_ZLFile = "org/geometerplus/zlibrary/core/f const char * const AndroidUtil::Class_Book = "org/geometerplus/fbreader/library/Book"; const char * const AndroidUtil::Class_Tag = "org/geometerplus/fbreader/library/Tag"; const char * const AndroidUtil::Class_NativeBookModel = "org/geometerplus/fbreader/bookmodel/NativeBookModel"; +const char * const AndroidUtil::Class_BookReadingException = "org/geometerplus/fbreader/bookmodel/BookReadingException"; jmethodID AndroidUtil::MID_java_lang_String_toLowerCase; jmethodID AndroidUtil::MID_java_lang_String_toUpperCase; @@ -103,6 +106,8 @@ jmethodID AndroidUtil::MID_NativeBookModel_createTextModel; jmethodID AndroidUtil::MID_NativeBookModel_setBookTextModel; jmethodID AndroidUtil::MID_NativeBookModel_setFootnoteModel; +jmethodID AndroidUtil::SMID_BookReadingException_throwForFile; + JNIEnv *AndroidUtil::getEnv() { JNIEnv *env; ourJavaVM->GetEnv((void **)&env, JNI_VERSION_1_2); @@ -216,6 +221,10 @@ bool AndroidUtil::init(JavaVM* jvm) { CHECK_NULL( MID_NativeBookModel_setFootnoteModel = env->GetMethodID(cls, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)V") ); env->DeleteLocalRef(cls); + CHECK_NULL( cls = env->FindClass(Class_BookReadingException) ); + CHECK_NULL( SMID_BookReadingException_throwForFile = env->GetStaticMethodID(cls, "throwForFile", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;)V") ); + env->DeleteLocalRef(cls); + return true; } @@ -299,6 +308,14 @@ void AndroidUtil::throwRuntimeException(JNIEnv *env, const std::string &message) env->ThrowNew(cls, message.c_str()); } -void AndroidUtil::throwBookReadingException(JNIEnv *env, const std::string &resourceId, const std::string &filePath) { - // TODO: implement +void AndroidUtil::throwBookReadingException(const std::string &resourceId, const ZLFile &file) { + JNIEnv *env = getEnv(); + jclass cls = env->FindClass("org/geometerplus/fbreader/bookmodel/BookReadingException"); + env->CallStaticVoidMethod( + cls, + SMID_BookReadingException_throwForFile, + AndroidUtil::createJavaString(env, resourceId), + AndroidUtil::createZLFile(env, file.path()) + ); + // TODO: clear cls & ZLFile object references } diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index a74d4441c..5debb1c32 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -25,6 +25,8 @@ #include #include +class ZLFile; + class AndroidUtil { private: @@ -47,6 +49,7 @@ public: static const char * const Class_Book; static const char * const Class_Tag; static const char * const Class_NativeBookModel; + static const char * const Class_BookReadingException; static jmethodID MID_java_lang_String_toLowerCase; static jmethodID MID_java_lang_String_toUpperCase; @@ -113,6 +116,8 @@ public: static jmethodID MID_NativeBookModel_setBookTextModel; static jmethodID MID_NativeBookModel_setFootnoteModel; + static jmethodID SMID_BookReadingException_throwForFile; + public: static bool init(JavaVM* jvm); static JNIEnv *getEnv(); @@ -127,7 +132,7 @@ public: static jobjectArray createStringArray(JNIEnv *env, const std::vector &data); static void throwRuntimeException(JNIEnv *env, const std::string &message); - static void throwBookReadingException(JNIEnv *env, const std::string &resourceId, const std::string &filePath); + static void throwBookReadingException(const std::string &resourceId, const ZLFile &file); }; #endif /* __ANDROIDUTIL_H__ */ diff --git a/proguard.cfg b/proguard.cfg index cfdb6fa67..e32ccef08 100755 --- a/proguard.cfg +++ b/proguard.cfg @@ -84,6 +84,9 @@ public void setBookTextModel(**); public void setFootnoteModel(**); } +-keepclassmembers class org.geometerplus.fbreader.bookmodel.BookReadingException { + public static void throwForFile(**,**); +} -keepclasseswithmembernames class * { native ; diff --git a/src/org/geometerplus/fbreader/bookmodel/BookReadingException.java b/src/org/geometerplus/fbreader/bookmodel/BookReadingException.java index 44d419a16..c53c3f34e 100644 --- a/src/org/geometerplus/fbreader/bookmodel/BookReadingException.java +++ b/src/org/geometerplus/fbreader/bookmodel/BookReadingException.java @@ -27,6 +27,10 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile; import org.geometerplus.zlibrary.core.resources.ZLResource; public final class BookReadingException extends Exception { + public static void throwForFile(String resourceId, ZLFile file) throws BookReadingException { + throw new BookReadingException(resourceId, file); + } + private static String getResourceText(String resourceId) { return ZLResource.resource("bookReadingException").getResource(resourceId).getValue(); }