Wrap all cpp code in a try/catch on create corresponding java exception.

This commit is contained in:
Matthieu Gautier 2023-06-29 17:11:50 +02:00
parent 420794ed48
commit c36a29abc4
23 changed files with 161 additions and 204 deletions

View File

@ -32,19 +32,19 @@
METHOD0(void, allocate) METHOD0(void, allocate)
{ {
SET_PTR(std::make_shared<NATIVE_TYPE>()); SET_PTR(std::make_shared<NATIVE_TYPE>());
} } CATCH_EXCEPTION()
DISPOSE DISPOSE
METHOD(void, update__Lorg_kiwix_libkiwix_Book_2, jobject otherBook) METHOD(void, update__Lorg_kiwix_libkiwix_Book_2, jobject otherBook)
{ {
THIS->update(*getPtr<kiwix::Book>(env, otherBook)); THIS->update(*getPtr<kiwix::Book>(env, otherBook));
} } CATCH_EXCEPTION()
METHOD(void, update__Lorg_kiwix_libzim_Archive_2, jobject archive) METHOD(void, update__Lorg_kiwix_libzim_Archive_2, jobject archive)
{ {
THIS->update(*getPtr<zim::Archive>(env, archive)); THIS->update(*getPtr<zim::Archive>(env, archive));
} } CATCH_EXCEPTION()
GETTER(jstring, getId) GETTER(jstring, getId)
@ -76,7 +76,7 @@ GETTER(jstring, getCategory)
GETTER(jstring, getTags) GETTER(jstring, getTags)
METHOD(jstring, getTagStr, jstring tagName) try { METHOD(jstring, getTagStr, jstring tagName) {
return TO_JNI(THIS->getTagStr(TO_C(tagName))); return TO_JNI(THIS->getTagStr(TO_C(tagName)));
} catch(...) { } catch(...) {
return c2jni<std::string>("", env); return c2jni<std::string>("", env);
@ -97,8 +97,8 @@ METHOD0(jobjectArray, getIllustrations) {
env->SetObjectArrayElement(retArray, index++, wrapper); env->SetObjectArrayElement(retArray, index++, wrapper);
} }
return retArray; return retArray;
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, getIllustration, jint size) { METHOD(jobject, getIllustration, jint size) {
return BUILD_WRAPPER("org/kiwix/libkiwix/Illustration", THIS->getIllustration(TO_C(size))); return BUILD_WRAPPER("org/kiwix/libkiwix/Illustration", THIS->getIllustration(TO_C(size)));
} } CATCH_EXCEPTION(nullptr)

View File

@ -31,7 +31,7 @@
METHOD0(void, setNativeBookmark) METHOD0(void, setNativeBookmark)
{ {
SET_PTR(std::make_shared<NATIVE_TYPE>()); SET_PTR(std::make_shared<NATIVE_TYPE>());
} } CATCH_EXCEPTION()
DISPOSE DISPOSE
@ -49,24 +49,24 @@ GETTER(jstring, getDate)
METHOD(void, setBookId, jstring bookId) { METHOD(void, setBookId, jstring bookId) {
THIS->setBookId(TO_C(bookId)); THIS->setBookId(TO_C(bookId));
} } CATCH_EXCEPTION()
METHOD(void, setBookTitle, jstring bookTitle) { METHOD(void, setBookTitle, jstring bookTitle) {
THIS->setBookTitle(TO_C(bookTitle)); THIS->setBookTitle(TO_C(bookTitle));
} } CATCH_EXCEPTION()
METHOD(void, setUrl, jstring url) { METHOD(void, setUrl, jstring url) {
THIS->setUrl(TO_C(url)); THIS->setUrl(TO_C(url));
} } CATCH_EXCEPTION()
METHOD(void, setTitle, jstring title) { METHOD(void, setTitle, jstring title) {
THIS->setTitle(TO_C(title)); THIS->setTitle(TO_C(title));
} } CATCH_EXCEPTION()
METHOD(void, setLanguage, jstring lang) { METHOD(void, setLanguage, jstring lang) {
THIS->setLanguage(TO_C(lang)); THIS->setLanguage(TO_C(lang));
} } CATCH_EXCEPTION()
METHOD(void, setDate, jstring date) { METHOD(void, setDate, jstring date) {
THIS->setDate(TO_C(date)); THIS->setDate(TO_C(date));
} } CATCH_EXCEPTION()

View File

@ -33,7 +33,7 @@
/* Kiwix Reader JNI functions */ /* Kiwix Reader JNI functions */
METHOD0(void, allocate) { METHOD0(void, allocate) {
SET_PTR(std::make_shared<NATIVE_TYPE>()); SET_PTR(std::make_shared<NATIVE_TYPE>());
} } CATCH_EXCEPTION()
DISPOSE DISPOSE
@ -41,13 +41,13 @@ DISPOSE
METHOD(jobject, name, args_type value) { \ METHOD(jobject, name, args_type value) { \
THIS->name(jni2c(value, env)); \ THIS->name(jni2c(value, env)); \
return thisObj; \ return thisObj; \
} } CATCH_EXCEPTION(nullptr)
#define FORWARDA(name, args_type) \ #define FORWARDA(name, args_type) \
METHOD(jobject, name, jobjectArray value) { \ METHOD(jobject, name, jobjectArray value) { \
THIS->name(jni2c<args_type>(value, env)); \ THIS->name(jni2c<args_type>(value, env)); \
return thisObj; \ return thisObj; \
} } CATCH_EXCEPTION(nullptr)

View File

@ -32,22 +32,22 @@
METHOD0(void, dispose) METHOD0(void, dispose)
{ {
dispose<NATIVE_TYPE>(env, thisObj); dispose<NATIVE_TYPE>(env, thisObj);
} } CATCH_EXCEPTION()
METHOD0(jint, width) { METHOD0(jint, width) {
return TO_JNI(THIS->width); return TO_JNI(THIS->width);
} } CATCH_EXCEPTION(0)
METHOD0(jint, height) { METHOD0(jint, height) {
return TO_JNI(THIS->height); return TO_JNI(THIS->height);
} } CATCH_EXCEPTION(0)
METHOD0(jstring, mimeType) { METHOD0(jstring, mimeType) {
return TO_JNI(THIS->mimeType); return TO_JNI(THIS->mimeType);
} } CATCH_EXCEPTION(nullptr)
METHOD0(jstring, url) { METHOD0(jstring, url) {
return TO_JNI(THIS->url); return TO_JNI(THIS->url);
} } CATCH_EXCEPTION(nullptr)
GETTER(jstring, getData) GETTER(jstring, getData)

View File

@ -28,11 +28,9 @@
#include "zim/tools.h" #include "zim/tools.h"
JNIEXPORT void JNICALL Java_org_kiwix_kiwixlib_JNIICU_setDataDirectory( JNIEXPORT void JNICALL Java_org_kiwix_kiwixlib_JNIICU_setDataDirectory(
JNIEnv* env, jclass kclass, jstring dirStr) JNIEnv* env, jclass kclass, jstring dirStr) try
{ {
try {
zim::setICUDataDirectory(TO_C(dirStr)); zim::setICUDataDirectory(TO_C(dirStr));
} catch (...) { } catch(...) {
std::cerr << "Unable to set data directory " << TO_C(dirStr) << std::endl; throwException(env, "java/lang/Exception", "Unable to set data directory");
}
} }

View File

@ -34,15 +34,11 @@
/* Kiwix Reader JNI functions */ /* Kiwix Reader JNI functions */
METHOD(void, setNativeServer, jobject jLibrary) METHOD(void, setNativeServer, jobject jLibrary)
{ {
LOG("Attempting to create server");
try {
auto library = getPtr<kiwix::Library>(env, jLibrary); auto library = getPtr<kiwix::Library>(env, jLibrary);
SET_PTR(std::make_shared<NATIVE_TYPE>(library.get())); SET_PTR(std::make_shared<NATIVE_TYPE>(library.get()));
} catch (std::exception& e) { } catch (std::exception& e) {
LOG("Error creating the server"); throwException(env, "java/lang/Exception", "Error creating the server");
LOG("%s", e.what()); } CATCH_EXCEPTION()
}
}
DISPOSE DISPOSE
@ -51,39 +47,39 @@ DISPOSE
METHOD(void, setRoot, jstring root) METHOD(void, setRoot, jstring root)
{ {
THIS->setRoot(TO_C(root)); THIS->setRoot(TO_C(root));
} } CATCH_EXCEPTION()
METHOD(void, setAddress, jstring address) METHOD(void, setAddress, jstring address)
{ {
THIS->setAddress(TO_C(address)); THIS->setAddress(TO_C(address));
} } CATCH_EXCEPTION()
METHOD(void, setPort, int port) METHOD(void, setPort, int port)
{ {
THIS->setPort(TO_C(port)); THIS->setPort(TO_C(port));
} } CATCH_EXCEPTION()
METHOD(void, setNbThreads, int threads) METHOD(void, setNbThreads, int threads)
{ {
THIS->setNbThreads(TO_C(threads)); THIS->setNbThreads(TO_C(threads));
} } CATCH_EXCEPTION()
METHOD(void, setTaskbar, jboolean withTaskbar, jboolean withLibraryButton) METHOD(void, setTaskbar, jboolean withTaskbar, jboolean withLibraryButton)
{ {
THIS->setTaskbar(TO_C(withTaskbar), TO_C(withLibraryButton)); THIS->setTaskbar(TO_C(withTaskbar), TO_C(withLibraryButton));
} } CATCH_EXCEPTION()
METHOD(void, setBlockExternalLinks, jboolean blockExternalLinks) METHOD(void, setBlockExternalLinks, jboolean blockExternalLinks)
{ {
THIS->setBlockExternalLinks(TO_C(blockExternalLinks)); THIS->setBlockExternalLinks(TO_C(blockExternalLinks));
} } CATCH_EXCEPTION()
METHOD0(jboolean, start) METHOD0(jboolean, start)
{ {
return THIS->start(); return THIS->start();
} } CATCH_EXCEPTION(false)
METHOD0(void, stop) METHOD0(void, stop)
{ {
THIS->stop(); THIS->stop();
} } CATCH_EXCEPTION()

View File

@ -32,7 +32,7 @@
METHOD0(void, setNativeHandler) METHOD0(void, setNativeHandler)
{ {
SET_PTR(std::make_shared<NATIVE_TYPE>()); SET_PTR(std::make_shared<NATIVE_TYPE>());
} } CATCH_EXCEPTION()
DISPOSE DISPOSE
@ -41,43 +41,41 @@ METHOD(jboolean, addBook, jobject book)
{ {
auto cBook = getPtr<kiwix::Book>(env, book); auto cBook = getPtr<kiwix::Book>(env, book);
try {
return THIS->addBook(*cBook); return THIS->addBook(*cBook);
} catch (std::exception& e) { } CATCH_EXCEPTION(false)
LOG("Unable to add the book");
LOG("%s", e.what()); }
return false;
}
METHOD(jobject, getBookById, jstring id) { METHOD(jobject, getBookById, jstring id) {
return BUILD_WRAPPER2("org/kiwix/libkiwix/Book", THIS->getBookById(TO_C(id))); return BUILD_WRAPPER2("org/kiwix/libkiwix/Book", THIS->getBookById(TO_C(id)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, getArchiveById, jstring id) { METHOD(jobject, getArchiveById, jstring id) {
return BUILD_WRAPPER("org/kiwix/libzim/Archive", THIS->getArchiveById(TO_C(id))); auto archive = THIS->getArchiveById(TO_C(id));
} std::cout << "archive is " << archive << std::endl;
return BUILD_WRAPPER2("org/kiwix/libzim/Archive", archive);
} CATCH_EXCEPTION(nullptr)
METHOD(jboolean, removeBookById, jstring id) { METHOD(jboolean, removeBookById, jstring id) {
return TO_JNI(THIS->removeBookById(TO_C(id))); return TO_JNI(THIS->removeBookById(TO_C(id)));
} } CATCH_EXCEPTION(false)
METHOD(jboolean, writeToFile, jstring path) { METHOD(jboolean, writeToFile, jstring path) {
return TO_JNI(THIS->writeToFile(TO_C(path))); return TO_JNI(THIS->writeToFile(TO_C(path)));
} } CATCH_EXCEPTION(false)
METHOD(jboolean, writeBookmarksToFile, jstring path) { METHOD(jboolean, writeBookmarksToFile, jstring path) {
return TO_JNI(THIS->writeBookmarksToFile(TO_C(path))); return TO_JNI(THIS->writeBookmarksToFile(TO_C(path)));
} } CATCH_EXCEPTION(false)
METHOD(jint, getBookCount, jboolean localBooks, jboolean remoteBooks) { METHOD(jint, getBookCount, jboolean localBooks, jboolean remoteBooks) {
return TO_JNI(THIS->getBookCount(TO_C(localBooks), TO_C(remoteBooks))); return TO_JNI(THIS->getBookCount(TO_C(localBooks), TO_C(remoteBooks)));
} } CATCH_EXCEPTION(0)
GETTER(jobjectArray, getBooksIds) GETTER(jobjectArray, getBooksIds)
METHOD(jobjectArray, filter, jobject filterObj) { METHOD(jobjectArray, filter, jobject filterObj) {
auto filter = getPtr<kiwix::Filter>(env, filterObj); auto filter = getPtr<kiwix::Filter>(env, filterObj);
return c2jni(THIS->filter(*filter), env); return c2jni(THIS->filter(*filter), env);
} } CATCH_EXCEPTION(nullptr)
GETTER(jobjectArray, getBooksLanguages) GETTER(jobjectArray, getBooksLanguages)
GETTER(jobjectArray, getBooksCategories) GETTER(jobjectArray, getBooksCategories)
@ -87,11 +85,11 @@ GETTER(jobjectArray, getBooksPublishers)
METHOD(void, addBookmark, jobject bookmark) { METHOD(void, addBookmark, jobject bookmark) {
auto cBookmark = getPtr<kiwix::Bookmark>(env, bookmark); auto cBookmark = getPtr<kiwix::Bookmark>(env, bookmark);
THIS->addBookmark(*cBookmark); THIS->addBookmark(*cBookmark);
} } CATCH_EXCEPTION()
METHOD(jboolean, removeBookmark, jstring zimId, jstring url) { METHOD(jboolean, removeBookmark, jstring zimId, jstring url) {
return TO_JNI(THIS->removeBookmark(TO_C(zimId), TO_C(url))); return TO_JNI(THIS->removeBookmark(TO_C(zimId), TO_C(url)));
} } CATCH_EXCEPTION(false)
METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) { METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) {
auto bookmarks = THIS->getBookmarks(TO_C(onlyValidBookmarks)); auto bookmarks = THIS->getBookmarks(TO_C(onlyValidBookmarks));
@ -108,4 +106,4 @@ METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) {
env->SetObjectArrayElement(retArray, index++, wrapper); env->SetObjectArrayElement(retArray, index++, wrapper);
} }
return retArray; return retArray;
} } CATCH_EXCEPTION(nullptr)

View File

@ -32,7 +32,7 @@ METHOD(void, allocate, jobject libraryObj)
{ {
auto lib = getPtr<kiwix::Library>(env, libraryObj); auto lib = getPtr<kiwix::Library>(env, libraryObj);
SET_PTR(std::make_shared<NATIVE_TYPE>(lib.get())); SET_PTR(std::make_shared<NATIVE_TYPE>(lib.get()));
} } CATCH_EXCEPTION()
DISPOSE DISPOSE
@ -41,58 +41,30 @@ METHOD(jboolean, readFile, jstring path)
{ {
auto cPath = TO_C(path); auto cPath = TO_C(path);
try {
return THIS->readFile(cPath); return THIS->readFile(cPath);
} catch (std::exception& e) { } CATCH_EXCEPTION(false)
LOG("Unable to get readFile");
LOG("%s", e.what());
}
return false;
}
METHOD(jboolean, readXml, jstring content, jstring libraryPath) METHOD(jboolean, readXml, jstring content, jstring libraryPath)
{ {
auto cContent = TO_C(content); auto cContent = TO_C(content);
auto cPath = TO_C(libraryPath); auto cPath = TO_C(libraryPath);
try {
return THIS->readXml(cContent, false, cPath); return THIS->readXml(cContent, false, cPath);
} catch (std::exception& e) { } CATCH_EXCEPTION(false)
LOG("Unable to get ZIM id");
LOG("%s", e.what());
}
return false;
}
METHOD(jboolean, readOpds, jstring content, jstring urlHost) METHOD(jboolean, readOpds, jstring content, jstring urlHost)
{ {
auto cContent = TO_C(content); auto cContent = TO_C(content);
auto cUrl = TO_C(urlHost); auto cUrl = TO_C(urlHost);
try {
return THIS->readOpds(cContent, cUrl); return THIS->readOpds(cContent, cUrl);
} catch (std::exception& e) { } CATCH_EXCEPTION(false)
LOG("Unable to get ZIM id");
LOG("%s", e.what());
}
return false;
}
METHOD(jboolean, readBookmarkFile, jstring path) METHOD(jboolean, readBookmarkFile, jstring path)
{ {
auto cPath = TO_C(path); auto cPath = TO_C(path);
try {
return THIS->readBookmarkFile(cPath); return THIS->readBookmarkFile(cPath);
} catch (std::exception& e) { } CATCH_EXCEPTION(false)
LOG("Unable to get ZIM id");
LOG("%s", e.what());
}
return false;
}
METHOD(jstring, addBookFromPath, jstring pathToOpen, jstring pathToSave, jstring url, jboolean checkMetaData) METHOD(jstring, addBookFromPath, jstring pathToOpen, jstring pathToSave, jstring url, jboolean checkMetaData)
{ {
@ -101,15 +73,10 @@ METHOD(jstring, addBookFromPath, jstring pathToOpen, jstring pathToSave, jstring
auto cUrl = TO_C(url); auto cUrl = TO_C(url);
jstring id = NULL; jstring id = NULL;
try {
auto cId = THIS->addBookFromPathAndGetId(cPathToOpen, cPathToSave, cUrl, checkMetaData); auto cId = THIS->addBookFromPathAndGetId(cPathToOpen, cPathToSave, cUrl, checkMetaData);
if ( !cId.empty() ) { if ( !cId.empty() ) {
id = c2jni(cId, env); id = c2jni(cId, env);
} }
} catch (std::exception& e) {
LOG("Unable to get ZIM file size");
LOG("%s", e.what());
}
return id; return id;
} } CATCH_EXCEPTION(0)

View File

@ -40,15 +40,9 @@ METHOD(void, setNativeArchive, jstring filename)
{ {
std::string cPath = TO_C(filename); std::string cPath = TO_C(filename);
LOG("Attempting to create reader with: %s", cPath.c_str());
try {
auto archive = std::make_shared<zim::Archive>(cPath); auto archive = std::make_shared<zim::Archive>(cPath);
SET_PTR(archive); SET_PTR(archive);
} catch (std::exception& e) { } CATCH_EXCEPTION()
LOG("Error opening ZIM file");
LOG("%s", e.what());
}
}
namespace namespace
{ {
@ -71,7 +65,7 @@ int jni2fd(const jobject& fdObj, JNIEnv* env)
} // unnamed namespace } // unnamed namespace
JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD( JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD(
JNIEnv* env, jobject thisObj, jobject fdObj) JNIEnv* env, jobject thisObj, jobject fdObj) try
{ {
#ifndef _WIN32 #ifndef _WIN32
int fd = jni2fd(fdObj, env); int fd = jni2fd(fdObj, env);
@ -88,10 +82,10 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD(
jclass exception = env->FindClass("java/lang/UnsupportedOperationException"); jclass exception = env->FindClass("java/lang/UnsupportedOperationException");
env->ThrowNew(exception, "org.kiwix.libzim.Archive.setNativeArchiveByFD() is not supported under Windows"); env->ThrowNew(exception, "org.kiwix.libzim.Archive.setNativeArchiveByFD() is not supported under Windows");
#endif #endif
} } CATCH_EXCEPTION()
JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded( JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded(
JNIEnv* env, jobject thisObj, jobject fdObj, jlong offset, jlong size) JNIEnv* env, jobject thisObj, jobject fdObj, jlong offset, jlong size) try
{ {
#ifndef _WIN32 #ifndef _WIN32
int fd = jni2fd(fdObj, env); int fd = jni2fd(fdObj, env);
@ -108,7 +102,7 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded(
jclass exception = env->FindClass("java/lang/UnsupportedOperationException"); jclass exception = env->FindClass("java/lang/UnsupportedOperationException");
env->ThrowNew(exception, "org.kiwix.libzim.Archive.setNativeArchiveEmbedded() is not supported under Windows"); env->ThrowNew(exception, "org.kiwix.libzim.Archive.setNativeArchiveEmbedded() is not supported under Windows");
#endif #endif
} } CATCH_EXCEPTION()
DISPOSE DISPOSE
@ -121,65 +115,65 @@ GETTER(jint, getMediaCount)
METHOD0(jstring, getUuid) { METHOD0(jstring, getUuid) {
return TO_JNI(std::string(THIS->getUuid())); return TO_JNI(std::string(THIS->getUuid()));
} } CATCH_EXCEPTION(nullptr)
METHOD(jstring, getMetadata, jstring name) { METHOD(jstring, getMetadata, jstring name) {
return TO_JNI(THIS->getMetadata(TO_C(name))); return TO_JNI(THIS->getMetadata(TO_C(name)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, getMetadataItem, jstring name) { METHOD(jobject, getMetadataItem, jstring name) {
return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getMetadataItem(TO_C(name))); return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getMetadataItem(TO_C(name)));
} } CATCH_EXCEPTION(nullptr)
GETTER(jobjectArray, getMetadataKeys) GETTER(jobjectArray, getMetadataKeys)
METHOD(jobject, getIllustrationItem, jint size) { METHOD(jobject, getIllustrationItem, jint size) {
return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getIllustrationItem(TO_C(size))); return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getIllustrationItem(TO_C(size)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jboolean, hasIllustration, jint size) { METHOD(jboolean, hasIllustration, jint size) {
return TO_JNI(THIS->hasIllustration(TO_C(size))); return TO_JNI(THIS->hasIllustration(TO_C(size)));
} } CATCH_EXCEPTION(false)
GETTER(jlongArray, getIllustrationSizes) GETTER(jlongArray, getIllustrationSizes)
METHOD(jobject, getEntryByPath__Ljava_lang_String_2, jstring path) { METHOD(jobject, getEntryByPath__Ljava_lang_String_2, jstring path) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByPath(TO_C(path))); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByPath(TO_C(path)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, getEntryByPath__I, jint index) { METHOD(jobject, getEntryByPath__I, jint index) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByPath(TO_C(index))); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByPath(TO_C(index)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jboolean, hasEntryByPath, jstring path) { METHOD(jboolean, hasEntryByPath, jstring path) {
return TO_JNI(THIS->hasEntryByPath(TO_C(path))); return TO_JNI(THIS->hasEntryByPath(TO_C(path)));
} } CATCH_EXCEPTION(false)
METHOD(jobject, getEntryByTitle__Ljava_lang_String_2, jstring title) { METHOD(jobject, getEntryByTitle__Ljava_lang_String_2, jstring title) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByTitle(TO_C(title))); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByTitle(TO_C(title)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, getEntryByTitle__I, jint index) { METHOD(jobject, getEntryByTitle__I, jint index) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByTitle(TO_C(index))); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByTitle(TO_C(index)));
} } CATCH_EXCEPTION(nullptr)
METHOD(jboolean, hasEntryByTitle, jstring title) { METHOD(jboolean, hasEntryByTitle, jstring title) {
return TO_JNI(THIS->hasEntryByTitle(TO_C(title))); return TO_JNI(THIS->hasEntryByTitle(TO_C(title)));
} } CATCH_EXCEPTION(false)
METHOD(jobject, getEntryByClusterOrder, jint index) { METHOD(jobject, getEntryByClusterOrder, jint index) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByClusterOrder(TO_C(index))); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getEntryByClusterOrder(TO_C(index)));
} } CATCH_EXCEPTION(nullptr)
METHOD0(jobject, getMainEntry) { METHOD0(jobject, getMainEntry) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getMainEntry()); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getMainEntry());
} } CATCH_EXCEPTION(nullptr)
GETTER(jboolean, hasMainEntry) GETTER(jboolean, hasMainEntry)
METHOD0(jobject, getRandomEntry) { METHOD0(jobject, getRandomEntry) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getRandomEntry()); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getRandomEntry());
} } CATCH_EXCEPTION(nullptr)
GETTER(jboolean, hasFulltextIndex) GETTER(jboolean, hasFulltextIndex)
GETTER(jboolean, hasTitleIndex) GETTER(jboolean, hasTitleIndex)
@ -202,7 +196,7 @@ METHOD0(jobject, iterByPath) {
auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::pathOrder>>(range.end()); auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::pathOrder>>(range.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)
METHOD0(jobject, iterByTitle) { METHOD0(jobject, iterByTitle) {
auto range = THIS->iterByTitle(); auto range = THIS->iterByTitle();
@ -214,7 +208,7 @@ METHOD0(jobject, iterByTitle) {
auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::titleOrder>>(range.end()); auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::titleOrder>>(range.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)
METHOD0(jobject, iterEfficient) { METHOD0(jobject, iterEfficient) {
auto range = THIS->iterEfficient(); auto range = THIS->iterEfficient();
@ -226,7 +220,7 @@ METHOD0(jobject, iterEfficient) {
auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::efficientOrder>>(range.end()); auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::efficientOrder>>(range.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, findByPath, jstring path) { METHOD(jobject, findByPath, jstring path) {
auto range = THIS->findByPath(TO_C(path)); auto range = THIS->findByPath(TO_C(path));
@ -238,7 +232,7 @@ METHOD(jobject, findByPath, jstring path) {
auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::pathOrder>>(range.end()); auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::pathOrder>>(range.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, findByTitle, jstring title) { METHOD(jobject, findByTitle, jstring title) {
auto range = THIS->findByTitle(TO_C(title)); auto range = THIS->findByTitle(TO_C(title));
@ -250,4 +244,4 @@ METHOD(jobject, findByTitle, jstring title) {
auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::titleOrder>>(range.end()); auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::titleOrder>>(range.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)

View File

@ -37,5 +37,5 @@ DISPOSE
METHOD0(jbyteArray, getData) { METHOD0(jbyteArray, getData) {
return cArray2jni(THIS->data(), THIS->size(), env); return cArray2jni(THIS->data(), THIS->size(), env);
} } CATCH_EXCEPTION(nullptr)
GETTER(jlong, size) GETTER(jlong, size)

View File

@ -42,12 +42,12 @@ GETTER(jstring, getTitle)
GETTER(jstring, getPath) GETTER(jstring, getPath)
METHOD(jobject, getItem, jboolean follow) { METHOD(jobject, getItem, jboolean follow) {
return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getItem(TO_C(follow))); return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getItem(TO_C(follow)));
} } CATCH_EXCEPTION(nullptr)
METHOD0(jobject, getRedirect) { METHOD0(jobject, getRedirect) {
return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getRedirect()); return BUILD_WRAPPER("org/kiwix/libzim/Item", THIS->getRedirect());
} } CATCH_EXCEPTION(nullptr)
METHOD0(jobject, getRedirectEntry) { METHOD0(jobject, getRedirectEntry) {
return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getRedirectEntry()); return BUILD_WRAPPER("org/kiwix/libzim/Entry", THIS->getRedirectEntry());
} } CATCH_EXCEPTION(nullptr)

View File

@ -60,7 +60,7 @@ METHOD0(void, dispose)
dispose<EFFICIENT_NATIVE_TYPE>(env, thisObj); dispose<EFFICIENT_NATIVE_TYPE>(env, thisObj);
break; break;
} }
} } CATCH_EXCEPTION()
METHOD0(jboolean, hasNext) { METHOD0(jboolean, hasNext) {
@ -84,7 +84,7 @@ METHOD0(jboolean, hasNext) {
// unreachable!() // unreachable!()
return false; return false;
} }
} } CATCH_EXCEPTION(false)
METHOD0(jobject, next) { METHOD0(jobject, next) {
switch (get_order(env, thisObj)) { switch (get_order(env, thisObj)) {
@ -107,5 +107,5 @@ METHOD0(jobject, next) {
// unreachable!() // unreachable!()
return nullptr; return nullptr;
} }
} } CATCH_EXCEPTION(nullptr)

View File

@ -41,7 +41,7 @@ GETTER(jstring, getMimetype)
METHOD0(jobject, getData) { METHOD0(jobject, getData) {
return BUILD_WRAPPER("org/kiwix/libzim/Blob", THIS->getData()); return BUILD_WRAPPER("org/kiwix/libzim/Blob", THIS->getData());
} } CATCH_EXCEPTION(nullptr)
GETTER(jlong, getSize) GETTER(jlong, getSize)
@ -53,4 +53,4 @@ METHOD0(jobject, getDirectAccessInformation) {
auto cDirectObjInfo = THIS->getDirectAccessInformation(); auto cDirectObjInfo = THIS->getDirectAccessInformation();
setDaiObjValue(cDirectObjInfo.first, cDirectObjInfo.second, directObjInfo, env); setDaiObjValue(cDirectObjInfo.first, cDirectObjInfo.second, directObjInfo, env);
return directObjInfo; return directObjInfo;
} } CATCH_EXCEPTION(nullptr)

View File

@ -36,24 +36,19 @@
METHOD(void, setNativeQuery, jstring query) METHOD(void, setNativeQuery, jstring query)
{ {
auto cQuery = TO_C(query); auto cQuery = TO_C(query);
try { auto zimQuery = std::make_shared<NATIVE_TYPE>(cQuery);
auto query = std::make_shared<NATIVE_TYPE>(cQuery); SET_PTR(zimQuery);
SET_PTR(query); } CATCH_EXCEPTION()
} catch (std::exception& e) {
LOG("Cannot create query");
LOG("%s", e.what());
}
}
DISPOSE DISPOSE
METHOD(jobject, setQuery, jstring query) { METHOD(jobject, setQuery, jstring query) {
THIS->setQuery(TO_C(query)); THIS->setQuery(TO_C(query));
return thisObj; return thisObj;
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, setGeorange, jfloat latitude, jfloat longitude, jfloat distance) { METHOD(jobject, setGeorange, jfloat latitude, jfloat longitude, jfloat distance) {
THIS->setGeorange(TO_C(latitude), TO_C(longitude), TO_C(distance)); THIS->setGeorange(TO_C(latitude), TO_C(longitude), TO_C(distance));
return thisObj; return thisObj;
} } CATCH_EXCEPTION(nullptr)

View File

@ -44,6 +44,6 @@ METHOD(jobject, getResults, jint start, jint maxResults) {
auto end_ptr = std::make_shared<zim::SearchIterator>(results.end()); auto end_ptr = std::make_shared<zim::SearchIterator>(results.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)
GETTER(jlong, getEstimatedMatches) GETTER(jlong, getEstimatedMatches)

View File

@ -41,7 +41,7 @@ METHOD0(void, dispose)
// Delete end iterator // Delete end iterator
dispose<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd"); dispose<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd");
dispose<NATIVE_TYPE>(env, thisObj); dispose<NATIVE_TYPE>(env, thisObj);
} } CATCH_EXCEPTION()
GETTER(jstring, getPath) GETTER(jstring, getPath)
@ -54,16 +54,16 @@ GETTER(jint, getSize)
METHOD0(jstring, getZimId) { METHOD0(jstring, getZimId) {
return TO_JNI(std::string(THIS->getZimId())); return TO_JNI(std::string(THIS->getZimId()));
} } CATCH_EXCEPTION(0)
METHOD0(jboolean, hasNext) { METHOD0(jboolean, hasNext) {
auto end = getPtr<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd"); auto end = getPtr<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd");
return *THIS != *end; return *THIS != *end;
} } CATCH_EXCEPTION(false)
METHOD0(jobject, next) { METHOD0(jobject, next) {
zim::Entry entry = **THIS; zim::Entry entry = **THIS;
(*THIS)++; (*THIS)++;
return BUILD_WRAPPER("org/kiwix/libzim/Entry", entry); return BUILD_WRAPPER("org/kiwix/libzim/Entry", entry);
} } CATCH_EXCEPTION(nullptr)

View File

@ -36,14 +36,9 @@
METHOD(void, setNativeSearcher, jobject archive) METHOD(void, setNativeSearcher, jobject archive)
{ {
auto cArchive = getPtr<zim::Archive>(env, archive); auto cArchive = getPtr<zim::Archive>(env, archive);
try {
auto searcher = std::make_shared<zim::Searcher>(*cArchive); auto searcher = std::make_shared<zim::Searcher>(*cArchive);
SET_PTR(searcher); SET_PTR(searcher);
} catch (std::exception& e) { } CATCH_EXCEPTION()
LOG("Cannot create searcher");
LOG("%s", e.what());
}
}
METHOD(void, setNativeSearcherMulti, jobjectArray archives) METHOD(void, setNativeSearcherMulti, jobjectArray archives)
{ {
@ -54,14 +49,9 @@ METHOD(void, setNativeSearcherMulti, jobjectArray archives)
auto cArchive = getPtr<zim::Archive>(env, archive); auto cArchive = getPtr<zim::Archive>(env, archive);
cArchives.push_back(*cArchive); cArchives.push_back(*cArchive);
} }
try {
auto searcher = std::make_shared<zim::Searcher>(cArchives); auto searcher = std::make_shared<zim::Searcher>(cArchives);
SET_PTR(searcher); SET_PTR(searcher);
} catch (std::exception& e) { } CATCH_EXCEPTION()
LOG("Cannot create searcher");
LOG("%s", e.what());
}
}
DISPOSE DISPOSE
@ -69,14 +59,14 @@ METHOD(jobject, addArchive, jobject archive) {
auto cArchive = getPtr<zim::Archive>(env, archive); auto cArchive = getPtr<zim::Archive>(env, archive);
THIS->addArchive(*cArchive); THIS->addArchive(*cArchive);
return thisObj; return thisObj;
} } CATCH_EXCEPTION(nullptr)
METHOD(jobject, search, jobject query) { METHOD(jobject, search, jobject query) {
auto cQuery = getPtr<zim::Query>(env, query); auto cQuery = getPtr<zim::Query>(env, query);
return BUILD_WRAPPER("org/kiwix/libzim/Search", THIS->search(*cQuery)); return BUILD_WRAPPER("org/kiwix/libzim/Search", THIS->search(*cQuery));
} } CATCH_EXCEPTION(nullptr)
METHOD(void, setVerbose, jboolean verbose) { METHOD(void, setVerbose, jboolean verbose) {
THIS->setVerbose(TO_C(verbose)); THIS->setVerbose(TO_C(verbose));
} } CATCH_EXCEPTION()

View File

@ -39,18 +39,18 @@ METHOD0(void, dispose)
// Delete end iterator // Delete end iterator
dispose<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd"); dispose<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd");
dispose<NATIVE_TYPE>(env, thisObj); dispose<NATIVE_TYPE>(env, thisObj);
} } CATCH_EXCEPTION()
METHOD0(jboolean, hasNext) { METHOD0(jboolean, hasNext) {
NATIVE_TYPE next(*THIS); NATIVE_TYPE next(*THIS);
next++; next++;
auto end = getPtr<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd"); auto end = getPtr<NATIVE_TYPE>(env, thisObj, "nativeHandleEnd");
return next == *end; return next == *end;
} } CATCH_EXCEPTION(false)
METHOD0(jobject, next) { METHOD0(jobject, next) {
zim::SuggestionItem item = **THIS; zim::SuggestionItem item = **THIS;
(*THIS)++; (*THIS)++;
return BUILD_WRAPPER("org/kiwix/libzim/SuggestionItem", item); return BUILD_WRAPPER("org/kiwix/libzim/SuggestionItem", item);
} } CATCH_EXCEPTION(nullptr)

View File

@ -44,6 +44,6 @@ METHOD(jobject, getResults, jint start, jint maxResults) {
auto end_ptr = std::make_shared<zim::SuggestionIterator>(results.end()); auto end_ptr = std::make_shared<zim::SuggestionIterator>(results.end());
setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd"); setPtr(env, obj, std::move(end_ptr), "nativeHandleEnd");
return obj; return obj;
} } CATCH_EXCEPTION(nullptr)
GETTER(jlong, getEstimatedMatches) GETTER(jlong, getEstimatedMatches)

View File

@ -36,22 +36,17 @@
METHOD(void, setNativeSearcher, jobject archive) METHOD(void, setNativeSearcher, jobject archive)
{ {
auto cArchive = getPtr<zim::Archive>(env, archive); auto cArchive = getPtr<zim::Archive>(env, archive);
try {
auto searcher = std::make_shared<zim::SuggestionSearcher>(*cArchive); auto searcher = std::make_shared<zim::SuggestionSearcher>(*cArchive);
SET_PTR(searcher); SET_PTR(searcher);
} catch (std::exception& e) { } CATCH_EXCEPTION()
LOG("Cannot create searcher");
LOG("%s", e.what());
}
}
DISPOSE DISPOSE
METHOD(jobject, suggest, jstring query) { METHOD(jobject, suggest, jstring query) {
return BUILD_WRAPPER("org/kiwix/libzim/SuggestionSearch", THIS->suggest(TO_C(query))); return BUILD_WRAPPER("org/kiwix/libzim/SuggestionSearch", THIS->suggest(TO_C(query)));
} } CATCH_EXCEPTION(nullptr)
METHOD(void, setVerbose, jboolean verbose) { METHOD(void, setVerbose, jboolean verbose) {
THIS->setVerbose(TO_C(verbose)); THIS->setVerbose(TO_C(verbose));
} } CATCH_EXCEPTION()

View File

@ -29,14 +29,34 @@
#define METHOD0(retType, name) \ #define METHOD0(retType, name) \
JNIEXPORT retType JNICALL BUILD_METHOD(TYPENAME, name) ( \ JNIEXPORT retType JNICALL BUILD_METHOD(TYPENAME, name) ( \
JNIEnv* env, jobject thisObj) JNIEnv* env, jobject thisObj) try
#define METHOD(retType, name, ...) \ #define METHOD(retType, name, ...) \
JNIEXPORT retType JNICALL BUILD_METHOD(TYPENAME ,name) ( \ JNIEXPORT retType JNICALL BUILD_METHOD(TYPENAME ,name) ( \
JNIEnv* env, jobject thisObj, __VA_ARGS__) JNIEnv* env, jobject thisObj, __VA_ARGS__) try
#define GETTER(retType, name) METHOD0(retType, name) { \ #define GETTER(retType, name) METHOD0(retType, name) { \
return TO_JNI(THIS->name()); \ return TO_JNI(THIS->name()); \
} } CATCH_EXCEPTION(0)
#define DISPOSE METHOD0(void, dispose) { dispose<NATIVE_TYPE>(env, thisObj); } #define DISPOSE METHOD0(void, dispose) { dispose<NATIVE_TYPE>(env, thisObj); } CATCH_EXCEPTION()
#include <zim/error.h>
#define CATCH_EXCEPTION(RET) \
catch(const zim::ZimFileFormatError& e) { \
throwException(env, "org/kiwix/libzim/ZimFileFormatException", "Zim file format error."); \
return RET; \
} catch(const zim::InvalidType& e) { \
throwException(env, "java/lang/Exception", "Invalid type."); \
return RET; \
} catch(const zim::EntryNotFound& e) { \
throwException(env, "java/lang/Exception", "Entry Not Found."); \
return RET; \
} catch (const std::ios_base::failure& e) { \
throwException(env, "java/io/IOException", e.what()); \
return RET; \
} catch(const std::exception& e) { \
throwException(env, "java/lang/Exception", e.what()); \
return RET; \
}

View File

@ -400,4 +400,8 @@ inline void setDaiObjValue(const std::string& filename, const long offset,
env->SetLongField(obj, offsetFid, offset); env->SetLongField(obj, offsetFid, offset);
} }
inline int throwException(JNIEnv* env, const char* exception, const char* message) {
return env->ThrowNew(env->FindClass(exception), message);
}
#endif // _ANDROID_JNI_UTILS_H #endif // _ANDROID_JNI_UTILS_H

View File

@ -169,8 +169,8 @@ public class test {
try { try {
TestArchive archive1 = new TestArchive(zimFile); TestArchive archive1 = new TestArchive(zimFile);
fail("ERROR: Archive created with invalid Zim file!"); fail("ERROR: Archive created with invalid Zim file!");
} catch (ZimFileFormatException zimFileFormatException) { } catch (Exception e) {
assertEquals("Cannot open zimfile " + zimFile, zimFileFormatException.getMessage()); assertEquals("error 2 opening file \"" + zimFile, e.getMessage());
} }
} }