@@ -79,8 +79,34 @@ zim::FdInput jni2fdInput(const jobject& fdInputObj, JNIEnv* env)
7979 return zim::FdInput (fd, offset, size);
8080}
8181
82+ zim::OpenConfig jni2openConfig (const jobject& openConfigObj, JNIEnv* env)
83+ {
84+ jclass cls = env->GetObjectClass (openConfigObj);
85+
86+ jfieldID preloadXapianDbFid = env->GetFieldID (cls, " preloadXapianDb" , " Z" );
87+ jboolean preloadXapianDb = env->GetBooleanField (openConfigObj, preloadXapianDbFid);
88+ jfieldID preloadDirentRangesFid = env->GetFieldID (cls, " preloadDirentRanges" , " I" );
89+ jint preloadDirentRanges = env->GetIntField (openConfigObj, preloadDirentRangesFid);
90+ zim::OpenConfig config;
91+ config.preloadXapianDb (preloadXapianDb);
92+ if (preloadDirentRanges > 0 )
93+ config.preloadDirentRanges (preloadDirentRanges);
94+ return config;
95+ }
96+
8297} // unnamed namespace
8398
99+ METHOD (void , setNativeArchiveWithConfig, jstring filename, jobject openConfigObj)
100+ {
101+ std::string cPath = TO_C (filename);
102+ zim::OpenConfig config = jni2openConfig (openConfigObj, env);
103+
104+ // Create archive with custom configuration
105+ auto archive = std::make_shared<zim::Archive>(cPath, config);
106+ SET_PTR (archive);
107+ }
108+ CATCH_EXCEPTION ()
109+
84110JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD(
85111 JNIEnv* env, jobject thisObj, jobject fdObj) try
86112{
@@ -96,6 +122,22 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFD(
96122#endif
97123} CATCH_EXCEPTION()
98124
125+ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveByFDWithConfig (
126+ JNIEnv* env, jobject thisObj, jobject fdObj, jobject openConfigObj) try
127+ {
128+ #ifndef _WIN32
129+ int fd = jni2fd (fdObj, env);
130+ zim::OpenConfig config = jni2openConfig (openConfigObj, env);
131+
132+ LOG (" Attempting to create reader with fd: %d" , fd);
133+ auto archive = std::make_shared<zim::Archive>(fd, config);
134+ SET_PTR (archive);
135+ #else
136+ jclass exception = env->FindClass (" java/lang/UnsupportedOperationException" );
137+ env->ThrowNew (exception, " org.kiwix.libzim.Archive.setNativeArchiveByFD() is not supported under Windows" );
138+ #endif
139+ } CATCH_EXCEPTION()
140+
99141JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded (
100142 JNIEnv* env, jobject thisObj, jobject fdObj, jlong offset, jlong size) try
101143{
@@ -111,6 +153,22 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbedded(
111153#endif
112154} CATCH_EXCEPTION()
113155
156+ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedWithConfig (
157+ JNIEnv* env, jobject thisObj, jobject fdObj, jlong offset, jlong size, jobject openConfigObj) try
158+ {
159+ #ifndef _WIN32
160+ int fd = jni2fd (fdObj, env);
161+ zim::OpenConfig config = jni2openConfig (openConfigObj, env);
162+
163+ LOG (" Attempting to create reader with fd: %d" , fd);
164+ auto archive = std::make_shared<zim::Archive>(fd, offset, size, config);
165+ SET_PTR (archive);
166+ #else
167+ jclass exception = env->FindClass (" java/lang/UnsupportedOperationException" );
168+ env->ThrowNew (exception, " org.kiwix.libzim.Archive.setNativeArchiveEmbedded() is not supported under Windows" );
169+ #endif
170+ } CATCH_EXCEPTION()
171+
114172JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedFd (
115173 JNIEnv* env, jobject thisObj, jobject fdObj) try
116174{
@@ -125,6 +183,21 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedFd(
125183#endif
126184} CATCH_EXCEPTION()
127185
186+ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedFdWithConfig (
187+ JNIEnv* env, jobject thisObj, jobject fdObj, jobject openConfigObj) try
188+ {
189+ #ifndef _WIN32
190+ auto fdInput = jni2fdInput (fdObj, env);
191+ zim::OpenConfig config = jni2openConfig (openConfigObj, env);
192+
193+ auto archive = std::make_shared<zim::Archive>(fdInput, config);
194+ SET_PTR (archive);
195+ #else
196+ jclass exception = env->FindClass (" java/lang/UnsupportedOperationException" );
197+ env->ThrowNew (exception, " org.kiwix.libzim.Archive.setNativeArchiveEmbedded() is not supported under Windows" );
198+ #endif
199+ } CATCH_EXCEPTION()
200+
128201
129202JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedFds (
130203 JNIEnv* env, jobject thisObj, jobjectArray fdsObj) try
@@ -149,6 +222,29 @@ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedFds
149222#endif
150223} CATCH_EXCEPTION()
151224
225+ JNIEXPORT void JNICALL Java_org_kiwix_libzim_Archive_setNativeArchiveEmbeddedFdsWithConfig (
226+ JNIEnv* env, jobject thisObj, jobjectArray fdsObj, jobject openConfigObj) try
227+ {
228+ #ifndef _WIN32
229+
230+ jsize length = env->GetArrayLength (fdsObj);
231+ std::vector<zim::FdInput> v;
232+
233+ int i;
234+ for (i = 0 ; i<length; i++) {
235+ jobject fdObj = env->GetObjectArrayElement (fdsObj, i);
236+ auto fdInput = jni2fdInput (fdObj, env);
237+ v.push_back (fdInput);
238+ }
239+ zim::OpenConfig config = jni2openConfig (openConfigObj, env);
240+ auto archive = std::make_shared<zim::Archive>(v, config);
241+ SET_PTR (archive);
242+ #else
243+ jclass exception = env->FindClass (" java/lang/UnsupportedOperationException" );
244+ env->ThrowNew (exception, " org.kiwix.libzim.Archive.setNativeArchiveEmbedded() is not supported under Windows" );
245+ #endif
246+ } CATCH_EXCEPTION()
247+
152248DISPOSE
153249
154250GETTER (jstring, getFilename)
@@ -245,6 +341,12 @@ GETTER(jstring, getChecksum)
245341GETTER(jboolean, check)
246342GETTER(jboolean, isMultiPart)
247343GETTER(jboolean, hasNewNamespaceScheme)
344+ GETTER(jlong, getDirentCacheMaxSize)
345+ GETTER(jlong, getDirentCacheCurrentSize)
346+
347+ METHOD(void , setDirentCacheMaxSize, jlong nbDirents) {
348+ THIS->setDirentCacheMaxSize (static_cast <size_t >(nbDirents));
349+ } CATCH_EXCEPTION()
248350
249351#define ITER_BY_PATH 0
250352#define ITER_BY_TITLE 1
@@ -308,3 +410,15 @@ METHOD(jobject, findByTitle, jstring title) {
308410 setPtr (env, obj, std::move (end_ptr), " nativeHandleEnd" );
309411 return obj;
310412} CATCH_EXCEPTION(nullptr )
413+
414+ METHOD0 (jlong, getClusterCacheMaxSize) {
415+ return static_cast <jlong>(zim::getClusterCacheMaxSize ());
416+ } CATCH_EXCEPTION(0 )
417+
418+ METHOD0 (jlong, getClusterCacheCurrentSize) {
419+ return static_cast <jlong>(zim::getClusterCacheCurrentSize ());
420+ } CATCH_EXCEPTION(0 )
421+
422+ METHOD (void , setClusterCacheMaxSize, jlong sizeInBytes) {
423+ zim::setClusterCacheMaxSize (static_cast <size_t >(sizeInBytes));
424+ } CATCH_EXCEPTION()
0 commit comments