1
0
Fork 0
mirror of https://github.com/geometer/FBReaderJ.git synced 2025-10-03 09:49:19 +02:00

native code simplification (introduced JString class)

This commit is contained in:
Nikolay Pultsin 2014-04-07 21:02:52 +01:00
parent 48cdfee8a2
commit fdb21b67dc
4 changed files with 71 additions and 83 deletions

View file

@ -42,51 +42,38 @@ static shared_ptr<FormatPlugin> findCppPlugin(jobject base) {
static void fillUids(JNIEnv* env, jobject javaBook, Book &book) { static void fillUids(JNIEnv* env, jobject javaBook, Book &book) {
const UIDList &uids = book.uids(); const UIDList &uids = book.uids();
for (UIDList::const_iterator it = uids.begin(); it != uids.end(); ++it) { for (UIDList::const_iterator it = uids.begin(); it != uids.end(); ++it) {
jstring type = AndroidUtil::createJavaString(env, (*it)->Type); JString type(env, (*it)->Type);
jstring id = AndroidUtil::createJavaString(env, (*it)->Id); JString id(env, (*it)->Id);
AndroidUtil::Method_Book_addUid->call(javaBook, type, id); AndroidUtil::Method_Book_addUid->call(javaBook, type.j(), id.j());
env->DeleteLocalRef(id);
env->DeleteLocalRef(type);
} }
} }
static void fillMetaInfo(JNIEnv* env, jobject javaBook, Book &book) { static void fillMetaInfo(JNIEnv* env, jobject javaBook, Book &book) {
jstring javaString; JString title(env, book.title());
AndroidUtil::Method_Book_setTitle->call(javaBook, title.j());
javaString = AndroidUtil::createJavaString(env, book.title()); JString language(env, book.language());
AndroidUtil::Method_Book_setTitle->call(javaBook, javaString); if (language.j() != 0) {
env->DeleteLocalRef(javaString); AndroidUtil::Method_Book_setLanguage->call(javaBook, language.j());
javaString = AndroidUtil::createJavaString(env, book.language());
if (javaString != 0) {
AndroidUtil::Method_Book_setLanguage->call(javaBook, javaString);
env->DeleteLocalRef(javaString);
} }
javaString = AndroidUtil::createJavaString(env, book.encoding()); JString encoding(env, book.encoding());
if (javaString != 0) { if (encoding.j() != 0) {
AndroidUtil::Method_Book_setEncoding->call(javaBook, javaString); AndroidUtil::Method_Book_setEncoding->call(javaBook, encoding.j());
env->DeleteLocalRef(javaString);
} }
javaString = AndroidUtil::createJavaString(env, book.seriesTitle()); JString seriesTitle(env, book.seriesTitle());
if (javaString != 0) { if (seriesTitle.j() != 0) {
jstring indexString = AndroidUtil::createJavaString(env, book.indexInSeries()); JString indexString(env, book.indexInSeries());
AndroidUtil::Method_Book_setSeriesInfo->call(javaBook, javaString, indexString); AndroidUtil::Method_Book_setSeriesInfo->call(javaBook, seriesTitle.j(), indexString.j());
if (indexString != 0) {
env->DeleteLocalRef(indexString);
}
env->DeleteLocalRef(javaString);
} }
const AuthorList &authors = book.authors(); const AuthorList &authors = book.authors();
for (std::size_t i = 0; i < authors.size(); ++i) { for (std::size_t i = 0; i < authors.size(); ++i) {
const Author &author = *authors[i]; const Author &author = *authors[i];
javaString = env->NewStringUTF(author.name().c_str()); JString name(env, author.name(), false);
jstring key = env->NewStringUTF(author.sortKey().c_str()); JString key(env, author.sortKey(), false);
AndroidUtil::Method_Book_addAuthor->call(javaBook, javaString, key); AndroidUtil::Method_Book_addAuthor->call(javaBook, name.j(), key.j());
env->DeleteLocalRef(key);
env->DeleteLocalRef(javaString);
} }
const TagList &tags = book.tags(); const TagList &tags = book.tags();
@ -99,18 +86,14 @@ static void fillMetaInfo(JNIEnv* env, jobject javaBook, Book &book) {
} }
static void fillLanguageAndEncoding(JNIEnv* env, jobject javaBook, Book &book) { static void fillLanguageAndEncoding(JNIEnv* env, jobject javaBook, Book &book) {
jstring javaString; JString language(env, book.language());
if (language.j() != 0) {
javaString = AndroidUtil::createJavaString(env, book.language()); AndroidUtil::Method_Book_setLanguage->call(javaBook, language.j());
if (javaString != 0) {
AndroidUtil::Method_Book_setLanguage->call(javaBook, javaString);
env->DeleteLocalRef(javaString);
} }
javaString = AndroidUtil::createJavaString(env, book.encoding()); JString encoding(env, book.encoding());
if (javaString != 0) { if (encoding.j() != 0) {
AndroidUtil::Method_Book_setEncoding->call(javaBook, javaString); AndroidUtil::Method_Book_setEncoding->call(javaBook, encoding.j());
env->DeleteLocalRef(javaString);
} }
} }
@ -215,12 +198,10 @@ static bool initInternalHyperlinks(JNIEnv *env, jobject javaModel, BookModel &mo
} }
allocator.flush(); allocator.flush();
jstring linksDirectoryName = env->NewStringUTF(allocator.directoryName().c_str()); JString linksDirectoryName(env, allocator.directoryName(), false);
jstring linksFileExtension = env->NewStringUTF(allocator.fileExtension().c_str()); JString linksFileExtension(env, allocator.fileExtension(), false);
jint linksBlocksNumber = allocator.blocksNumber(); jint linksBlocksNumber = allocator.blocksNumber();
AndroidUtil::Method_NativeBookModel_initInternalHyperlinks->call(javaModel, linksDirectoryName, linksFileExtension, linksBlocksNumber); AndroidUtil::Method_NativeBookModel_initInternalHyperlinks->call(javaModel, linksDirectoryName.j(), linksFileExtension.j(), linksBlocksNumber);
env->DeleteLocalRef(linksDirectoryName);
env->DeleteLocalRef(linksFileExtension);
return !env->ExceptionCheck(); return !env->ExceptionCheck();
} }
@ -265,10 +246,8 @@ static void initTOC(JNIEnv *env, jobject javaModel, const ContentsTree &tree) {
const std::vector<shared_ptr<ContentsTree> > &children = tree.children(); const std::vector<shared_ptr<ContentsTree> > &children = tree.children();
for (std::vector<shared_ptr<ContentsTree> >::const_iterator it = children.begin(); it != children.end(); ++it) { for (std::vector<shared_ptr<ContentsTree> >::const_iterator it = children.begin(); it != children.end(); ++it) {
const ContentsTree &child = **it; const ContentsTree &child = **it;
jstring text = AndroidUtil::createJavaString(env, child.text()); JString text(env, child.text());
const int ref = child.reference(); AndroidUtil::Method_NativeBookModel_addTOCItem->call(javaModel, text.j(), child.reference());
AndroidUtil::Method_NativeBookModel_addTOCItem->call(javaModel, text, ref);
env->DeleteLocalRef(text);
initTOC(env, javaModel, child); initTOC(env, javaModel, child);
@ -335,9 +314,8 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin
const std::vector<std::string> &lst = *it; const std::vector<std::string> &lst = *it;
jobjectArray jList = env->NewObjectArray(lst.size(), AndroidUtil::Class_java_lang_String.j(), 0); jobjectArray jList = env->NewObjectArray(lst.size(), AndroidUtil::Class_java_lang_String.j(), 0);
for (std::size_t i = 0; i < lst.size(); ++i) { for (std::size_t i = 0; i < lst.size(); ++i) {
jstring jString = AndroidUtil::createJavaString(env, lst[i]); JString jString(env, lst[i]);
env->SetObjectArrayElement(jList, i, jString); env->SetObjectArrayElement(jList, i, jString.j());
env->DeleteLocalRef(jString);
} }
AndroidUtil::Method_NativeBookModel_registerFontFamilyList->call(javaModel, jList); AndroidUtil::Method_NativeBookModel_registerFontFamilyList->call(javaModel, jList);
env->DeleteLocalRef(jList); env->DeleteLocalRef(jList);
@ -348,21 +326,20 @@ JNIEXPORT jint JNICALL Java_org_geometerplus_fbreader_formats_NativeFormatPlugin
if (it->second.isNull()) { if (it->second.isNull()) {
continue; continue;
} }
jstring family = AndroidUtil::createJavaString(env, it->first); JString family(env, it->first);
jstring normal = createJavaString(env, it->second->Normal); jstring normal = createJavaString(env, it->second->Normal);
jstring bold = createJavaString(env, it->second->Bold); jstring bold = createJavaString(env, it->second->Bold);
jstring italic = createJavaString(env, it->second->Italic); jstring italic = createJavaString(env, it->second->Italic);
jstring boldItalic = createJavaString(env, it->second->BoldItalic); jstring boldItalic = createJavaString(env, it->second->BoldItalic);
AndroidUtil::Method_NativeBookModel_registerFontEntry->call( AndroidUtil::Method_NativeBookModel_registerFontEntry->call(
javaModel, family, normal, bold, italic, boldItalic javaModel, family.j(), normal, bold, italic, boldItalic
); );
if (boldItalic != 0) env->DeleteLocalRef(boldItalic); if (boldItalic != 0) env->DeleteLocalRef(boldItalic);
if (italic != 0) env->DeleteLocalRef(italic); if (italic != 0) env->DeleteLocalRef(italic);
if (bold != 0) env->DeleteLocalRef(bold); if (bold != 0) env->DeleteLocalRef(bold);
if (normal != 0) env->DeleteLocalRef(normal); if (normal != 0) env->DeleteLocalRef(normal);
env->DeleteLocalRef(family);
} }
return 0; return 0;

View file

@ -231,10 +231,9 @@ void BookReader::addImage(const std::string &id, shared_ptr<const ZLImage> image
JNIEnv *env = AndroidUtil::getEnv(); JNIEnv *env = AndroidUtil::getEnv();
jobject javaImage = AndroidUtil::createJavaImage(env, (const ZLFileImage&)*image); jobject javaImage = AndroidUtil::createJavaImage(env, (const ZLFileImage&)*image);
jstring javaId = AndroidUtil::createJavaString(env, id); JString javaId(env, id);
AndroidUtil::Method_NativeBookModel_addImage->call(myModel.myJavaModel, javaId, javaImage); AndroidUtil::Method_NativeBookModel_addImage->call(myModel.myJavaModel, javaId.j(), javaImage);
env->DeleteLocalRef(javaId);
env->DeleteLocalRef(javaImage); env->DeleteLocalRef(javaImage);
} }

View file

@ -218,10 +218,8 @@ bool AndroidUtil::init(JavaVM* jvm) {
} }
jobject AndroidUtil::createJavaFile(JNIEnv *env, const std::string &path) { jobject AndroidUtil::createJavaFile(JNIEnv *env, const std::string &path) {
jstring javaPath = createJavaString(env, path); JString javaPath(env, path, false);
jobject javaFile = StaticMethod_ZLFile_createFileByPath->call(javaPath); return StaticMethod_ZLFile_createFileByPath->call(javaPath.j());
env->DeleteLocalRef(javaPath);
return javaFile;
} }
jobject AndroidUtil::createJavaEncryptionInfo(JNIEnv *env, shared_ptr<FileEncryptionInfo> info) { jobject AndroidUtil::createJavaEncryptionInfo(JNIEnv *env, shared_ptr<FileEncryptionInfo> info) {
@ -229,25 +227,18 @@ jobject AndroidUtil::createJavaEncryptionInfo(JNIEnv *env, shared_ptr<FileEncryp
return 0; return 0;
} }
jstring uri = createJavaString(env, info->Uri); JString uri(env, info->Uri, false);
jstring method = createJavaString(env, info->Method); JString method(env, info->Method, false);
jstring algorithm = createJavaString(env, info->Algorithm); JString algorithm(env, info->Algorithm, false);
jstring contentId = createJavaString(env, info->ContentId); JString contentId(env, info->ContentId, false);
jobject javaInfo = Constructor_FileEncryptionInfo->call(uri, method, algorithm, contentId); return Constructor_FileEncryptionInfo->call(uri.j(), method.j(), algorithm.j(), contentId.j());
env->DeleteLocalRef(contentId);
env->DeleteLocalRef(algorithm);
env->DeleteLocalRef(method);
env->DeleteLocalRef(uri);
return javaInfo;
} }
jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) { jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) {
jstring javaMimeType = createJavaString(env, image.mimeType()); JString javaMimeType(env, image.mimeType());
jobject javaFile = createJavaFile(env, image.file().path()); jobject javaFile = createJavaFile(env, image.file().path());
jstring javaEncoding = createJavaString(env, image.encoding()); JString javaEncoding(env, image.encoding());
std::vector<jint> offsets, sizes; std::vector<jint> offsets, sizes;
const ZLFileImage::Blocks &blocks = image.blocks(); const ZLFileImage::Blocks &blocks = image.blocks();
@ -261,7 +252,7 @@ jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) {
jobject javaEncryptionInfo = createJavaEncryptionInfo(env, image.encryptionInfo()); jobject javaEncryptionInfo = createJavaEncryptionInfo(env, image.encryptionInfo());
jobject javaImage = Constructor_ZLFileImage->call( jobject javaImage = Constructor_ZLFileImage->call(
javaMimeType, javaFile, javaEncoding, javaMimeType.j(), javaFile, javaEncoding.j(),
javaOffsets, javaSizes, javaEncryptionInfo javaOffsets, javaSizes, javaEncryptionInfo
); );
@ -269,9 +260,7 @@ jobject AndroidUtil::createJavaImage(JNIEnv *env, const ZLFileImage &image) {
env->DeleteLocalRef(javaEncryptionInfo); env->DeleteLocalRef(javaEncryptionInfo);
} }
env->DeleteLocalRef(javaEncoding);
env->DeleteLocalRef(javaFile); env->DeleteLocalRef(javaFile);
env->DeleteLocalRef(javaMimeType);
env->DeleteLocalRef(javaOffsets); env->DeleteLocalRef(javaOffsets);
env->DeleteLocalRef(javaSizes); env->DeleteLocalRef(javaSizes);
@ -288,8 +277,14 @@ std::string AndroidUtil::fromJavaString(JNIEnv *env, jstring from) {
return result; return result;
} }
jstring AndroidUtil::createJavaString(JNIEnv* env, shared_ptr<std::string> str) { JString::JString(JNIEnv* env, const std::string &str, bool emptyIsNull) : myEnv(env) {
return str.isNull() ? 0 : createJavaString(env, *str); myJ = (emptyIsNull && str.empty()) ? 0 : env->NewStringUTF(str.c_str());
}
JString::~JString() {
if (myJ != 0) {
myEnv->DeleteLocalRef(myJ);
}
} }
jstring AndroidUtil::createJavaString(JNIEnv* env, const std::string &str) { jstring AndroidUtil::createJavaString(JNIEnv* env, const std::string &str) {

View file

@ -44,6 +44,22 @@ class ZLFile;
class FileEncryptionInfo; class FileEncryptionInfo;
class ZLFileImage; class ZLFileImage;
class JString {
public:
JString(JNIEnv* env, const std::string &str, bool emptyIsNull = true);
jstring j();
~JString();
private:
JNIEnv *myEnv;
jstring myJ;
private:
JString(const JString&);
const JString& operator = (const JString&);
};
class AndroidUtil { class AndroidUtil {
private: private:
@ -155,7 +171,6 @@ public:
static JNIEnv *getEnv(); static JNIEnv *getEnv();
static std::string fromJavaString(JNIEnv *env, jstring from); static std::string fromJavaString(JNIEnv *env, jstring from);
static jstring createJavaString(JNIEnv* env, shared_ptr<std::string>);
static jstring createJavaString(JNIEnv* env, const std::string &str); static jstring createJavaString(JNIEnv* env, const std::string &str);
static std::string convertNonUtfString(const std::string &str); static std::string convertNonUtfString(const std::string &str);
@ -171,4 +186,6 @@ public:
//static void throwBookReadingException(const std::string &resourceId, const ZLFile &file); //static void throwBookReadingException(const std::string &resourceId, const ZLFile &file);
}; };
inline jstring JString::j() { return myJ; }
#endif /* __ANDROIDUTIL_H__ */ #endif /* __ANDROIDUTIL_H__ */