1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 09:49:19 +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) {
const std::vector<shared_ptr<FormatPlugin> > plugins = PluginCollection::Instance().plugins();
const size_t size = plugins.size();
jclass cls = AndroidUtil::Class_NativeFormatPlugin->j();
jclass cls = AndroidUtil::Class_NativeFormatPlugin.j();
// TODO: memory leak?
jobjectArray javaPlugins = env->NewObjectArray(size, cls, 0);

View file

@ -25,28 +25,30 @@
JavaVM *AndroidUtil::ourJavaVM = 0;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_Object;
shared_ptr<JavaArray> AndroidUtil::Array_java_lang_Object;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_RuntimeException;
shared_ptr<JavaClass> AndroidUtil::Class_java_lang_String;
shared_ptr<JavaClass> AndroidUtil::Class_java_util_Collection;
shared_ptr<JavaClass> AndroidUtil::Class_java_util_List;
shared_ptr<JavaClass> AndroidUtil::Class_java_util_Locale;
shared_ptr<JavaClass> AndroidUtil::Class_java_io_InputStream;
shared_ptr<JavaClass> AndroidUtil::Class_ZLibrary;
shared_ptr<JavaClass> AndroidUtil::Class_NativeFormatPlugin;
shared_ptr<JavaClass> AndroidUtil::Class_PluginCollection;
shared_ptr<JavaClass> AndroidUtil::Class_Encoding;
shared_ptr<JavaClass> AndroidUtil::Class_EncodingConverter;
shared_ptr<JavaClass> AndroidUtil::Class_JavaEncodingCollection;
shared_ptr<JavaClass> AndroidUtil::Class_Paths;
shared_ptr<JavaClass> AndroidUtil::Class_ZLFile;
shared_ptr<JavaClass> AndroidUtil::Class_ZLFileImage;
shared_ptr<JavaClass> AndroidUtil::Class_ZLTextModel;
shared_ptr<JavaClass> AndroidUtil::Class_Book;
shared_ptr<JavaClass> AndroidUtil::Class_Tag;
shared_ptr<JavaClass> AndroidUtil::Class_NativeBookModel;
//shared_ptr<JavaClass> AndroidUtil::Class_BookReadingException;
JavaClass AndroidUtil::Class_java_lang_Object("java/lang/Object");
JavaArray AndroidUtil::Array_java_lang_Object(Class_java_lang_Object);
JavaClass AndroidUtil::Class_java_lang_RuntimeException("java/lang/RuntimeException");
JavaClass AndroidUtil::Class_java_lang_String("java/lang/String");
JavaClass AndroidUtil::Class_java_util_Collection("java/util/Collection");
JavaClass AndroidUtil::Class_java_util_List("java/util/List");
JavaClass AndroidUtil::Class_java_util_Locale("java/util/Locale");
JavaClass AndroidUtil::Class_java_io_InputStream("java/io/InputStream");
JavaClass AndroidUtil::Class_ZLibrary("org/geometerplus/zlibrary/core/library/ZLibrary");
JavaClass AndroidUtil::Class_ZLFile("org/geometerplus/zlibrary/core/filesystem/ZLFile");
JavaClass AndroidUtil::Class_ZLFileImage("org/geometerplus/zlibrary/core/image/ZLFileImage");
JavaClass AndroidUtil::Class_ZLTextModel("org/geometerplus/zlibrary/text/model/ZLTextModel");
JavaClass AndroidUtil::Class_Encoding("org/geometerplus/zlibrary/core/encodings/Encoding");
JavaClass AndroidUtil::Class_EncodingConverter("org/geometerplus/zlibrary/core/encodings/EncodingConverter");
JavaClass AndroidUtil::Class_JavaEncodingCollection("org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection");
JavaClass AndroidUtil::Class_NativeFormatPlugin("org/geometerplus/fbreader/formats/NativeFormatPlugin");
JavaClass AndroidUtil::Class_PluginCollection("org/geometerplus/fbreader/formats/PluginCollection");
JavaClass AndroidUtil::Class_Paths("org/geometerplus/fbreader/Paths");
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_toUpperCase;
@ -124,100 +126,73 @@ JNIEnv *AndroidUtil::getEnv() {
bool AndroidUtil::init(JavaVM* 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");
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");
Method_java_util_Collection_toArray = new ObjectArrayMethod(Class_java_util_Collection, "toArray", Array_java_lang_Object, "()");
Class_ZLibrary = new JavaClass(env, "org/geometerplus/zlibrary/core/library/ZLibrary");
Class_ZLFile = new JavaClass(env, "org/geometerplus/zlibrary/core/filesystem/ZLFile");
Class_ZLFileImage = new JavaClass(env, "org/geometerplus/zlibrary/core/image/ZLFileImage");
Class_ZLTextModel = new JavaClass(env, "org/geometerplus/zlibrary/text/model/ZLTextModel");
StaticMethod_java_util_Locale_getDefault = new StaticObjectMethod(Class_java_util_Locale, "getDefault", Class_java_util_Locale, "()");
Method_java_util_Locale_getLanguage = new StringMethod(Class_java_util_Locale, "getLanguage", "()");
Class_Encoding = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/Encoding");
Class_EncodingConverter = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/EncodingConverter");
Class_JavaEncodingCollection = new JavaClass(env, "org/geometerplus/zlibrary/core/encodings/JavaEncodingCollection");
Method_java_io_InputStream_close = new VoidMethod(Class_java_io_InputStream, "close", "()");
Method_java_io_InputStream_read = new IntMethod(Class_java_io_InputStream, "read", "([BII)");
Method_java_io_InputStream_skip = new LongMethod(Class_java_io_InputStream, "skip", "(J)");
Class_NativeFormatPlugin = new JavaClass(env, "org/geometerplus/fbreader/formats/NativeFormatPlugin");
Class_PluginCollection = new JavaClass(env, "org/geometerplus/fbreader/formats/PluginCollection");
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");
StaticMethod_ZLibrary_Instance = new StaticObjectMethod(Class_ZLibrary, "Instance", Class_ZLibrary, "()");
Method_ZLibrary_getVersionName = new StringMethod(Class_ZLibrary, "getVersionName", "()");
Method_java_lang_String_toLowerCase = new StringMethod(*Class_java_lang_String, "toLowerCase", "()");
Method_java_lang_String_toUpperCase = new StringMethod(*Class_java_lang_String, "toUpperCase", "()");
Constructor_NativeFormatPlugin = new Constructor(Class_NativeFormatPlugin, "(Ljava/lang/String;)V");
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_java_util_Locale_getLanguage = new StringMethod(*Class_java_util_Locale, "getLanguage", "()");
Method_Encoding_createConverter = new ObjectMethod(Class_Encoding, "createConverter", Class_EncodingConverter, "()");
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", "()");
Method_java_io_InputStream_read = new IntMethod(*Class_java_io_InputStream, "read", "([BII)");
Method_java_io_InputStream_skip = new LongMethod(*Class_java_io_InputStream, "skip", "(J)");
StaticMethod_JavaEncodingCollection_Instance = new StaticObjectMethod(Class_JavaEncodingCollection, "Instance", Class_JavaEncodingCollection, "()");
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_ZLibrary_Instance = new StaticObjectMethod(*Class_ZLibrary, "Instance", *Class_ZLibrary, "()");
Method_ZLibrary_getVersionName = new StringMethod(*Class_ZLibrary, "getVersionName", "()");
StaticMethod_ZLFile_createFileByPath = new StaticObjectMethod(Class_ZLFile, "createFileByPath", Class_ZLFile, "(Ljava/lang/String;)");
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");
Method_NativeFormatPlugin_supportedFileType = new StringMethod(*Class_NativeFormatPlugin, "supportedFileType", "()");
Constructor_ZLFileImage = new Constructor(Class_ZLFileImage, "(Ljava/lang/String;Lorg/geometerplus/zlibrary/core/filesystem/ZLFile;Ljava/lang/String;II)V");
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_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", "()");
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_JavaEncodingCollection_Instance = new StaticObjectMethod(*Class_JavaEncodingCollection, "Instance", *Class_JavaEncodingCollection, "()");
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_Tag_getTag = new StaticObjectMethod(Class_Tag, "getTag", Class_Tag, "(Lorg/geometerplus/fbreader/library/Tag;Ljava/lang/String;)");
StaticMethod_ZLFile_createFileByPath = new StaticObjectMethod(*Class_ZLFile, "createFileByPath", *Class_ZLFile, "(Ljava/lang/String;)");
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_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;)");
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");
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;
@ -299,7 +274,7 @@ jbyteArray AndroidUtil::createJavaByteArray(JNIEnv *env, const std::vector<jbyte
}
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;
public:
static shared_ptr<JavaClass> Class_java_lang_Object;
static shared_ptr<JavaArray> Array_java_lang_Object;
static shared_ptr<JavaClass> Class_java_lang_RuntimeException;
static shared_ptr<JavaClass> Class_java_lang_String;
static shared_ptr<JavaClass> Class_java_util_Collection;
static shared_ptr<JavaClass> Class_java_util_List;
static shared_ptr<JavaClass> Class_java_util_Locale;
static shared_ptr<JavaClass> Class_java_io_InputStream;
static shared_ptr<JavaClass> Class_ZLibrary;
static shared_ptr<JavaClass> Class_ZLFile;
static shared_ptr<JavaClass> Class_ZLFileImage;
static shared_ptr<JavaClass> Class_ZLTextModel;
static shared_ptr<JavaClass> Class_NativeFormatPlugin;
static shared_ptr<JavaClass> Class_PluginCollection;
static shared_ptr<JavaClass> Class_Encoding;
static shared_ptr<JavaClass> Class_EncodingConverter;
static shared_ptr<JavaClass> Class_JavaEncodingCollection;
static shared_ptr<JavaClass> Class_Paths;
static shared_ptr<JavaClass> Class_Book;
static shared_ptr<JavaClass> Class_Tag;
static shared_ptr<JavaClass> Class_NativeBookModel;
//static shared_ptr<JavaClass> Class_BookReadingException;
static JavaClass Class_java_lang_Object;
static JavaArray Array_java_lang_Object;
static JavaClass Class_java_lang_RuntimeException;
static JavaClass Class_java_lang_String;
static JavaClass Class_java_util_Collection;
static JavaClass Class_java_util_List;
static JavaClass Class_java_util_Locale;
static JavaClass Class_java_io_InputStream;
static JavaClass Class_ZLibrary;
static JavaClass Class_ZLFile;
static JavaClass Class_ZLFileImage;
static JavaClass Class_ZLTextModel;
static JavaClass Class_NativeFormatPlugin;
static JavaClass Class_PluginCollection;
static JavaClass Class_Encoding;
static JavaClass Class_EncodingConverter;
static JavaClass Class_JavaEncodingCollection;
static JavaClass Class_Paths;
static JavaClass Class_Book;
static JavaClass Class_Tag;
static JavaClass Class_NativeBookModel;
//static JavaClass Class_BookReadingException;
static shared_ptr<StringMethod> Method_java_lang_String_toLowerCase;
static shared_ptr<StringMethod> Method_java_lang_String_toUpperCase;

View file

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

View file

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