3636#include < macros.h>
3737
3838/* Kiwix Reader JNI functions */
39- METHOD (void , setNativeArchive , jstring filename)
39+ METHOD (jobject, buildNativeArchive , jstring filename)
4040{
4141 std::string cPath = TO_C (filename);
4242
4343 LOG (" Attempting to create reader with: %s" , cPath.c_str ());
44- try {
45- auto archive = std::make_shared<zim::Archive>(cPath);
46- SET_PTR (archive);
47- } catch (std::exception& e) {
48- LOG (" Error opening ZIM file" );
49- LOG (" %s" , e.what ());
50- }
44+ auto archive = std::make_shared<NATIVE_TYPE>(cPath);
45+ return NEW_RESOURCE (archive);
5146}
5247
5348namespace
@@ -70,7 +65,7 @@ int jni2fd(const jobject& fdObj, JNIEnv* env)
7065
7166} // unnamed namespace
7267
73- JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD (
68+ JNIEXPORT jobject JNICALL Java_org_kiwix_libzim_Archive_buildNativeArchiveByFD (
7469 JNIEnv* env, jobject thisObj, jobject fdObj)
7570{
7671#ifndef _WIN32
@@ -79,18 +74,16 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD(
7974 LOG (" Attempting to create reader with fd: %d" , fd);
8075 try {
8176 auto archive = std::make_shared<zim::Archive>(fd);
82- SET_PTR (archive);
83- } catch (std::exception& e) {
84- LOG (" Error opening ZIM file" );
85- LOG (" %s" , e.what ());
86- }
77+ return NEW_RESOURCE (archive);
78+ } CATCH (" Error opening ZIM file" )
8779#else
8880 jclass exception = env->FindClass (" java/lang/UnsupportedOperationException" );
8981 env->ThrowNew (exception, " org.kiwix.libzim.Archive.setNativeArchiveByFD() is not supported under Windows" );
9082#endif
83+ return nullptr ;
9184}
9285
93- JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded (
86+ JNIEXPORT jobject JNICALL Java_org_kiwix_libzim_Archive_buildNativeArchiveEmbedded (
9487 JNIEnv* env, jobject thisObj, jobject fdObj, jlong offset, jlong size)
9588{
9689#ifndef _WIN32
@@ -99,19 +92,15 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded(
9992 LOG (" Attempting to create reader with fd: %d" , fd);
10093 try {
10194 auto archive = std::make_shared<zim::Archive>(fd, offset, size);
102- SET_PTR (archive);
103- } catch (std::exception& e) {
104- LOG (" Error opening ZIM file" );
105- LOG (" %s" , e.what ());
106- }
95+ return NEW_RESOURCE (archive);
96+ } CATCH (" Error opening ZIM file" )
10797#else
10898 jclass exception = env->FindClass (" java/lang/UnsupportedOperationException" );
10999 env->ThrowNew (exception, " org.kiwix.libzim.Archive.setNativeArchiveEmbedded() is not supported under Windows" );
110100#endif
101+ return nullptr ;
111102}
112103
113- DISPOSE
114-
115104GETTER (jstring, getFilename)
116105GETTER(jlong, getFilesize)
117106GETTER(jint, getAllEntryCount)
@@ -128,13 +117,13 @@ METHOD(jstring, getMetadata, jstring name) {
128117}
129118
130119METHOD (jobject, getMetadataItem, jstring name) {
131- return BUILD_WRAPPER (" org/kiwix/libzim/Item " , THIS->getMetadataItem (TO_C (name)));
120+ return BUILD_WRAPPER (THIS->getMetadataItem (TO_C (name)));
132121}
133122
134123GETTER (jobjectArray, getMetadataKeys)
135124
136125METHOD(jobject, getIllustrationItem, jint size) {
137- return BUILD_WRAPPER (" org/kiwix/libzim/Item " , THIS->getIllustrationItem (TO_C (size)));
126+ return BUILD_WRAPPER (THIS->getIllustrationItem (TO_C (size)));
138127}
139128
140129METHOD (jboolean, hasIllustration, jint size) {
@@ -144,41 +133,41 @@ METHOD(jboolean, hasIllustration, jint size) {
144133GETTER (jlongArray, getIllustrationSizes)
145134
146135METHOD(jobject, getEntryByPath__Ljava_lang_String_2, jstring path) {
147- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getEntryByPath (TO_C (path)));
136+ return BUILD_WRAPPER (THIS->getEntryByPath (TO_C (path)));
148137}
149138
150139METHOD (jobject, getEntryByPath__I, jint index) {
151- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getEntryByPath (TO_C (index)));
140+ return BUILD_WRAPPER (THIS->getEntryByPath (TO_C (index)));
152141}
153142
154143METHOD (jboolean, hasEntryByPath, jstring path) {
155144 return TO_JNI (THIS->hasEntryByPath (TO_C (path)));
156145}
157146
158147METHOD (jobject, getEntryByTitle__Ljava_lang_String_2, jstring title) {
159- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getEntryByTitle (TO_C (title)));
148+ return BUILD_WRAPPER (THIS->getEntryByTitle (TO_C (title)));
160149}
161150
162151METHOD (jobject, getEntryByTitle__I, jint index) {
163- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getEntryByTitle (TO_C (index)));
152+ return BUILD_WRAPPER (THIS->getEntryByTitle (TO_C (index)));
164153}
165154
166155METHOD (jboolean, hasEntryByTitle, jstring title) {
167156 return TO_JNI (THIS->hasEntryByPath (TO_C (title)));
168157}
169158
170159METHOD (jobject, getEntryByClusterOrder, jint index) {
171- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getEntryByClusterOrder (TO_C (index)));
160+ return BUILD_WRAPPER (THIS->getEntryByClusterOrder (TO_C (index)));
172161}
173162
174163METHOD0 (jobject, getMainEntry) {
175- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getMainEntry ());
164+ return BUILD_WRAPPER (THIS->getMainEntry ());
176165}
177166
178167GETTER (jboolean, hasMainEntry)
179168
180169METHOD0(jobject, getRandomEntry) {
181- return BUILD_WRAPPER (" org/kiwix/libzim/Entry " , THIS->getRandomEntry ());
170+ return BUILD_WRAPPER (THIS->getRandomEntry ());
182171}
183172
184173GETTER (jboolean, hasFulltextIndex)
@@ -192,62 +181,57 @@ GETTER(jboolean, hasNewNamespaceScheme)
192181#define ITER_BY_PATH 0
193182#define ITER_BY_TITLE 1
194183#define ITER_EFFICIENT 2
184+
185+
186+ // No use of the macro BUILD_WRAPPER as `EntryIterator` takes a integer(I) to
187+ // track the order. So the signature of the constructor is not the same.
188+ // The same way, as we are building a iterator, it has two nativeHandle (for begin and end).
195189METHOD0 (jobject, iterByPath) {
196190 auto range = THIS->iterByPath ();
197- jclass objClass = env->FindClass (" org/kiwix/libzim/EntryIterator" );
198- jmethodID initMethod = env->GetMethodID (objClass, " <init>" , " (I)V" );
199- jobject obj = env->NewObject (objClass, initMethod, ITER_BY_PATH);
200- SET_HANDLE (zim::Archive::iterator<zim::EntryOrder::pathOrder>, obj, range.begin ());
191+ auto beginIter = NEW_RESOURCE (range.begin ());
192+ auto endIter = NEW_RESOURCE (range.end ());
201193
202- auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::pathOrder>>(range. end () );
203- setPtr ( env, obj, std::move (end_ptr), " nativeHandleEnd " );
204- return obj ;
194+ jclass wrapperClass = env-> FindClass ( " org/kiwix/libzim/EntryIterator " );
195+ jmethodID initMethod = env-> GetMethodID (wrapperClass, " <init> " , " (org/kiwix/Wrapper/Resource;org/kiwix/Wrapper/Resource)V " );
196+ return env-> NewObject (wrapperClass, initMethod, beginIter, endIter) ;
205197}
206198
207199METHOD0 (jobject, iterByTitle) {
208200 auto range = THIS->iterByTitle ();
209- jclass objClass = env->FindClass (" org/kiwix/libzim/EntryIterator" );
210- jmethodID initMethod = env->GetMethodID (objClass, " <init>" , " (I)V" );
211- jobject obj = env->NewObject (objClass, initMethod, ITER_BY_TITLE);
212- SET_HANDLE (zim::Archive::iterator<zim::EntryOrder::titleOrder>, obj, range.begin ());
201+ auto beginIter = NEW_RESOURCE (range.begin ());
202+ auto endIter = NEW_RESOURCE (range.end ());
213203
214- auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::titleOrder>>(range. end () );
215- setPtr ( env, obj, std::move (end_ptr), " nativeHandleEnd " );
216- return obj ;
204+ jclass wrapperClass = env-> FindClass ( " org/kiwix/libzim/EntryIterator " );
205+ jmethodID initMethod = env-> GetMethodID (wrapperClass, " <init> " , " (org/kiwix/Wrapper/Resource;org/kiwix/Wrapper/Resource)V " );
206+ return env-> NewObject (wrapperClass, initMethod, beginIter, endIter) ;
217207}
218208
219209METHOD0 (jobject, iterEfficient) {
220210 auto range = THIS->iterEfficient ();
221- jclass objClass = env->FindClass (" org/kiwix/libzim/EntryIterator" );
222- jmethodID initMethod = env->GetMethodID (objClass, " <init>" , " (I)V" );
223- jobject obj = env->NewObject (objClass, initMethod, ITER_EFFICIENT);
224- SET_HANDLE (zim::Archive::iterator<zim::EntryOrder::efficientOrder>, obj, range.begin ());
211+ auto beginIter = NEW_RESOURCE (range.begin ());
212+ auto endIter = NEW_RESOURCE (range.end ());
225213
226- auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::efficientOrder>>(range. end () );
227- setPtr ( env, obj, std::move (end_ptr), " nativeHandleEnd " );
228- return obj ;
214+ jclass wrapperClass = env-> FindClass ( " org/kiwix/libzim/EntryIterator " );
215+ jmethodID initMethod = env-> GetMethodID (wrapperClass, " <init> " , " (org/kiwix/Wrapper/Resource;org/kiwix/Wrapper/Resource)V " );
216+ return env-> NewObject (wrapperClass, initMethod, beginIter, endIter) ;
229217}
230218
231219METHOD (jobject, findByPath, jstring path) {
232220 auto range = THIS->findByPath (TO_C (path));
233- jclass objClass = env->FindClass (" org/kiwix/libzim/EntryIterator" );
234- jmethodID initMethod = env->GetMethodID (objClass, " <init>" , " (I)V" );
235- jobject obj = env->NewObject (objClass, initMethod, ITER_BY_PATH);
236- SET_HANDLE (zim::Archive::iterator<zim::EntryOrder::pathOrder>, obj, range.begin ());
221+ auto beginIter = NEW_RESOURCE (range.begin ());
222+ auto endIter = NEW_RESOURCE (range.end ());
237223
238- auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::pathOrder>>(range. end () );
239- setPtr ( env, obj, std::move (end_ptr), " nativeHandleEnd " );
240- return obj ;
224+ jclass wrapperClass = env-> FindClass ( " org/kiwix/libzim/EntryIterator " );
225+ jmethodID initMethod = env-> GetMethodID (wrapperClass, " <init> " , " (org/kiwix/Wrapper/Resource;org/kiwix/Wrapper/Resource)V " );
226+ return env-> NewObject (wrapperClass, initMethod, beginIter, endIter) ;
241227}
242228
243229METHOD (jobject, findByTitle, jstring title) {
244230 auto range = THIS->findByTitle (TO_C (title));
245- jclass objClass = env->FindClass (" org/kiwix/libzim/EntryIterator" );
246- jmethodID initMethod = env->GetMethodID (objClass, " <init>" , " (I)V" );
247- jobject obj = env->NewObject (objClass, initMethod, ITER_BY_TITLE);
248- SET_HANDLE (zim::Archive::iterator<zim::EntryOrder::titleOrder>, obj, range.begin ());
249-
250- auto end_ptr = std::make_shared<zim::Archive::iterator<zim::EntryOrder::titleOrder>>(range.end ());
251- setPtr (env, obj, std::move (end_ptr), " nativeHandleEnd" );
252- return obj;
231+ auto beginIter = NEW_RESOURCE (range.begin ());
232+ auto endIter = NEW_RESOURCE (range.end ());
233+
234+ jclass wrapperClass = env->FindClass (" org/kiwix/libzim/EntryIterator" );
235+ jmethodID initMethod = env->GetMethodID (wrapperClass, " <init>" , " (org/kiwix/Wrapper/Resource;org/kiwix/Wrapper/Resource)V" );
236+ return env->NewObject (wrapperClass, initMethod, beginIter, endIter);
253237}
0 commit comments