From 86a07a0d1b3192107c33a64d22ebeaea4360d76b Mon Sep 17 00:00:00 2001 From: Nikolay Pultsin Date: Fri, 30 Mar 2012 19:50:01 +0100 Subject: [PATCH] StaticObject class --- jni/Android.mk | 2 +- .../fbreader/src/formats/PluginCollection.cpp | 3 +- .../fbreader/src/library/Library.cpp | 3 +- .../fbreader/src/library/Tag.cpp | 3 +- jni/NativeFormats/util/AndroidUtil.cpp | 42 ++++++++------- jni/NativeFormats/util/AndroidUtil.h | 21 ++++---- jni/NativeFormats/util/JniEnvelope.cpp | 53 ++++++++++++++++--- jni/NativeFormats/util/JniEnvelope.h | 20 +++++++ .../src/encoding/JavaEncodingConverter.cpp | 4 +- .../ZLAndroidLibraryImplementation.cpp | 4 +- 10 files changed, 111 insertions(+), 44 deletions(-) diff --git a/jni/Android.mk b/jni/Android.mk index 30dfcc48a..6b608c00b 100644 --- a/jni/Android.mk +++ b/jni/Android.mk @@ -41,7 +41,7 @@ LOCAL_SRC_FILES := \ NativeFormats/JavaNativeFormatPlugin.cpp \ NativeFormats/JavaPluginCollection.cpp \ NativeFormats/util/AndroidUtil.cpp \ - NativeFormats/util/Method.cpp \ + NativeFormats/util/JniEnvelope.cpp \ NativeFormats/zlibrary/core/src/constants/ZLXMLNamespace.cpp \ NativeFormats/zlibrary/core/src/encoding/DummyEncodingConverter.cpp \ NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp \ diff --git a/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp b/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp index d0a8126c7..4acd82b64 100644 --- a/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp +++ b/jni/NativeFormats/fbreader/src/formats/PluginCollection.cpp @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -72,7 +73,7 @@ void PluginCollection::deleteInstance() { PluginCollection::PluginCollection() { JNIEnv *env = AndroidUtil::getEnv(); jclass cls = env->FindClass(AndroidUtil::Class_PluginCollection); - jobject instance = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_PluginCollection_Instance); + jobject instance = AndroidUtil::StaticMethod_PluginCollection_Instance->call(cls); myJavaInstance = env->NewGlobalRef(instance); env->DeleteLocalRef(instance); env->DeleteLocalRef(cls); diff --git a/jni/NativeFormats/fbreader/src/library/Library.cpp b/jni/NativeFormats/fbreader/src/library/Library.cpp index 5b29228b0..faf73dfb8 100644 --- a/jni/NativeFormats/fbreader/src/library/Library.cpp +++ b/jni/NativeFormats/fbreader/src/library/Library.cpp @@ -18,6 +18,7 @@ */ #include +#include #include "Library.h" @@ -45,7 +46,7 @@ Library::~Library() { std::string Library::cacheDirectory() const { JNIEnv *env = AndroidUtil::getEnv(); - jstring res = (jstring)env->CallStaticObjectMethod(myPathsClass, AndroidUtil::SMID_Paths_cacheDirectory); + jstring res = (jstring)AndroidUtil::StaticMethod_Paths_cacheDirectory->call(myPathsClass); const char *data = env->GetStringUTFChars(res, 0); std::string str(data); env->ReleaseStringUTFChars(res, data); diff --git a/jni/NativeFormats/fbreader/src/library/Tag.cpp b/jni/NativeFormats/fbreader/src/library/Tag.cpp index 3fca84f4f..a7afe4582 100644 --- a/jni/NativeFormats/fbreader/src/library/Tag.cpp +++ b/jni/NativeFormats/fbreader/src/library/Tag.cpp @@ -21,6 +21,7 @@ #include #include +#include #include @@ -138,7 +139,7 @@ jobject Tag::javaTag(JNIEnv *env) const { jobject javaName = env->NewStringUTF(myName.c_str()); jclass cls = env->FindClass(AndroidUtil::Class_Tag); - jobject tag = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_Tag_getTag, parentTag, javaName); + jobject tag = AndroidUtil::StaticMethod_Tag_getTag->call(cls, parentTag, javaName); myJavaTag = env->NewGlobalRef(tag); env->DeleteLocalRef(tag); env->DeleteLocalRef(cls); diff --git a/jni/NativeFormats/util/AndroidUtil.cpp b/jni/NativeFormats/util/AndroidUtil.cpp index d9d221c9d..e38a0c90b 100644 --- a/jni/NativeFormats/util/AndroidUtil.cpp +++ b/jni/NativeFormats/util/AndroidUtil.cpp @@ -41,27 +41,27 @@ const char * const AndroidUtil::Class_ZLFileImage = "org/geometerplus/zlibrary/c 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"; +//const char * const AndroidUtil::Class_BookReadingException = "org/geometerplus/fbreader/bookmodel/BookReadingException"; shared_ptr AndroidUtil::Method_java_lang_String_toLowerCase; shared_ptr AndroidUtil::Method_java_lang_String_toUpperCase; jmethodID AndroidUtil::MID_java_util_Collection_toArray; -jmethodID AndroidUtil::SMID_java_util_Locale_getDefault; +shared_ptr AndroidUtil::StaticMethod_java_util_Locale_getDefault; shared_ptr AndroidUtil::Method_java_util_Locale_getLanguage; shared_ptr AndroidUtil::Method_java_io_InputStream_close; shared_ptr AndroidUtil::Method_java_io_InputStream_read; shared_ptr AndroidUtil::Method_java_io_InputStream_skip; -jmethodID AndroidUtil::SMID_ZLibrary_Instance; +shared_ptr AndroidUtil::StaticMethod_ZLibrary_Instance; shared_ptr AndroidUtil::Method_ZLibrary_getVersionName; jmethodID AndroidUtil::MID_NativeFormatPlugin_init; shared_ptr AndroidUtil::Method_NativeFormatPlugin_supportedFileType; -jmethodID AndroidUtil::SMID_PluginCollection_Instance; +shared_ptr AndroidUtil::StaticMethod_PluginCollection_Instance; shared_ptr AndroidUtil::Method_Encoding_createConverter; @@ -69,12 +69,12 @@ jfieldID AndroidUtil::FID_EncodingConverter_Name; shared_ptr AndroidUtil::Method_EncodingConverter_convert; shared_ptr AndroidUtil::Method_EncodingConverter_reset; -jmethodID AndroidUtil::SMID_JavaEncodingCollection_Instance; +shared_ptr AndroidUtil::StaticMethod_JavaEncodingCollection_Instance; shared_ptr AndroidUtil::Method_JavaEncodingCollection_getEncoding_int; shared_ptr AndroidUtil::Method_JavaEncodingCollection_getEncoding_String; shared_ptr AndroidUtil::Method_JavaEncodingCollection_providesConverterFor; -jmethodID AndroidUtil::SMID_ZLFile_createFileByPath; +shared_ptr AndroidUtil::StaticMethod_ZLFile_createFileByPath; shared_ptr AndroidUtil::Method_ZLFile_children; shared_ptr AndroidUtil::Method_ZLFile_exists; shared_ptr AndroidUtil::Method_ZLFile_getInputStream; @@ -84,7 +84,7 @@ shared_ptr AndroidUtil::Method_ZLFile_size; jmethodID AndroidUtil::MID_ZLFileImage_init; -jmethodID AndroidUtil::SMID_Paths_cacheDirectory; +shared_ptr AndroidUtil::StaticMethod_Paths_cacheDirectory; jfieldID AndroidUtil::FID_Book_File; shared_ptr AndroidUtil::Method_Book_getTitle; @@ -98,7 +98,7 @@ shared_ptr AndroidUtil::Method_Book_addAuthor; shared_ptr AndroidUtil::Method_Book_addTag; shared_ptr AndroidUtil::Method_Book_save; -jmethodID AndroidUtil::SMID_Tag_getTag; +shared_ptr AndroidUtil::StaticMethod_Tag_getTag; jfieldID AndroidUtil::FID_NativeBookModel_Book; shared_ptr AndroidUtil::Method_NativeBookModel_initInternalHyperlinks; @@ -108,7 +108,7 @@ shared_ptr AndroidUtil::Method_NativeBookModel_setBookTextModel; shared_ptr AndroidUtil::Method_NativeBookModel_setFootnoteModel; shared_ptr AndroidUtil::Method_NativeBookModel_addImage; -jmethodID AndroidUtil::SMID_BookReadingException_throwForFile; +//shared_ptr AndroidUtil::StaticMethod_BookReadingException_throwForFile; JNIEnv *AndroidUtil::getEnv() { JNIEnv *env; @@ -135,7 +135,7 @@ bool AndroidUtil::init(JavaVM* jvm) { env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_java_util_Locale) ); - CHECK_NULL( SMID_java_util_Locale_getDefault = env->GetStaticMethodID(cls, "getDefault", "()Ljava/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); @@ -146,7 +146,7 @@ bool AndroidUtil::init(JavaVM* jvm) { env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_ZLibrary) ); - CHECK_NULL( SMID_ZLibrary_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/zlibrary/core/library/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); @@ -156,7 +156,7 @@ bool AndroidUtil::init(JavaVM* jvm) { env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_PluginCollection) ); - CHECK_NULL( SMID_PluginCollection_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/fbreader/formats/PluginCollection;") ); + StaticMethod_PluginCollection_Instance = new StaticObjectMethod(env, cls, "Instance", "org/geometerplus/fbreader/formats/PluginCollection", "()"); env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_Encoding) ); @@ -170,14 +170,14 @@ bool AndroidUtil::init(JavaVM* jvm) { env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_JavaEncodingCollection) ); - CHECK_NULL( SMID_JavaEncodingCollection_Instance = env->GetStaticMethodID(cls, "Instance", "()Lorg/geometerplus/zlibrary/core/encodings/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); CHECK_NULL( cls = env->FindClass(Class_ZLFile) ); - CHECK_NULL( SMID_ZLFile_createFileByPath = env->GetStaticMethodID(cls, "createFileByPath", "(Ljava/lang/String;)Lorg/geometerplus/zlibrary/core/filesystem/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", "()"); @@ -191,7 +191,7 @@ bool AndroidUtil::init(JavaVM* jvm) { env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_Paths) ); - CHECK_NULL( SMID_Paths_cacheDirectory = env->GetStaticMethodID(cls, "cacheDirectory", "()Ljava/lang/String;") ); + StaticMethod_Paths_cacheDirectory = new StaticObjectMethod(env, cls, "cacheDirectory", "java/lang/String", "()"); env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_Book) ); @@ -209,7 +209,7 @@ bool AndroidUtil::init(JavaVM* jvm) { env->DeleteLocalRef(cls); CHECK_NULL( cls = env->FindClass(Class_Tag) ); - CHECK_NULL( SMID_Tag_getTag = env->GetStaticMethodID(cls, "getTag", "(Lorg/geometerplus/fbreader/library/Tag;Ljava/lang/String;)Lorg/geometerplus/fbreader/library/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); CHECK_NULL( cls = env->FindClass(Class_NativeBookModel) ); @@ -222,9 +222,11 @@ bool AndroidUtil::init(JavaVM* jvm) { Method_NativeBookModel_addImage = new VoidMethod(env, cls, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)"); 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") ); + CHECK_NULL( StaticMethod_BookReadingException_throwForFile = env->GetStaticMethodID(cls, "throwForFile", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;)V") ); env->DeleteLocalRef(cls); +*/ return true; } @@ -232,7 +234,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 = env->CallStaticObjectMethod(cls, SMID_ZLFile_createFileByPath, javaPath); + jobject javaFile = StaticMethod_ZLFile_createFileByPath->call(cls, javaPath); env->DeleteLocalRef(cls); env->DeleteLocalRef(javaPath); return javaFile; @@ -331,15 +333,17 @@ void AndroidUtil::throwRuntimeException(JNIEnv *env, const std::string &message) env->ThrowNew(cls, message.c_str()); } +/* 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, + StaticMethod_BookReadingException_throwForFile, AndroidUtil::createJavaString(env, resourceId), AndroidUtil::createJavaFile(env, file.path()) ); // TODO: possible memory leak // TODO: clear cls & ZLFile object references } +*/ diff --git a/jni/NativeFormats/util/AndroidUtil.h b/jni/NativeFormats/util/AndroidUtil.h index d326014fb..391967227 100644 --- a/jni/NativeFormats/util/AndroidUtil.h +++ b/jni/NativeFormats/util/AndroidUtil.h @@ -33,6 +33,7 @@ class LongMethod; class BooleanMethod; class StringMethod; class ObjectMethod; +class StaticObjectMethod; class ZLFile; class ZLFileImage; @@ -59,24 +60,24 @@ 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 const char * const Class_BookReadingException; static shared_ptr Method_java_lang_String_toLowerCase; static shared_ptr Method_java_lang_String_toUpperCase; static jmethodID MID_java_util_Collection_toArray; - static jmethodID SMID_java_util_Locale_getDefault; + static shared_ptr StaticMethod_java_util_Locale_getDefault; static shared_ptr Method_java_util_Locale_getLanguage; static shared_ptr Method_java_io_InputStream_close; static shared_ptr Method_java_io_InputStream_read; static shared_ptr Method_java_io_InputStream_skip; - static jmethodID SMID_ZLibrary_Instance; + static shared_ptr StaticMethod_ZLibrary_Instance; static shared_ptr Method_ZLibrary_getVersionName; - static jmethodID SMID_ZLFile_createFileByPath; + static shared_ptr StaticMethod_ZLFile_createFileByPath; static shared_ptr Method_ZLFile_children; static shared_ptr Method_ZLFile_exists; static shared_ptr Method_ZLFile_getInputStream; @@ -89,7 +90,7 @@ public: static jmethodID MID_NativeFormatPlugin_init; static shared_ptr Method_NativeFormatPlugin_supportedFileType; - static jmethodID SMID_PluginCollection_Instance; + static shared_ptr StaticMethod_PluginCollection_Instance; static shared_ptr Method_Encoding_createConverter; @@ -97,12 +98,12 @@ public: static shared_ptr Method_EncodingConverter_convert; static shared_ptr Method_EncodingConverter_reset; - static jmethodID SMID_JavaEncodingCollection_Instance; + static shared_ptr StaticMethod_JavaEncodingCollection_Instance; static shared_ptr Method_JavaEncodingCollection_getEncoding_String; static shared_ptr Method_JavaEncodingCollection_getEncoding_int; static shared_ptr Method_JavaEncodingCollection_providesConverterFor; - static jmethodID SMID_Paths_cacheDirectory; + static shared_ptr StaticMethod_Paths_cacheDirectory; static jfieldID FID_Book_File; static shared_ptr Method_Book_getTitle; @@ -116,7 +117,7 @@ public: static shared_ptr Method_Book_addTag; static shared_ptr Method_Book_save; - static jmethodID SMID_Tag_getTag; + static shared_ptr StaticMethod_Tag_getTag; static jfieldID FID_NativeBookModel_Book; static shared_ptr Method_NativeBookModel_initInternalHyperlinks; @@ -126,7 +127,7 @@ public: static shared_ptr Method_NativeBookModel_setFootnoteModel; static shared_ptr Method_NativeBookModel_addImage; - static jmethodID SMID_BookReadingException_throwForFile; + //static shared_ptr StaticMethod_BookReadingException_throwForFile; public: static bool init(JavaVM* jvm); @@ -144,7 +145,7 @@ public: static jobjectArray createJavaStringArray(JNIEnv *env, const std::vector &data); static void throwRuntimeException(JNIEnv *env, const std::string &message); - static void throwBookReadingException(const std::string &resourceId, const ZLFile &file); + //static void throwBookReadingException(const std::string &resourceId, const ZLFile &file); }; #endif /* __ANDROIDUTIL_H__ */ diff --git a/jni/NativeFormats/util/JniEnvelope.cpp b/jni/NativeFormats/util/JniEnvelope.cpp index 6ab5e598b..2d7daf718 100644 --- a/jni/NativeFormats/util/JniEnvelope.cpp +++ b/jni/NativeFormats/util/JniEnvelope.cpp @@ -17,9 +17,14 @@ * 02110-1301, USA. */ +#include + #include "JniEnvelope.h" -Method::Method(JNIEnv *env, jclass cls, const std::string &name, const std::string &signature) { +static const std::string JNI_LOGGER_CLASS = "JniLog"; + +Method::Method(JNIEnv *env, jclass cls, const std::string &name, const std::string &signature) : myName(name) { + //ZLLogger::Instance().registerClass(JNI_LOGGER_CLASS); myEnv = env; myId = env->GetMethodID(cls, name.c_str(), signature.c_str()); } @@ -27,24 +32,37 @@ Method::Method(JNIEnv *env, jclass cls, const std::string &name, const std::stri Method::~Method() { } +StaticMethod::StaticMethod(JNIEnv *env, jclass cls, const std::string &name, const std::string &signature) : myName(name) { + //ZLLogger::Instance().registerClass(JNI_LOGGER_CLASS); + myEnv = env; + myId = env->GetStaticMethodID(cls, name.c_str(), signature.c_str()); +} + +StaticMethod::~StaticMethod() { +} + VoidMethod::VoidMethod(JNIEnv *env, jclass cls, const std::string &name, const std::string &signature) : Method(env, cls, name, signature + "V") { } void VoidMethod::call(jobject base, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling VoidMethod " + myName); va_list lst; va_start(lst, base); - myEnv->CallVoidMethod(base, myId, lst); + myEnv->CallVoidMethodV(base, myId, lst); va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished VoidMethod " + myName); } IntMethod::IntMethod(JNIEnv *env, jclass cls, const std::string &name, const std::string &signature) : Method(env, cls, name, signature + "I") { } jint IntMethod::call(jobject base, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling IntMethod " + myName); va_list lst; va_start(lst, base); - jint result = myEnv->CallIntMethod(base, myId, lst); + jint result = myEnv->CallIntMethodV(base, myId, lst); va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished IntMethod " + myName); return result; } @@ -52,10 +70,12 @@ LongMethod::LongMethod(JNIEnv *env, jclass cls, const std::string &name, const s } jlong LongMethod::call(jobject base, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling LongMethod " + myName); va_list lst; va_start(lst, base); - jlong result = myEnv->CallLongMethod(base, myId, lst); + jlong result = myEnv->CallLongMethodV(base, myId, lst); va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished LongMethod " + myName); return result; } @@ -63,10 +83,12 @@ BooleanMethod::BooleanMethod(JNIEnv *env, jclass cls, const std::string &name, c } jboolean BooleanMethod::call(jobject base, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling BooleanMethod " + myName); va_list lst; va_start(lst, base); - jboolean result = myEnv->CallBooleanMethod(base, myId, lst); + jboolean result = myEnv->CallBooleanMethodV(base, myId, lst); va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished BooleanMethod " + myName); return result; } @@ -74,10 +96,12 @@ StringMethod::StringMethod(JNIEnv *env, jclass cls, const std::string &name, con } jstring StringMethod::call(jobject base, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling StringMethod " + myName); va_list lst; va_start(lst, base); - jstring result = (jstring)myEnv->CallObjectMethod(base, myId, lst); + jstring result = (jstring)myEnv->CallObjectMethodV(base, myId, lst); va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished StringMethod " + myName); return result; } @@ -85,9 +109,24 @@ ObjectMethod::ObjectMethod(JNIEnv *env, jclass cls, const std::string &name, con } jobject ObjectMethod::call(jobject base, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling ObjectMethod " + myName); va_list lst; va_start(lst, base); - jobject result = myEnv->CallObjectMethod(base, myId, lst); + jobject result = myEnv->CallObjectMethodV(base, myId, lst); va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished ObjectMethod " + myName); + return result; +} + +StaticObjectMethod::StaticObjectMethod(JNIEnv *env, jclass cls, const std::string &name, const std::string &returnType, const std::string &signature) : StaticMethod(env, cls, name, signature + "L" + returnType + ";") { +} + +jobject StaticObjectMethod::call(jclass cls, ...) { + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling StaticObjectMethod " + myName); + va_list lst; + va_start(lst, cls); + jobject result = myEnv->CallStaticObjectMethodV(cls, myId, lst); + va_end(lst); + ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished StaticObjectMethod " + myName); return result; } diff --git a/jni/NativeFormats/util/JniEnvelope.h b/jni/NativeFormats/util/JniEnvelope.h index 96c224b61..41492a057 100644 --- a/jni/NativeFormats/util/JniEnvelope.h +++ b/jni/NativeFormats/util/JniEnvelope.h @@ -31,6 +31,19 @@ public: virtual ~Method(); protected: + const std::string myName; + JNIEnv *myEnv; + jmethodID myId; +}; + +class StaticMethod { + +public: + StaticMethod(JNIEnv *env, jclass cls, const std::string &name, const std::string &signature); + virtual ~StaticMethod(); + +protected: + const std::string myName; JNIEnv *myEnv; jmethodID myId; }; @@ -77,4 +90,11 @@ public: jobject call(jobject base, ...); }; +class StaticObjectMethod : public StaticMethod { + +public: + StaticObjectMethod(JNIEnv *env, jclass cls, const std::string &name, const std::string &returnType, const std::string &signature); + jobject call(jclass cls, ...); +}; + #endif /* __JNIENVELOPE_H__ */ diff --git a/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp b/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp index 90560b740..f3a14ccb4 100644 --- a/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp +++ b/jni/NativeFormats/zlibrary/core/src/encoding/JavaEncodingConverter.cpp @@ -50,7 +50,7 @@ bool JavaEncodingConverterProvider::providesConverter(const std::string &encodin } JNIEnv *env = AndroidUtil::getEnv(); jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection); - jobject collection = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_JavaEncodingCollection_Instance); + jobject collection = AndroidUtil::StaticMethod_JavaEncodingCollection_Instance->call(cls); jstring encodingName = AndroidUtil::createJavaString(env, encoding); jboolean result = AndroidUtil::Method_JavaEncodingCollection_providesConverterFor->call(collection, encodingName); env->DeleteLocalRef(encodingName); @@ -66,7 +66,7 @@ shared_ptr JavaEncodingConverterProvider::createConverter(c JavaEncodingConverter::JavaEncodingConverter(const std::string &encoding) { JNIEnv *env = AndroidUtil::getEnv(); jclass cls = env->FindClass(AndroidUtil::Class_JavaEncodingCollection); - jobject collection = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_JavaEncodingCollection_Instance); + jobject collection = AndroidUtil::StaticMethod_JavaEncodingCollection_Instance->call(cls); jstring encodingName = AndroidUtil::createJavaString(env, encoding); jobject javaEncoding = AndroidUtil::Method_JavaEncodingCollection_getEncoding_String->call(collection, encodingName); myJavaConverter = AndroidUtil::Method_Encoding_createConverter->call(javaEncoding); diff --git a/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp b/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp index 15ad59793..b94f85690 100644 --- a/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp +++ b/jni/NativeFormats/zlibrary/ui/src/android/library/ZLAndroidLibraryImplementation.cpp @@ -45,7 +45,7 @@ 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 = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_java_util_Locale_getDefault); + jobject locale = AndroidUtil::StaticMethod_java_util_Locale_getDefault->call(cls); jstring javaLang = (jstring)AndroidUtil::Method_java_util_Locale_getLanguage->call(locale); const char *langData = env->GetStringUTFChars(javaLang, 0); std::string lang(langData); @@ -59,7 +59,7 @@ std::string ZLibrary::Language() { std::string ZLibrary::Version() { JNIEnv *env = AndroidUtil::getEnv(); jclass cls = env->FindClass(AndroidUtil::Class_ZLibrary); - jobject zlibrary = env->CallStaticObjectMethod(cls, AndroidUtil::SMID_ZLibrary_Instance); + jobject zlibrary = AndroidUtil::StaticMethod_ZLibrary_Instance->call(cls); jstring javaVersion = (jstring)AndroidUtil::Method_ZLibrary_getVersionName->call(zlibrary); const char *versionData = env->GetStringUTFChars(javaVersion, 0); std::string version(versionData);