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:
parent
48cdfee8a2
commit
fdb21b67dc
4 changed files with 71 additions and 83 deletions
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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__ */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue