1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-05 02:39:23 +02:00

JNIEnv* cannot be stored

This commit is contained in:
Nikolay Pultsin 2012-04-01 08:07:40 +01:00
parent 39ab7ebb88
commit e641c7392c
5 changed files with 120 additions and 146 deletions

View file

@ -28,7 +28,7 @@ extern "C"
JNIEXPORT jobjectArray JNICALL Java_org_geometerplus_fbreader_formats_PluginCollection_nativePlugins(JNIEnv* env, jobject thiz) { JNIEXPORT jobjectArray JNICALL Java_org_geometerplus_fbreader_formats_PluginCollection_nativePlugins(JNIEnv* env, jobject thiz) {
const std::vector<shared_ptr<FormatPlugin> > plugins = PluginCollection::Instance().plugins(); const std::vector<shared_ptr<FormatPlugin> > plugins = PluginCollection::Instance().plugins();
const size_t size = plugins.size(); const size_t size = plugins.size();
jclass cls = AndroidUtil::Class_NativeFormatPlugin->j(); jclass cls = AndroidUtil::Class_NativeFormatPlugin.j();
// TODO: memory leak? // TODO: memory leak?
jobjectArray javaPlugins = env->NewObjectArray(size, cls, 0); jobjectArray javaPlugins = env->NewObjectArray(size, cls, 0);

View file

@ -25,28 +25,30 @@
JavaVM *AndroidUtil::ourJavaVM = 0; JavaVM *AndroidUtil::ourJavaVM = 0;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_Object; JavaClass AndroidUtil::Class_java_lang_Object("java/lang/Object");
shared_ptr<JavaArray> AndroidUtil::Array_java_lang_Object; JavaArray AndroidUtil::Array_java_lang_Object(Class_java_lang_Object);
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_RuntimeException; JavaClass AndroidUtil::Class_java_lang_RuntimeException("java/lang/RuntimeException");
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_String; JavaClass AndroidUtil::Class_java_lang_String("java/lang/String");
shared_ptr<JavaClass> AndroidUtil::Class_java_util_Collection; JavaClass AndroidUtil::Class_java_util_Collection("java/util/Collection");
shared_ptr<JavaClass> AndroidUtil::Class_java_util_List; JavaClass AndroidUtil::Class_java_util_List("java/util/List");
shared_ptr<JavaClass> AndroidUtil::Class_java_util_Locale; JavaClass AndroidUtil::Class_java_util_Locale("java/util/Locale");
shared_ptr<JavaClass> AndroidUtil::Class_java_io_InputStream; JavaClass AndroidUtil::Class_java_io_InputStream("java/io/InputStream");
shared_ptr<JavaClass> AndroidUtil::Class_ZLibrary;
shared_ptr<JavaClass> AndroidUtil::Class_NativeFormatPlugin; JavaClass AndroidUtil::Class_ZLibrary("org/geometerplus/zlibrary/core/library/ZLibrary");
shared_ptr<JavaClass> AndroidUtil::Class_PluginCollection; JavaClass AndroidUtil::Class_ZLFile("org/geometerplus/zlibrary/core/filesystem/ZLFile");
shared_ptr<JavaClass> AndroidUtil::Class_Encoding; JavaClass AndroidUtil::Class_ZLFileImage("org/geometerplus/zlibrary/core/image/ZLFileImage");
shared_ptr<JavaClass> AndroidUtil::Class_EncodingConverter; JavaClass AndroidUtil::Class_ZLTextModel("org/geometerplus/zlibrary/text/model/ZLTextModel");
shared_ptr<JavaClass> AndroidUtil::Class_JavaEncodingCollection;
shared_ptr<JavaClass> AndroidUtil::Class_Paths; JavaClass AndroidUtil::Class_Encoding("org/geometerplus/zlibrary/core/encodings/Encoding");
shared_ptr<JavaClass> AndroidUtil::Class_ZLFile; JavaClass AndroidUtil::Class_EncodingConverter("org/geometerplus/zlibrary/core/encodings/EncodingConverter");
shared_ptr<JavaClass> AndroidUtil::Class_ZLFileImage; JavaClass AndroidUtil::Class_JavaEncodingCollection("org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection");
shared_ptr<JavaClass> AndroidUtil::Class_ZLTextModel;
shared_ptr<JavaClass> AndroidUtil::Class_Book; JavaClass AndroidUtil::Class_NativeFormatPlugin("org/geometerplus/fbreader/formats/NativeFormatPlugin");
shared_ptr<JavaClass> AndroidUtil::Class_Tag; JavaClass AndroidUtil::Class_PluginCollection("org/geometerplus/fbreader/formats/PluginCollection");
shared_ptr<JavaClass> AndroidUtil::Class_NativeBookModel; JavaClass AndroidUtil::Class_Paths("org/geometerplus/fbreader/Paths");
//shared_ptr<JavaClass> AndroidUtil::Class_BookReadingException; JavaClass AndroidUtil::Class_Book("org/geometerplus/fbreader/library/Book");
JavaClass AndroidUtil::Class_Tag("org/geometerplus/fbreader/library/Tag");
JavaClass AndroidUtil::Class_NativeBookModel("org/geometerplus/fbreader/bookmodel/NativeBookModel");
shared_ptr<StringMethod> AndroidUtil::Method_java_lang_String_toLowerCase; shared_ptr<StringMethod> AndroidUtil::Method_java_lang_String_toLowerCase;
shared_ptr<StringMethod> AndroidUtil::Method_java_lang_String_toUpperCase; shared_ptr<StringMethod> AndroidUtil::Method_java_lang_String_toUpperCase;
@ -124,100 +126,73 @@ JNIEnv *AndroidUtil::getEnv() {
bool AndroidUtil::init(JavaVM* jvm) { bool AndroidUtil::init(JavaVM* jvm) {
ourJavaVM = jvm; ourJavaVM = jvm;
JNIEnv *env = getEnv(); Method_java_lang_String_toLowerCase = new StringMethod(Class_java_lang_String, "toLowerCase", "()");
Method_java_lang_String_toUpperCase = new StringMethod(Class_java_lang_String, "toUpperCase", "()");
Class_java_lang_Object = new JavaClass(env, "java/lang/Object"); Method_java_util_Collection_toArray = new ObjectArrayMethod(Class_java_util_Collection, "toArray", Array_java_lang_Object, "()");
Array_java_lang_Object = new JavaArray(*Class_java_lang_Object);
Class_java_lang_RuntimeException = new JavaClass(env, "java/lang/RuntimeException");
Class_java_lang_String = new JavaClass(env, "java/lang/String");
Class_java_util_Collection = new JavaClass(env, "java/util/Collection");
Class_java_util_List = new JavaClass(env, "java/util/List");
Class_java_util_Locale = new JavaClass(env, "java/util/Locale");
Class_java_io_InputStream = new JavaClass(env, "java/io/InputStream");
Class_ZLibrary = new JavaClass(env, "org/geometerplus/zlibrary/core/library/ZLibrary"); StaticMethod_java_util_Locale_getDefault = new StaticObjectMethod(Class_java_util_Locale, "getDefault", Class_java_util_Locale, "()");
Class_ZLFile = new JavaClass(env, "org/geometerplus/zlibrary/core/filesystem/ZLFile"); Method_java_util_Locale_getLanguage = new StringMethod(Class_java_util_Locale, "getLanguage", "()");
Class_ZLFileImage = new JavaClass(env, "org/geometerplus/zlibrary/core/image/ZLFileImage");
Class_ZLTextModel = new JavaClass(env, "org/geometerplus/zlibrary/text/model/ZLTextModel");
Class_Encoding = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/Encoding"); Method_java_io_InputStream_close = new VoidMethod(Class_java_io_InputStream, "close", "()");
Class_EncodingConverter = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/EncodingConverter"); Method_java_io_InputStream_read = new IntMethod(Class_java_io_InputStream, "read", "([BII)");
Class_JavaEncodingCollection = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection"); Method_java_io_InputStream_skip = new LongMethod(Class_java_io_InputStream, "skip", "(J)");
Class_NativeFormatPlugin = new JavaClass(env, "org/geometerplus/fbreader/formats/NativeFormatPlugin"); StaticMethod_ZLibrary_Instance = new StaticObjectMethod(Class_ZLibrary, "Instance", Class_ZLibrary, "()");
Class_PluginCollection = new JavaClass(env, "org/geometerplus/fbreader/formats/PluginCollection"); Method_ZLibrary_getVersionName = new StringMethod(Class_ZLibrary, "getVersionName", "()");
Class_Paths = new JavaClass(env, "org/geometerplus/fbreader/Paths");
Class_Book = new JavaClass(env, "org/geometerplus/fbreader/library/Book");
Class_Tag = new JavaClass(env, "org/geometerplus/fbreader/library/Tag");
Class_NativeBookModel = new JavaClass(env, "org/geometerplus/fbreader/bookmodel/NativeBookModel");
Method_java_lang_String_toLowerCase = new StringMethod(*Class_java_lang_String, "toLowerCase", "()"); Constructor_NativeFormatPlugin = new Constructor(Class_NativeFormatPlugin, "(Ljava/lang/String;)V");
Method_java_lang_String_toUpperCase = new StringMethod(*Class_java_lang_String, "toUpperCase", "()"); Method_NativeFormatPlugin_supportedFileType = new StringMethod(Class_NativeFormatPlugin, "supportedFileType", "()");
Method_java_util_Collection_toArray = new ObjectArrayMethod(*Class_java_util_Collection, "toArray", *Array_java_lang_Object, "()"); StaticMethod_PluginCollection_Instance = new StaticObjectMethod(Class_PluginCollection, "Instance", Class_PluginCollection, "()");
StaticMethod_java_util_Locale_getDefault = new StaticObjectMethod(*Class_java_util_Locale, "getDefault", *Class_java_util_Locale, "()"); Method_Encoding_createConverter = new ObjectMethod(Class_Encoding, "createConverter", Class_EncodingConverter, "()");
Method_java_util_Locale_getLanguage = new StringMethod(*Class_java_util_Locale, "getLanguage", "()"); Field_EncodingConverter_Name = new ObjectField(Class_EncodingConverter, "Name", Class_java_lang_String);
Method_EncodingConverter_convert = new IntMethod(Class_EncodingConverter, "convert", "([BII[BI)");
Method_EncodingConverter_reset = new VoidMethod(Class_EncodingConverter, "reset", "()");
Method_java_io_InputStream_close = new VoidMethod(*Class_java_io_InputStream, "close", "()"); StaticMethod_JavaEncodingCollection_Instance = new StaticObjectMethod(Class_JavaEncodingCollection, "Instance", Class_JavaEncodingCollection, "()");
Method_java_io_InputStream_read = new IntMethod(*Class_java_io_InputStream, "read", "([BII)"); Method_JavaEncodingCollection_getEncoding_String = new ObjectMethod(Class_JavaEncodingCollection, "getEncoding", Class_Encoding, "(Ljava/lang/String;)");
Method_java_io_InputStream_skip = new LongMethod(*Class_java_io_InputStream, "skip", "(J)"); Method_JavaEncodingCollection_getEncoding_int = new ObjectMethod(Class_JavaEncodingCollection, "getEncoding", Class_Encoding, "(I)");
Method_JavaEncodingCollection_providesConverterFor = new BooleanMethod(Class_JavaEncodingCollection, "providesConverterFor", "(Ljava/lang/String;)");
StaticMethod_ZLibrary_Instance = new StaticObjectMethod(*Class_ZLibrary, "Instance", *Class_ZLibrary, "()"); StaticMethod_ZLFile_createFileByPath = new StaticObjectMethod(Class_ZLFile, "createFileByPath", Class_ZLFile, "(Ljava/lang/String;)");
Method_ZLibrary_getVersionName = new StringMethod(*Class_ZLibrary, "getVersionName", "()"); Method_ZLFile_children = new ObjectMethod(Class_ZLFile, "children", Class_java_util_List, "()");
Method_ZLFile_exists = new BooleanMethod(Class_ZLFile, "exists", "()");
Method_ZLFile_isDirectory = new BooleanMethod(Class_ZLFile, "isDirectory", "()");
Method_ZLFile_getInputStream = new ObjectMethod(Class_ZLFile, "getInputStream", Class_java_io_InputStream, "()");
Method_ZLFile_getPath = new StringMethod(Class_ZLFile, "getPath", "()");
Method_ZLFile_size = new LongMethod(Class_ZLFile, "size", "()");
Constructor_NativeFormatPlugin = new Constructor(*Class_NativeFormatPlugin, "(Ljava/lang/String;)V"); Constructor_ZLFileImage = new Constructor(Class_ZLFileImage, "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;Ljava/lang/String;II)V");
Method_NativeFormatPlugin_supportedFileType = new StringMethod(*Class_NativeFormatPlugin, "supportedFileType", "()");
StaticMethod_PluginCollection_Instance = new StaticObjectMethod(*Class_PluginCollection, "Instance", *Class_PluginCollection, "()"); StaticMethod_Paths_cacheDirectory = new StaticObjectMethod(Class_Paths, "cacheDirectory", Class_java_lang_String, "()");
Method_Encoding_createConverter = new ObjectMethod(*Class_Encoding, "createConverter", *Class_EncodingConverter, "()"); Field_Book_File = new ObjectField(Class_Book, "File", Class_ZLFile);
Field_EncodingConverter_Name = new ObjectField(*Class_EncodingConverter, "Name", *Class_java_lang_String); Method_Book_getTitle = new StringMethod(Class_Book, "getTitle", "()");
Method_EncodingConverter_convert = new IntMethod(*Class_EncodingConverter, "convert", "([BII[BI)"); Method_Book_getLanguage = new StringMethod(Class_Book, "getLanguage", "()");
Method_EncodingConverter_reset = new VoidMethod(*Class_EncodingConverter, "reset", "()"); Method_Book_getEncodingNoDetection = new StringMethod(Class_Book, "getEncodingNoDetection", "()");
Method_Book_setTitle = new VoidMethod(Class_Book, "setTitle", "(Ljava/lang/String;)");
Method_Book_setSeriesInfo = new VoidMethod(Class_Book, "setSeriesInfo", "(Ljava/lang/String;F)");
Method_Book_setLanguage = new VoidMethod(Class_Book, "setLanguage", "(Ljava/lang/String;)");
Method_Book_setEncoding = new VoidMethod(Class_Book, "setEncoding", "(Ljava/lang/String;)");
Method_Book_addAuthor = new VoidMethod(Class_Book, "addAuthor", "(Ljava/lang/String;Ljava/lang/String;)");
Method_Book_addTag = new VoidMethod(Class_Book, "addTag", "(Lorg/geometerplus/fbreader/library/Tag;)");
Method_Book_save = new BooleanMethod(Class_Book, "save", "()");
StaticMethod_JavaEncodingCollection_Instance = new StaticObjectMethod(*Class_JavaEncodingCollection, "Instance", *Class_JavaEncodingCollection, "()"); StaticMethod_Tag_getTag = new StaticObjectMethod(Class_Tag, "getTag", Class_Tag, "(Lorg/geometerplus/fbreader/library/Tag;Ljava/lang/String;)");
Method_JavaEncodingCollection_getEncoding_String = new ObjectMethod(*Class_JavaEncodingCollection, "getEncoding", *Class_Encoding, "(Ljava/lang/String;)");
Method_JavaEncodingCollection_getEncoding_int = new ObjectMethod(*Class_JavaEncodingCollection, "getEncoding", *Class_Encoding, "(I)");
Method_JavaEncodingCollection_providesConverterFor = new BooleanMethod(*Class_JavaEncodingCollection, "providesConverterFor", "(Ljava/lang/String;)");
StaticMethod_ZLFile_createFileByPath = new StaticObjectMethod(*Class_ZLFile, "createFileByPath", *Class_ZLFile, "(Ljava/lang/String;)"); Field_NativeBookModel_Book = new ObjectField(Class_NativeBookModel, "Book", Class_Book);
Method_ZLFile_children = new ObjectMethod(*Class_ZLFile, "children", *Class_java_util_List, "()"); Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(Class_NativeBookModel, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)");
Method_ZLFile_exists = new BooleanMethod(*Class_ZLFile, "exists", "()"); Method_NativeBookModel_initTOC = new VoidMethod(Class_NativeBookModel, "initTOC", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;[I[I)");
Method_ZLFile_isDirectory = new BooleanMethod(*Class_ZLFile, "isDirectory", "()"); Method_NativeBookModel_createTextModel = new ObjectMethod(Class_NativeBookModel, "createTextModel", Class_ZLTextModel, "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)");
Method_ZLFile_getInputStream = new ObjectMethod(*Class_ZLFile, "getInputStream", *Class_java_io_InputStream, "()"); Method_NativeBookModel_setBookTextModel = new VoidMethod(Class_NativeBookModel, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)");
Method_ZLFile_getPath = new StringMethod(*Class_ZLFile, "getPath", "()"); Method_NativeBookModel_setFootnoteModel = new VoidMethod(Class_NativeBookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)");
Method_ZLFile_size = new LongMethod(*Class_ZLFile, "size", "()"); Method_NativeBookModel_addImage = new VoidMethod(Class_NativeBookModel, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)");
Constructor_ZLFileImage = new Constructor(*Class_ZLFileImage, "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;Ljava/lang/String;II)V");
StaticMethod_Paths_cacheDirectory = new StaticObjectMethod(*Class_Paths, "cacheDirectory", *Class_java_lang_String, "()");
Field_Book_File = new ObjectField(*Class_Book, "File", *Class_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(*Class_Book, "setTitle", "(Ljava/lang/String;)");
Method_Book_setSeriesInfo = new VoidMethod(*Class_Book, "setSeriesInfo", "(Ljava/lang/String;F)");
Method_Book_setLanguage = new VoidMethod(*Class_Book, "setLanguage", "(Ljava/lang/String;)");
Method_Book_setEncoding = new VoidMethod(*Class_Book, "setEncoding", "(Ljava/lang/String;)");
Method_Book_addAuthor = new VoidMethod(*Class_Book, "addAuthor", "(Ljava/lang/String;Ljava/lang/String;)");
Method_Book_addTag = new VoidMethod(*Class_Book, "addTag", "(Lorg/geometerplus/fbreader/library/Tag;)");
Method_Book_save = new BooleanMethod(*Class_Book, "save", "()");
StaticMethod_Tag_getTag = new StaticObjectMethod(*Class_Tag, "getTag", *Class_Tag, "(Lorg/geometerplus/fbreader/library/Tag;Ljava/lang/String;)");
Field_NativeBookModel_Book = new ObjectField(*Class_NativeBookModel, "Book", *Class_Book);
Method_NativeBookModel_initInternalHyperlinks = new VoidMethod(*Class_NativeBookModel, "initInternalHyperlinks", "(Ljava/lang/String;Ljava/lang/String;I)");
Method_NativeBookModel_initTOC = new VoidMethod(*Class_NativeBookModel, "initTOC", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;[I[I)");
Method_NativeBookModel_createTextModel = new ObjectMethod(*Class_NativeBookModel, "createTextModel", *Class_ZLTextModel, "(Ljava/lang/String;Ljava/lang/String;I[I[I[I[I[BLjava/lang/String;Ljava/lang/String;I)");
Method_NativeBookModel_setBookTextModel = new VoidMethod(*Class_NativeBookModel, "setBookTextModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)");
Method_NativeBookModel_setFootnoteModel = new VoidMethod(*Class_NativeBookModel, "setFootnoteModel", "(Lorg/geometerplus/zlibrary/text/model/ZLTextModel;)");
Method_NativeBookModel_addImage = new VoidMethod(*Class_NativeBookModel, "addImage", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/image/ZLImage;)");
/* /*
Class_BookReadingException = new JavaClass(env, "org/geometerplus/fbreader/bookmodel/BookReadingException"); 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") ); StaticMethod_BookReadingException_throwForFile = new StaticVoidMethod(Class_BookReadingException, "throwForFile", "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;)V") );
*/ */
return true; return true;
@ -299,7 +274,7 @@ jbyteArray AndroidUtil::createJavaByteArray(JNIEnv *env, const std::vector<jbyte
} }
void AndroidUtil::throwRuntimeException(JNIEnv *env, const std::string &message) { void AndroidUtil::throwRuntimeException(JNIEnv *env, const std::string &message) {
env->ThrowNew(Class_java_lang_RuntimeException->j(), message.c_str()); env->ThrowNew(Class_java_lang_RuntimeException.j(), message.c_str());
} }
/* /*

View file

@ -49,28 +49,28 @@ private:
static JavaVM *ourJavaVM; static JavaVM *ourJavaVM;
public: public:
static shared_ptr<JavaClass> Class_java_lang_Object; static JavaClass Class_java_lang_Object;
static shared_ptr<JavaArray> Array_java_lang_Object; static JavaArray Array_java_lang_Object;
static shared_ptr<JavaClass> Class_java_lang_RuntimeException; static JavaClass Class_java_lang_RuntimeException;
static shared_ptr<JavaClass> Class_java_lang_String; static JavaClass Class_java_lang_String;
static shared_ptr<JavaClass> Class_java_util_Collection; static JavaClass Class_java_util_Collection;
static shared_ptr<JavaClass> Class_java_util_List; static JavaClass Class_java_util_List;
static shared_ptr<JavaClass> Class_java_util_Locale; static JavaClass Class_java_util_Locale;
static shared_ptr<JavaClass> Class_java_io_InputStream; static JavaClass Class_java_io_InputStream;
static shared_ptr<JavaClass> Class_ZLibrary; static JavaClass Class_ZLibrary;
static shared_ptr<JavaClass> Class_ZLFile; static JavaClass Class_ZLFile;
static shared_ptr<JavaClass> Class_ZLFileImage; static JavaClass Class_ZLFileImage;
static shared_ptr<JavaClass> Class_ZLTextModel; static JavaClass Class_ZLTextModel;
static shared_ptr<JavaClass> Class_NativeFormatPlugin; static JavaClass Class_NativeFormatPlugin;
static shared_ptr<JavaClass> Class_PluginCollection; static JavaClass Class_PluginCollection;
static shared_ptr<JavaClass> Class_Encoding; static JavaClass Class_Encoding;
static shared_ptr<JavaClass> Class_EncodingConverter; static JavaClass Class_EncodingConverter;
static shared_ptr<JavaClass> Class_JavaEncodingCollection; static JavaClass Class_JavaEncodingCollection;
static shared_ptr<JavaClass> Class_Paths; static JavaClass Class_Paths;
static shared_ptr<JavaClass> Class_Book; static JavaClass Class_Book;
static shared_ptr<JavaClass> Class_Tag; static JavaClass Class_Tag;
static shared_ptr<JavaClass> Class_NativeBookModel; static JavaClass Class_NativeBookModel;
//static shared_ptr<JavaClass> Class_BookReadingException; //static JavaClass Class_BookReadingException;
static shared_ptr<StringMethod> Method_java_lang_String_toLowerCase; static shared_ptr<StringMethod> Method_java_lang_String_toLowerCase;
static shared_ptr<StringMethod> Method_java_lang_String_toUpperCase; static shared_ptr<StringMethod> Method_java_lang_String_toUpperCase;

View file

@ -20,6 +20,7 @@
#include <ZLLogger.h> #include <ZLLogger.h>
#include "JniEnvelope.h" #include "JniEnvelope.h"
#include "AndroidUtil.h"
static const std::string JNI_LOGGER_CLASS = "JniLog"; static const std::string JNI_LOGGER_CLASS = "JniLog";
@ -41,13 +42,13 @@ std::string JavaArray::code() const {
return "[" + myBase.code(); return "[" + myBase.code();
} }
JavaClass::JavaClass(JNIEnv *env, const std::string &name) : myName(name), myEnv(env) { JavaClass::JavaClass(const std::string &name) : myName(name) {
myClass = 0; myClass = 0;
} }
JavaClass::~JavaClass() { JavaClass::~JavaClass() {
if (myClass != 0) { if (myClass != 0) {
myEnv->DeleteGlobalRef(myClass); AndroidUtil::getEnv()->DeleteGlobalRef(myClass);
} }
} }
@ -57,9 +58,10 @@ std::string JavaClass::code() const {
jclass JavaClass::j() const { jclass JavaClass::j() const {
if (myClass == 0) { if (myClass == 0) {
jclass ref = myEnv->FindClass(myName.c_str()); JNIEnv *env = AndroidUtil::getEnv();
myClass = (jclass)myEnv->NewGlobalRef(ref); jclass ref = env->FindClass(myName.c_str());
myEnv->DeleteLocalRef(ref); myClass = (jclass)env->NewGlobalRef(ref);
env->DeleteLocalRef(ref);
} }
return myClass; return myClass;
} }
@ -72,19 +74,19 @@ Member::~Member() {
} }
Constructor::Constructor(const JavaClass &cls, const std::string &parameters) : Member(cls) { Constructor::Constructor(const JavaClass &cls, const std::string &parameters) : Member(cls) {
myId = env().GetMethodID(jClass(), "<init>", parameters.c_str()); myId = AndroidUtil::getEnv()->GetMethodID(jClass(), "<init>", parameters.c_str());
} }
jobject Constructor::call(...) { jobject Constructor::call(...) {
va_list lst; va_list lst;
va_start(lst, this); va_start(lst, this);
jobject obj = env().NewObjectV(jClass(), myId, lst); jobject obj = AndroidUtil::getEnv()->NewObjectV(jClass(), myId, lst);
va_end(lst); va_end(lst);
return obj; return obj;
} }
Field::Field(const JavaClass &cls, const std::string &name, const JavaType &type) : Member(cls), myName(name) { Field::Field(const JavaClass &cls, const std::string &name, const JavaType &type) : Member(cls), myName(name) {
myId = env().GetFieldID(jClass(), name.c_str(), type.code().c_str()); myId = AndroidUtil::getEnv()->GetFieldID(jClass(), name.c_str(), type.code().c_str());
} }
Field::~Field() { Field::~Field() {
@ -92,7 +94,7 @@ Field::~Field() {
Method::Method(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters) : Member(cls), myName(name) { Method::Method(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters) : Member(cls), myName(name) {
const std::string signature = parameters + returnType.code(); const std::string signature = parameters + returnType.code();
myId = env().GetMethodID(jClass(), name.c_str(), signature.c_str()); myId = AndroidUtil::getEnv()->GetMethodID(jClass(), name.c_str(), signature.c_str());
} }
Method::~Method() { Method::~Method() {
@ -100,7 +102,7 @@ Method::~Method() {
StaticMethod::StaticMethod(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters) : Member(cls), myName(name) { StaticMethod::StaticMethod(const JavaClass &cls, const std::string &name, const JavaType &returnType, const std::string &parameters) : Member(cls), myName(name) {
const std::string signature = parameters + returnType.code(); const std::string signature = parameters + returnType.code();
myId = env().GetStaticMethodID(jClass(), name.c_str(), signature.c_str()); myId = AndroidUtil::getEnv()->GetStaticMethodID(jClass(), name.c_str(), signature.c_str());
} }
StaticMethod::~StaticMethod() { StaticMethod::~StaticMethod() {
@ -111,7 +113,7 @@ ObjectField::ObjectField(const JavaClass &cls, const std::string &name, const Ja
jobject ObjectField::value(jobject obj) const { jobject ObjectField::value(jobject obj) const {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "getting value of ObjectField " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "getting value of ObjectField " + myName);
jobject val = env().GetObjectField(obj, myId); jobject val = AndroidUtil::getEnv()->GetObjectField(obj, myId);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "got value of ObjectField " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "got value of ObjectField " + myName);
return val; return val;
} }
@ -123,7 +125,7 @@ void VoidMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling VoidMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling VoidMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
env().CallVoidMethodV(base, myId, lst); AndroidUtil::getEnv()->CallVoidMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished VoidMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished VoidMethod " + myName);
} }
@ -135,7 +137,7 @@ jint IntMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling IntMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling IntMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
jint result = env().CallIntMethodV(base, myId, lst); jint result = AndroidUtil::getEnv()->CallIntMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished IntMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished IntMethod " + myName);
return result; return result;
@ -148,7 +150,7 @@ jlong LongMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling LongMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling LongMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
jlong result = env().CallLongMethodV(base, myId, lst); jlong result = AndroidUtil::getEnv()->CallLongMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished LongMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished LongMethod " + myName);
return result; return result;
@ -161,7 +163,7 @@ jboolean BooleanMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling BooleanMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling BooleanMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
jboolean result = env().CallBooleanMethodV(base, myId, lst); jboolean result = AndroidUtil::getEnv()->CallBooleanMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished BooleanMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished BooleanMethod " + myName);
return result; return result;
@ -176,7 +178,7 @@ jstring StringMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling StringMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling StringMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
jstring result = (jstring)env().CallObjectMethodV(base, myId, lst); jstring result = (jstring)AndroidUtil::getEnv()->CallObjectMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished StringMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished StringMethod " + myName);
return result; return result;
@ -189,7 +191,7 @@ jobject ObjectMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling ObjectMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling ObjectMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
jobject result = env().CallObjectMethodV(base, myId, lst); jobject result = AndroidUtil::getEnv()->CallObjectMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished ObjectMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished ObjectMethod " + myName);
return result; return result;
@ -202,7 +204,7 @@ jobjectArray ObjectArrayMethod::call(jobject base, ...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling ObjectArrayMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling ObjectArrayMethod " + myName);
va_list lst; va_list lst;
va_start(lst, base); va_start(lst, base);
jobjectArray result = (jobjectArray)env().CallObjectMethodV(base, myId, lst); jobjectArray result = (jobjectArray)AndroidUtil::getEnv()->CallObjectMethodV(base, myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished ObjectArrayMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished ObjectArrayMethod " + myName);
return result; return result;
@ -215,7 +217,7 @@ jobject StaticObjectMethod::call(...) {
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling StaticObjectMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "calling StaticObjectMethod " + myName);
va_list lst; va_list lst;
va_start(lst, this); va_start(lst, this);
jobject result = env().CallStaticObjectMethodV(jClass(), myId, lst); jobject result = AndroidUtil::getEnv()->CallStaticObjectMethodV(jClass(), myId, lst);
va_end(lst); va_end(lst);
ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished StaticObjectMethod " + myName); ZLLogger::Instance().println(JNI_LOGGER_CLASS, "finished StaticObjectMethod " + myName);
return result; return result;

View file

@ -70,14 +70,13 @@ private:
class JavaClass : public JavaType { class JavaClass : public JavaType {
public: public:
JavaClass(JNIEnv *env, const std::string &name); JavaClass(const std::string &name);
~JavaClass(); ~JavaClass();
jclass j() const; jclass j() const;
std::string code() const; std::string code() const;
private: private:
const std::string myName; const std::string myName;
JNIEnv *myEnv;
mutable jclass myClass; mutable jclass myClass;
friend class Member; friend class Member;
@ -87,7 +86,6 @@ class Member {
protected: protected:
Member(const JavaClass &cls); Member(const JavaClass &cls);
JNIEnv &env() const;
jclass jClass() const; jclass jClass() const;
public: public:
@ -207,7 +205,6 @@ public:
jobject call(...); jobject call(...);
}; };
inline JNIEnv &Member::env() const { return *myClass.myEnv; }
inline jclass Member::jClass() const { return myClass.j(); } inline jclass Member::jClass() const { return myClass.j(); }
inline JavaPrimitiveType::JavaPrimitiveType(const std::string &code) : myCode(code) {} inline JavaPrimitiveType::JavaPrimitiveType(const std::string &code) : myCode(code) {}