From 18e14a29de21865f57ec6e16147b48c52c3d3fec Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 30 Mar 2012 21:37:29 +0100 Subject: [PATCH] JavaClass class is used widely --- .../fbreader/src/formats/PluginCollection.cpp | 6 +- .../fbreader/src/library/Library.cpp | 9 +- .../fbreader/src/library/Library.h | 6 - .../fbreader/src/library/Tag.cpp | 4 +- jni/NativeFormats/util/AndroidUtil.cpp | 173 ++++++++---------- jni/NativeFormats/util/AndroidUtil.h | 29 +-- .../src/encoding/JavaEncodingConverter.cpp | 12 +- .../ZLAndroidLibraryImplementation.cpp | 12 +- 8 files changed, 110 insertions(+), 141 deletions(-) diff --git a/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp b/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp index 4acd82b64..5101bed48 100644 --- a/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp +++ b/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp @@ -72,11 +72,11 @@ void PluginCollection::deleteInstance() { PluginCollection::PluginCollection() { JNIEnv *env = AndroidUtil::getEnv(); - jclass cls = env->FindClass(AndroidUtil::Class_PluginCollection); - jobject instance = AndroidUtil::StaticMethod_PluginCollection_Instance->call(cls); + jobject instance = AndroidUtil::StaticMethod_PluginCollection_Instance->call( + AndroidUtil::Class_PluginCollection->j() + ); myJavaInstance = env->NewGlobalRef(instance); env->DeleteLocalRef(instance); - env->DeleteLocalRef(cls); } PluginCollection::~PluginCollection() { diff --git a/jni/NativeFormats/fbreader/src/library/Library.cpp b/jni/NativeFormats/fbreader/src/library/Library.cpp index faf73dfb8..b08b88b03 100644 --- a/jni/NativeFormats/fbreader/src/library/Library.cpp +++ b/jni/NativeFormats/fbreader/src/library/Library.cpp @@ -22,7 +22,6 @@ #include "Library.h" - shared_ptr Library::ourInstance; Library &Library::Instance() { @@ -33,20 +32,14 @@ Library &Library::Instance() { } Library::Library() { - JNIEnv *env = AndroidUtil::getEnv(); - jclass paths = env->FindClass(AndroidUtil::Class_Paths); - myPathsClass = (jclass)env->NewGlobalRef(paths); - env->DeleteLocalRef(paths); } Library::~Library() { - JNIEnv *env = AndroidUtil::getEnv(); - env->DeleteGlobalRef(myPathsClass); } std::string Library::cacheDirectory() const { JNIEnv *env = AndroidUtil::getEnv(); - jstring res = (jstring)AndroidUtil::StaticMethod_Paths_cacheDirectory->call(myPathsClass); + jstring res = (jstring)AndroidUtil::StaticMethod_Paths_cacheDirectory->call(AndroidUtil::Class_Paths->j()); const char *data = env->GetStringUTFChars(res, 0); std::string str(data); env->ReleaseStringUTFChars(res, data); diff --git a/jni/NativeFormats/fbreader/src/library/Library.h b/jni/NativeFormats/fbreader/src/library/Library.h index 8ec84252d..5a7acf7f1 100644 --- a/jni/NativeFormats/fbreader/src/library/Library.h +++ b/jni/NativeFormats/fbreader/src/library/Library.h @@ -20,13 +20,10 @@ #ifndef __LIBRARY_H__ #define __LIBRARY_H__ -#include - #include #include - class Library { public: @@ -42,9 +39,6 @@ public: ~Library(); std::string cacheDirectory() const; - -private: - jclass myPathsClass; }; #endif /* __LIBRARY_H__ */ diff --git a/jni/NativeFormats/fbreader/src/library/Tag.cpp b/jni/NativeFormats/fbreader/src/library/Tag.cpp index a7afe4582..9edaa3bd5 100644 --- a/jni/NativeFormats/fbreader/src/library/Tag.cpp +++ b/jni/NativeFormats/fbreader/src/library/Tag.cpp @@ -138,11 +138,9 @@ jobject Tag::javaTag(JNIEnv *env) const { } jobject javaName = env->NewStringUTF(myName.c_str()); - jclass cls = env->FindClass(AndroidUtil::Class_Tag); - jobject tag = AndroidUtil::StaticMethod_Tag_getTag->call(cls, parentTag, javaName); + jobject tag = AndroidUtil::StaticMethod_Tag_getTag->call(AndroidUtil::Class_Tag->j(), parentTag, javaName); myJavaTag = env->NewGlobalRef(tag); env->DeleteLocalRef(tag); - env->DeleteLocalRef(cls); env->DeleteLocalRef(javaName); return myJavaTag; } diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index 0a46e41eb..0a12b5c16 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -25,23 +25,24 @@ JavaVM *AndroidUtil::ourJavaVM = 0; +shared_ptr AndroidUtil::Class_java_lang_RuntimeException; shared_ptr AndroidUtil::Class_java_lang_String; -const char * const AndroidUtil::Class_java_util_Collection = "java/util/Collection"; -const char * const AndroidUtil::Class_java_util_Locale = "java/util/Locale"; -const char * const AndroidUtil::Class_java_io_InputStream = "java/io/InputStream"; -const char * const AndroidUtil::Class_ZLibrary = "org/geometerplus/zlibrary/core/library/ZLibrary"; +shared_ptr AndroidUtil::Class_java_util_Collection; +shared_ptr AndroidUtil::Class_java_util_Locale; +shared_ptr AndroidUtil::Class_java_io_InputStream; +shared_ptr AndroidUtil::Class_ZLibrary; shared_ptr AndroidUtil::Class_NativeFormatPlugin; -const char * const AndroidUtil::Class_PluginCollection = "org/geometerplus/fbreader/formats/PluginCollection"; -const char * const AndroidUtil::Class_Encoding = "org/geometerplus/zlibrary/core/encodings/Encoding"; -const char * const AndroidUtil::Class_EncodingConverter = "org/geometerplus/zlibrary/core/encodings/EncodingConverter"; -const char * const AndroidUtil::Class_JavaEncodingCollection = "org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection"; -const char * const AndroidUtil::Class_Paths = "org/geometerplus/fbreader/Paths"; -const char * const AndroidUtil::Class_ZLFile = "org/geometerplus/zlibrary/core/filesystem/ZLFile"; +shared_ptr AndroidUtil::Class_PluginCollection; +shared_ptr AndroidUtil::Class_Encoding; +shared_ptr AndroidUtil::Class_EncodingConverter; +shared_ptr AndroidUtil::Class_JavaEncodingCollection; +shared_ptr AndroidUtil::Class_Paths; +shared_ptr AndroidUtil::Class_ZLFile; shared_ptr AndroidUtil::Class_ZLFileImage; -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"; +shared_ptr AndroidUtil::Class_Book; +shared_ptr AndroidUtil::Class_Tag; +shared_ptr AndroidUtil::Class_NativeBookModel; +//shared_ptr AndroidUtil::Class_BookReadingException; shared_ptr AndroidUtil::Method_java_lang_String_toLowerCase; shared_ptr AndroidUtil::Method_java_lang_String_toUpperCase; @@ -122,107 +123,93 @@ bool AndroidUtil::init(JavaVM* jvm) { ourJavaVM = jvm; JNIEnv *env = getEnv(); - jclass cls; + + Class_java_lang_RuntimeException = new JavaClass(env, "java/lang/RuntimeException"); Class_java_lang_String = new JavaClass(env, "java/lang/String"); Method_java_lang_String_toLowerCase = new StringMethod(*Class_java_lang_String, "toLowerCase", "()"); Method_java_lang_String_toUpperCase = new StringMethod(*Class_java_lang_String, "toUpperCase", "()"); - CHECK_NULL( cls = env->FindClass(Class_java_util_Collection) ); - CHECK_NULL( MID_java_util_Collection_toArray = env->GetMethodID(cls, "toArray", "()[Ljava/lang/Object;") ); - //CHECK_NULL( MID_java_util_Collection_add = env->GetMethodID(cls, "add", "(Ljava/lang/Object;)Z") ); - env->DeleteLocalRef(cls); + Class_java_util_Collection = new JavaClass(env, "java/util/Collection"); + CHECK_NULL( MID_java_util_Collection_toArray = env->GetMethodID(Class_java_util_Collection->j(), "toArray", "()[Ljava/lang/Object;") ); - CHECK_NULL( cls = env->FindClass(Class_java_util_Locale) ); - StaticMethod_java_util_Locale_getDefault = new StaticObjectMethod(env, cls, "getDefault", "java/util/Locale", "()"); - Method_java_util_Locale_getLanguage = new StringMethod(env, cls, "getLanguage", "()"); - env->DeleteLocalRef(cls); + Class_java_util_Locale = new JavaClass(env, "java/util/Locale"); + StaticMethod_java_util_Locale_getDefault = new StaticObjectMethod(env, Class_java_util_Locale->j(), "getDefault", "java/util/Locale", "()"); + Method_java_util_Locale_getLanguage = new StringMethod(*Class_java_util_Locale, "getLanguage", "()"); - CHECK_NULL( cls = env->FindClass(Class_java_io_InputStream) ); - Method_java_io_InputStream_close = new VoidMethod(env, cls, "close", "()"); - Method_java_io_InputStream_read = new IntMethod(env, cls, "read", "([BII)"); - Method_java_io_InputStream_skip = new LongMethod(env, cls, "skip", "(J)"); - env->DeleteLocalRef(cls); + Class_java_io_InputStream = new JavaClass(env, "java/io/InputStream"); + Method_java_io_InputStream_close = new VoidMethod(env, Class_java_io_InputStream->j(), "close", "()"); + Method_java_io_InputStream_read = new IntMethod(env, Class_java_io_InputStream->j(), "read", "([BII)"); + Method_java_io_InputStream_skip = new LongMethod(env, Class_java_io_InputStream->j(), "skip", "(J)"); - CHECK_NULL( cls = env->FindClass(Class_ZLibrary) ); - StaticMethod_ZLibrary_Instance = new StaticObjectMethod(env, cls, "Instance", "org/geometerplus/zlibrary/core/library/ZLibrary", "()"); - Method_ZLibrary_getVersionName = new StringMethod(env, cls, "getVersionName", "()"); - env->DeleteLocalRef(cls); + Class_ZLibrary = new JavaClass(env, "org/geometerplus/zlibrary/core/library/ZLibrary"); + StaticMethod_ZLibrary_Instance = new StaticObjectMethod(env, Class_ZLibrary->j(), "Instance", "org/geometerplus/zlibrary/core/library/ZLibrary", "()"); + Method_ZLibrary_getVersionName = new StringMethod(*Class_ZLibrary, "getVersionName", "()"); Class_NativeFormatPlugin = new JavaClass(env, "org/geometerplus/fbreader/formats/NativeFormatPlugin"); Constructor_NativeFormatPlugin = new Constructor(*Class_NativeFormatPlugin, "(Ljava/lang/String;)V"); Method_NativeFormatPlugin_supportedFileType = new StringMethod(*Class_NativeFormatPlugin, "supportedFileType", "()"); - CHECK_NULL( cls = env->FindClass(Class_PluginCollection) ); - StaticMethod_PluginCollection_Instance = new StaticObjectMethod(env, cls, "Instance", "org/geometerplus/fbreader/formats/PluginCollection", "()"); - env->DeleteLocalRef(cls); + Class_PluginCollection = new JavaClass(env, "org/geometerplus/fbreader/formats/PluginCollection"); + StaticMethod_PluginCollection_Instance = new StaticObjectMethod(env, Class_PluginCollection->j(), "Instance", "org/geometerplus/fbreader/formats/PluginCollection", "()"); - CHECK_NULL( cls = env->FindClass(Class_Encoding) ); - Method_Encoding_createConverter = new ObjectMethod(env, cls, "createConverter", "org/geometerplus/zlibrary/core/encodings/EncodingConverter", "()"); - env->DeleteLocalRef(cls); + Class_Encoding = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/Encoding"); + Method_Encoding_createConverter = new ObjectMethod(env, Class_Encoding->j(), "createConverter", "org/geometerplus/zlibrary/core/encodings/EncodingConverter", "()"); - CHECK_NULL( cls = env->FindClass(Class_EncodingConverter) ); - CHECK_NULL( FID_EncodingConverter_Name = env->GetFieldID(cls, "Name", "Ljava/lang/String;") ); - Method_EncodingConverter_convert = new IntMethod(env, cls, "convert", "([BII[BI)"); - Method_EncodingConverter_reset = new VoidMethod(env, cls, "reset", "()"); - env->DeleteLocalRef(cls); + Class_EncodingConverter = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/EncodingConverter"); + CHECK_NULL( FID_EncodingConverter_Name = env->GetFieldID(Class_EncodingConverter->j(), "Name", "Ljava/lang/String;") ); + Method_EncodingConverter_convert = new IntMethod(env, Class_EncodingConverter->j(), "convert", "([BII[BI)"); + Method_EncodingConverter_reset = new VoidMethod(env, Class_EncodingConverter->j(), "reset", "()"); - CHECK_NULL( cls = env->FindClass(Class_JavaEncodingCollection) ); - StaticMethod_JavaEncodingCollection_Instance = new StaticObjectMethod(env, cls, "Instance", "org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection", "()"); - Method_JavaEncodingCollection_getEncoding_String = new ObjectMethod(env, cls, "getEncoding", "org/geometerplus/zlibrary/core/encodings/Encoding", "(Ljava/lang/String;)"); - Method_JavaEncodingCollection_getEncoding_int = new ObjectMethod(env, cls, "getEncoding", "org/geometerplus/zlibrary/core/encodings/Encoding", "(I)"); - Method_JavaEncodingCollection_providesConverterFor = new BooleanMethod(env, cls, "providesConverterFor", "(Ljava/lang/String;)"); - env->DeleteLocalRef(cls); + Class_JavaEncodingCollection = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection"); + StaticMethod_JavaEncodingCollection_Instance = new StaticObjectMethod(env, Class_JavaEncodingCollection->j(), "Instance", "org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection", "()"); + Method_JavaEncodingCollection_getEncoding_String = new ObjectMethod(env, Class_JavaEncodingCollection->j(), "getEncoding", "org/geometerplus/zlibrary/core/encodings/Encoding", "(Ljava/lang/String;)"); + Method_JavaEncodingCollection_getEncoding_int = new ObjectMethod(env, Class_JavaEncodingCollection->j(), "getEncoding", "org/geometerplus/zlibrary/core/encodings/Encoding", "(I)"); + Method_JavaEncodingCollection_providesConverterFor = new BooleanMethod(env, Class_JavaEncodingCollection->j(), "providesConverterFor", "(Ljava/lang/String;)"); - CHECK_NULL( cls = env->FindClass(Class_ZLFile) ); - StaticMethod_ZLFile_createFileByPath = new StaticObjectMethod(env, cls, "createFileByPath", "org/geometerplus/zlibrary/core/filesystem/ZLFile", "(Ljava/lang/String;)"); - Method_ZLFile_children = new ObjectMethod(env, cls, "children", "java/util/List", "()"); - Method_ZLFile_exists = new BooleanMethod(env, cls, "exists", "()"); - Method_ZLFile_isDirectory = new BooleanMethod(env, cls, "isDirectory", "()"); - Method_ZLFile_getInputStream = new ObjectMethod(env, cls, "getInputStream", "java/io/InputStream", "()"); - Method_ZLFile_getPath = new StringMethod(env, cls, "getPath", "()"); - Method_ZLFile_size = new LongMethod(env, cls, "size", "()"); - env->DeleteLocalRef(cls); + Class_ZLFile = new JavaClass(env, "org/geometerplus/zlibrary/core/filesystem/ZLFile"); + StaticMethod_ZLFile_createFileByPath = new StaticObjectMethod(env, Class_ZLFile->j(), "createFileByPath", "org/geometerplus/zlibrary/core/filesystem/ZLFile", "(Ljava/lang/String;)"); + Method_ZLFile_children = new ObjectMethod(env, Class_ZLFile->j(), "children", "java/util/List", "()"); + Method_ZLFile_exists = new BooleanMethod(env, Class_ZLFile->j(), "exists", "()"); + Method_ZLFile_isDirectory = new BooleanMethod(env, Class_ZLFile->j(), "isDirectory", "()"); + Method_ZLFile_getInputStream = new ObjectMethod(env, Class_ZLFile->j(), "getInputStream", "java/io/InputStream", "()"); + Method_ZLFile_getPath = new StringMethod(*Class_ZLFile, "getPath", "()"); + Method_ZLFile_size = new LongMethod(env, Class_ZLFile->j(), "size", "()"); Class_ZLFileImage = new JavaClass(env, "org/geometerplus/zlibrary/core/image/ZLFileImage"); Constructor_ZLFileImage = new Constructor(*Class_ZLFileImage, "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;Ljava/lang/String;II)V"); - CHECK_NULL( cls = env->FindClass(Class_Paths) ); - StaticMethod_Paths_cacheDirectory = new StaticObjectMethod(env, cls, "cacheDirectory", "java/lang/String", "()"); - env->DeleteLocalRef(cls); + Class_Paths = new JavaClass(env, "org/geometerplus/fbreader/Paths"); + StaticMethod_Paths_cacheDirectory = new StaticObjectMethod(env, Class_Paths->j(), "cacheDirectory", "java/lang/String", "()"); - CHECK_NULL( cls = env->FindClass(Class_Book) ); - CHECK_NULL( FID_Book_File = env->GetFieldID(cls, "File", "Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;") ); - Method_Book_getTitle = new StringMethod(env, cls, "getTitle", "()"); - Method_Book_getLanguage = new StringMethod(env, cls, "getLanguage", "()"); - Method_Book_getEncodingNoDetection = new StringMethod(env, cls, "getEncodingNoDetection", "()"); - Method_Book_setTitle = new VoidMethod(env, cls, "setTitle", "(Ljava/lang/String;)"); - Method_Book_setSeriesInfo = new VoidMethod(env, cls, "setSeriesInfo", "(Ljava/lang/String;F)"); - Method_Book_setLanguage = new VoidMethod(env, cls, "setLanguage", "(Ljava/lang/String;)"); - Method_Book_setEncoding = new VoidMethod(env, cls, "setEncoding", "(Ljava/lang/String;)"); - Method_Book_addAuthor = new VoidMethod(env, cls, "addAuthor", "(Ljava/lang/String;Ljava/lang/String;)"); - Method_Book_addTag = new VoidMethod(env, cls, "addTag", "(Lorg/geometerplus/fbreader/library/Tag;)"); - Method_Book_save = new BooleanMethod(env, cls, "save", "()"); - env->DeleteLocalRef(cls); + Class_Book = new JavaClass(env, "org/geometerplus/fbreader/library/Book"); + CHECK_NULL( FID_Book_File = env->GetFieldID(Class_Book->j(), "File", "Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;") ); + Method_Book_getTitle = new StringMethod(*Class_Book, "getTitle", "()"); + Method_Book_getLanguage = new StringMethod(*Class_Book, "getLanguage", "()"); + Method_Book_getEncodingNoDetection = new StringMethod(*Class_Book, "getEncodingNoDetection", "()"); + Method_Book_setTitle = new VoidMethod(env, Class_Book->j(), "setTitle", "(Ljava/lang/String;)"); + Method_Book_setSeriesInfo = new VoidMethod(env, Class_Book->j(), "setSeriesInfo", "(Ljava/lang/String;F)"); + Method_Book_setLanguage = new VoidMethod(env, Class_Book->j(), "setLanguage", "(Ljava/lang/String;)"); + Method_Book_setEncoding = new VoidMethod(env, Class_Book->j(), "setEncoding", "(Ljava/lang/String;)"); + Method_Book_addAuthor = new VoidMethod(env, Class_Book->j(), "addAuthor", "(Ljava/lang/String;Ljava/lang/String;)"); + Method_Book_addTag = new VoidMethod(env, Class_Book->j(), "addTag", "(Lorg/geometerplus/fbreader/library/Tag;)"); + Method_Book_save = new BooleanMethod(env, Class_Book->j(), "save", "()"); - CHECK_NULL( cls = env->FindClass(Class_Tag) ); - StaticMethod_Tag_getTag = new StaticObjectMethod(env, cls, "getTag", "org/geometerplus/fbreader/library/Tag", "(Lorg/geometerplus/fbreader/library/Tag;Ljava/lang/String;)"); - env->DeleteLocalRef(cls); + Class_Tag = new JavaClass(env, "org/geometerplus/fbreader/library/Tag"); + StaticMethod_Tag_getTag = new StaticObjectMethod(env, Class_Tag->j(), "getTag", "org/geometerplus/fbreader/library/Tag", "(Lorg/geometerplus/fbreader/library/Tag;Ljava/lang/String;)"); - CHECK_NULL( cls = env->FindClass(Class_NativeBookModel) ); - CHECK_NULL( FID_NativeBookModel_Book = env->GetFieldID(cls, "Book", "Lorg/geometerplus/fbreader/library/Book;") ); - Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(env, cls, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)"); - Method_NativeBookModel_initTOC = new VoidMethod(env, cls, "initTOC", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;[I[I)"); - Method_NativeBookModel_createTextModel = new ObjectMethod(env, cls, "createTextModel", "org/geometerplus/zlibrary/text/model/ZLTextModel", "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)"); - Method_NativeBookModel_setBookTextModel = new VoidMethod(env, cls, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); - Method_NativeBookModel_setFootnoteModel = new VoidMethod(env, cls, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); - Method_NativeBookModel_addImage = new VoidMethod(env, cls, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)"); - env->DeleteLocalRef(cls); + Class_NativeBookModel = new JavaClass(env, "org/geometerplus/fbreader/bookmodel/NativeBookModel"); + CHECK_NULL( FID_NativeBookModel_Book = env->GetFieldID(Class_NativeBookModel->j(), "Book", "Lorg/geometerplus/fbreader/library/Book;") ); + Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(env, Class_NativeBookModel->j(), "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)"); + Method_NativeBookModel_initTOC = new VoidMethod(env, Class_NativeBookModel->j(), "initTOC", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;[I[I)"); + Method_NativeBookModel_createTextModel = new ObjectMethod(env, Class_NativeBookModel->j(), "createTextModel", "org/geometerplus/zlibrary/text/model/ZLTextModel", "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)"); + Method_NativeBookModel_setBookTextModel = new VoidMethod(env, Class_NativeBookModel->j(), "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); + Method_NativeBookModel_setFootnoteModel = new VoidMethod(env, Class_NativeBookModel->j(), "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)"); + Method_NativeBookModel_addImage = new VoidMethod(env, Class_NativeBookModel->j(), "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)"); /* - CHECK_NULL( cls = env->FindClass(Class_BookReadingException) ); - CHECK_NULL( StaticMethod_BookReadingException_throwForFile = env->GetStaticMethodID(cls, "throwForFile", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;)V") ); - env->DeleteLocalRef(cls); + Class_BookReadingException = new JavaClass(env, "org/geometerplus/fbreader/bookmodel/BookReadingException"); + StaticMethod_BookReadingException_throwForFile = new StaticVoidMethod(*Class_BookReadingException, "throwForFile", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;)V") ); */ return true; @@ -230,9 +217,7 @@ bool AndroidUtil::init(JavaVM* jvm) { jobject AndroidUtil::createJavaFile(JNIEnv *env, const std::string &path) { jstring javaPath = env->NewStringUTF(path.c_str()); - jclass cls = env->FindClass(Class_ZLFile); - jobject javaFile = StaticMethod_ZLFile_createFileByPath->call(cls, javaPath); - env->DeleteLocalRef(cls); + jobject javaFile = StaticMethod_ZLFile_createFileByPath->call(Class_ZLFile->j(), javaPath); env->DeleteLocalRef(javaPath); return javaFile; } @@ -306,9 +291,7 @@ jbyteArray AndroidUtil::createJavaByteArray(JNIEnv *env, const std::vectorFindClass("java/lang/RuntimeException"); - env->ThrowNew(cls, message.c_str()); + env->ThrowNew(Class_java_lang_RuntimeException->j(), message.c_str()); } /* diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index 7cbe7c467..e195e68bb 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -46,23 +46,24 @@ private: static JavaVM *ourJavaVM; public: + static shared_ptr Class_java_lang_RuntimeException; static shared_ptr Class_java_lang_String; - static const char * const Class_java_util_Collection; - static const char * const Class_java_util_Locale; - static const char * const Class_java_io_InputStream; - static const char * const Class_ZLibrary; - static const char * const Class_ZLFile; + static shared_ptr Class_java_util_Collection; + static shared_ptr Class_java_util_Locale; + static shared_ptr Class_java_io_InputStream; + static shared_ptr Class_ZLibrary; + static shared_ptr Class_ZLFile; static shared_ptr Class_ZLFileImage; static shared_ptr Class_NativeFormatPlugin; - static const char * const Class_PluginCollection; - static const char * const Class_Encoding; - static const char * const Class_EncodingConverter; - static const char * const Class_JavaEncodingCollection; - static const char * const Class_Paths; - 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 shared_ptr Class_PluginCollection; + static shared_ptr Class_Encoding; + static shared_ptr Class_EncodingConverter; + static shared_ptr Class_JavaEncodingCollection; + static shared_ptr Class_Paths; + static shared_ptr Class_Book; + static shared_ptr Class_Tag; + static shared_ptr Class_NativeBookModel; + //static shared_ptr Class_BookReadingException; static shared_ptr Method_java_lang_String_toLowerCase; static shared_ptr Method_java_lang_String_toUpperCase; diff --git a/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp b/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp index f3a14ccb4..1b080d3e4 100644 --- a/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp +++ b/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp @@ -49,13 +49,13 @@ bool JavaEncodingConverterProvider::providesConverter(const std::string &encodin return false; } JNIEnv *env = AndroidUtil::getEnv(); - jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection); - jobject collection = AndroidUtil::StaticMethod_JavaEncodingCollection_Instance->call(cls); + jobject collection = AndroidUtil::StaticMethod_JavaEncodingCollection_Instance->call( + AndroidUtil::Class_JavaEncodingCollection->j() + ); jstring encodingName = AndroidUtil::createJavaString(env, encoding); jboolean result = AndroidUtil::Method_JavaEncodingCollection_providesConverterFor->call(collection, encodingName); env->DeleteLocalRef(encodingName); env->DeleteLocalRef(collection); - env->DeleteLocalRef(cls); return result != 0; } @@ -65,15 +65,15 @@ shared_ptr JavaEncodingConverterProvider::createConverter(c JavaEncodingConverter::JavaEncodingConverter(const std::string &encoding) { JNIEnv *env = AndroidUtil::getEnv(); - jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection); - jobject collection = AndroidUtil::StaticMethod_JavaEncodingCollection_Instance->call(cls); + jobject collection = AndroidUtil::StaticMethod_JavaEncodingCollection_Instance->call( + AndroidUtil::Class_JavaEncodingCollection->j() + ); jstring encodingName = AndroidUtil::createJavaString(env, encoding); jobject javaEncoding = AndroidUtil::Method_JavaEncodingCollection_getEncoding_String->call(collection, encodingName); myJavaConverter = AndroidUtil::Method_Encoding_createConverter->call(javaEncoding); env->DeleteLocalRef(javaEncoding); env->DeleteLocalRef(encodingName); env->DeleteLocalRef(collection); - env->DeleteLocalRef(cls); myBufferLength = 32768; myInBuffer = env->NewByteArray(myBufferLength); diff --git a/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp b/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp index b94f85690..d33ab73ca 100644 --- a/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp +++ b/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp @@ -44,28 +44,28 @@ void ZLAndroidLibraryImplementation::init(int &argc, char **&argv) { std::string ZLibrary::Language() { JNIEnv *env = AndroidUtil::getEnv(); - jclass cls = env->FindClass(AndroidUtil::Class_java_util_Locale); - jobject locale = AndroidUtil::StaticMethod_java_util_Locale_getDefault->call(cls); + jobject locale = AndroidUtil::StaticMethod_java_util_Locale_getDefault->call( + AndroidUtil::Class_java_util_Locale->j() + ); jstring javaLang = (jstring)AndroidUtil::Method_java_util_Locale_getLanguage->call(locale); const char *langData = env->GetStringUTFChars(javaLang, 0); std::string lang(langData); env->ReleaseStringUTFChars(javaLang, langData); env->DeleteLocalRef(javaLang); env->DeleteLocalRef(locale); - env->DeleteLocalRef(cls); return lang; } std::string ZLibrary::Version() { JNIEnv *env = AndroidUtil::getEnv(); - jclass cls = env->FindClass(AndroidUtil::Class_ZLibrary); - jobject zlibrary = AndroidUtil::StaticMethod_ZLibrary_Instance->call(cls); + jobject zlibrary = AndroidUtil::StaticMethod_ZLibrary_Instance->call( + AndroidUtil::Class_ZLibrary->j() + ); jstring javaVersion = (jstring)AndroidUtil::Method_ZLibrary_getVersionName->call(zlibrary); const char *versionData = env->GetStringUTFChars(javaVersion, 0); std::string version(versionData); env->ReleaseStringUTFChars(javaVersion, versionData); env->DeleteLocalRef(javaVersion); env->DeleteLocalRef(zlibrary); - env->DeleteLocalRef(cls); return version; }