1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 17:59:33 +02:00

BookReadingException can be thrown from native code

This commit is contained in:
Nikolay Pultsin 2012-03-22 23:47:22 +00:00
parent 5f6223353d
commit 0e476c760c
4 changed files with 32 additions and 3 deletions

View file

@ -17,6 +17,8 @@
* 02110-1301, USA. * 02110-1301, USA.
*/ */
#include <ZLFile.h>
#include "AndroidUtil.h" #include "AndroidUtil.h"
JavaVM *AndroidUtil::ourJavaVM = 0; 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_Book = "org/geometerplus/fbreader/library/Book";
const char * const AndroidUtil::Class_Tag = "org/geometerplus/fbreader/library/Tag"; 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_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_toLowerCase;
jmethodID AndroidUtil::MID_java_lang_String_toUpperCase; 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_setBookTextModel;
jmethodID AndroidUtil::MID_NativeBookModel_setFootnoteModel; jmethodID AndroidUtil::MID_NativeBookModel_setFootnoteModel;
jmethodID AndroidUtil::SMID_BookReadingException_throwForFile;
JNIEnv *AndroidUtil::getEnv() { JNIEnv *AndroidUtil::getEnv() {
JNIEnv *env; JNIEnv *env;
ourJavaVM->GetEnv((void **)&env, JNI_VERSION_1_2); 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") ); CHECK_NULL( MID_NativeBookModel_setFootnoteModel = env->GetMethodID(cls, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)V") );
env->DeleteLocalRef(cls); 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; return true;
} }
@ -299,6 +308,14 @@ void AndroidUtil::throwRuntimeException(JNIEnv *env, const std::string &message)
env->ThrowNew(cls, message.c_str()); env->ThrowNew(cls, message.c_str());
} }
void AndroidUtil::throwBookReadingException(JNIEnv *env, const std::string &resourceId, const std::string &filePath) { void AndroidUtil::throwBookReadingException(const std::string &resourceId, const ZLFile &file) {
// TODO: implement 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
} }

View file

@ -25,6 +25,8 @@
#include <string> #include <string>
#include <vector> #include <vector>
class ZLFile;
class AndroidUtil { class AndroidUtil {
private: private:
@ -47,6 +49,7 @@ public:
static const char * const Class_Book; static const char * const Class_Book;
static const char * const Class_Tag; static const char * const Class_Tag;
static const char * const Class_NativeBookModel; 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_toLowerCase;
static jmethodID MID_java_lang_String_toUpperCase; static jmethodID MID_java_lang_String_toUpperCase;
@ -113,6 +116,8 @@ public:
static jmethodID MID_NativeBookModel_setBookTextModel; static jmethodID MID_NativeBookModel_setBookTextModel;
static jmethodID MID_NativeBookModel_setFootnoteModel; static jmethodID MID_NativeBookModel_setFootnoteModel;
static jmethodID SMID_BookReadingException_throwForFile;
public: public:
static bool init(JavaVM* jvm); static bool init(JavaVM* jvm);
static JNIEnv *getEnv(); static JNIEnv *getEnv();
@ -127,7 +132,7 @@ public:
static jobjectArray createStringArray(JNIEnv *env, const std::vector<std::string> &data); static jobjectArray createStringArray(JNIEnv *env, const std::vector<std::string> &data);
static void throwRuntimeException(JNIEnv *env, const std::string &message); 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__ */ #endif /* __ANDROIDUTIL_H__ */

View file

@ -84,6 +84,9 @@
public void setBookTextModel(**); public void setBookTextModel(**);
public void setFootnoteModel(**); public void setFootnoteModel(**);
} }
-keepclassmembers class org.geometerplus.fbreader.bookmodel.BookReadingException {
public static void throwForFile(**,**);
}
-keepclasseswithmembernames class * { -keepclasseswithmembernames class * {
native <methods>; native <methods>;

View file

@ -27,6 +27,10 @@ import org.geometerplus.zlibrary.core.filesystem.ZLFile;
import org.geometerplus.zlibrary.core.resources.ZLResource; import org.geometerplus.zlibrary.core.resources.ZLResource;
public final class BookReadingException extends Exception { 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) { private static String getResourceText(String resourceId) {
return ZLResource.resource("bookReadingException").getResource(resourceId).getValue(); return ZLResource.resource("bookReadingException").getResource(resourceId).getValue();
} }