diff --git a/lib/src/main/cpp/libzim/blob.cpp b/lib/src/main/cpp/libzim/blob.cpp index a197e11..2bbaca4 100644 --- a/lib/src/main/cpp/libzim/blob.cpp +++ b/lib/src/main/cpp/libzim/blob.cpp @@ -35,7 +35,7 @@ DISPOSE -METHOD0(jstring, getData) { - return TO_JNI(std::string(*THIS)); +METHOD0(jbyteArray, getData) { + return cArray2jni(THIS->data(), THIS->size(), env); } GETTER(jlong, size) diff --git a/lib/src/main/cpp/utils.h b/lib/src/main/cpp/utils.h index 3f8ce91..d6b74f5 100644 --- a/lib/src/main/cpp/utils.h +++ b/lib/src/main/cpp/utils.h @@ -199,6 +199,15 @@ template<> struct JTypeArray{ env->SetBooleanArrayRegion(array, 0, length, reinterpret_cast(data)); } }; +template<> struct JTypeArray{ + typedef jbyteArray type_t; + static jbyteArray createArray(JNIEnv* env, size_t length) { + return env->NewByteArray(length); + } + static void setArray(JNIEnv* env, jbyteArray array, const char* data, size_t length) { + env->SetByteArrayRegion(array, 0, length, reinterpret_cast(data)); + } +}; template<> struct JTypeArray{ typedef jintArray type_t; static jintArray createArray(JNIEnv* env, size_t length) { @@ -278,6 +287,14 @@ inline typename JTypeArray::type_t c2jni(const std::set& val, JNIEnv* env) return c2jni(temp, env); } +template +inline typename JTypeArray::type_t cArray2jni(const U* data, size_t length, JNIEnv* env) +{ + auto array = JTypeArray::createArray(env, length); + JTypeArray::setArray(env, array, data, length); + return array; +} + #define TO_JNI(VAL) c2jni(VAL, env) diff --git a/lib/src/main/java/org/kiwix/libzim/Blob.java b/lib/src/main/java/org/kiwix/libzim/Blob.java index 93852f2..cb35281 100644 --- a/lib/src/main/java/org/kiwix/libzim/Blob.java +++ b/lib/src/main/java/org/kiwix/libzim/Blob.java @@ -23,7 +23,7 @@ import org.kiwix.libzim.Blob; public class Blob { - public native String getData(); + public native byte[] getData(); public native long size(); diff --git a/lib/src/test/test.java b/lib/src/test/test.java index 7421427..04b469b 100644 --- a/lib/src/test/test.java +++ b/lib/src/test/test.java @@ -44,10 +44,8 @@ public class test { return new String(getFileContent(path)); } - @Test - public void testArchive() - throws JNIKiwixException, IOException, ZimFileFormatException { - Archive archive = new Archive("small.zim"); + private void testArchive(Archive archive) + throws IOException { // test the zim file main page title assertEquals("Test ZIM file", archive.getMainEntry().getTitle()); // test zim file size @@ -55,21 +53,29 @@ public class test { // test zim file main url assertEquals("A/main.html", archive.getMainEntry().getPath()); // test zim file content - String s = getTextFileContent("small_zimfile_data/main.html"); - String c = archive.getEntryByPath("A/main.html").getItem(true).getData().getData(); - assertEquals(s, c); + byte[] mainData = getFileContent("small_zimfile_data/main.html"); + byte[] inZimMainData = archive.getEntryByPath("A/main.html").getItem(true).getData().getData(); + assert(Arrays.equals(mainData, inZimMainData)); // test zim file icon - byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); assertEquals(true, archive.hasIllustration(48)); + byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); Item item = archive.getIllustrationItem(48); assertEquals(faviconData.length, item.getSize()); + assert(Arrays.equals(faviconData, item.getData().getData())); - DirectAccessInfo dai = archive.getEntryByPath("I/favicon.png").getItem(true).getDirectAccessInformation(); + // Checking direct access information + DirectAccessInfo dai = item.getDirectAccessInformation(); assertNotEquals("", dai.filename); - c = new String(getFileContentPartial(dai.filename, (int) dai.offset, faviconData.length)); - assertEquals(new String(faviconData), c); + byte[] readData = getFileContentPartial(dai.filename, (int) dai.offset, (int) item.getSize()); + assert(Arrays.equals(faviconData, readData)); + } + @Test + public void testArchiveDirect() + throws JNIKiwixException, IOException, ZimFileFormatException { + Archive archive = new Archive("small.zim"); + testArchive(archive); archive.dispose(); // test reader with invalid zim file @@ -87,28 +93,7 @@ public class test { throws JNIKiwixException, IOException, ZimFileFormatException { FileInputStream fis = new FileInputStream("small.zim"); Archive archive = new Archive(fis.getFD()); - // test the zim file main page title - assertEquals("Test ZIM file", archive.getMainEntry().getTitle()); - // test zim file size - assertEquals(4070, archive.getFilesize()); // The file size is in KiB - // test zim file main url - assertEquals("A/main.html", archive.getMainEntry().getPath()); - // test zim file content - String s = getTextFileContent("small_zimfile_data/main.html"); - String c = archive.getEntryByPath("A/main.html").getItem(true).getData().getData(); - assertEquals(s, c); - - // test zim file icon - byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); - assertEquals(true, archive.hasIllustration(48)); - Item item = archive.getIllustrationItem(48); - assertEquals(faviconData.length, item.getSize()); - - DirectAccessInfo dai = archive.getEntryByPath("I/favicon.png").getItem(true).getDirectAccessInformation(); - assertNotEquals("", dai.filename); - c = new String(getFileContentPartial(dai.filename, (int) dai.offset, faviconData.length)); - assertEquals(new String(faviconData), c); - + testArchive(archive); archive.dispose(); } @@ -118,29 +103,7 @@ public class test { File plainArchive = new File("small.zim"); FileInputStream fis = new FileInputStream("small.zim.embedded"); Archive archive = new Archive(fis.getFD(), 8, plainArchive.length()); - // test the zim file main page title - assertEquals("Test ZIM file", archive.getMainEntry().getTitle()); - // test zim file size - assertEquals(4070, archive.getFilesize()); // The file size is in KiB - // test zim file main url - assertEquals("A/main.html", archive.getMainEntry().getPath()); - // test zim file content - String s = getTextFileContent("small_zimfile_data/main.html"); - String c = archive.getEntryByPath("A/main.html").getItem(true).getData().getData(); - assertEquals(s, c); - - // test zim file icon - byte[] faviconData = getFileContent("small_zimfile_data/favicon.png"); - assertEquals(true, archive.hasIllustration(48)); - Item item = archive.getIllustrationItem(48); - assertEquals(faviconData.length, item.getSize()); - assertEquals(new String(faviconData), item.getData().getData()); - - DirectAccessInfo dai = archive.getEntryByPath("I/favicon.png").getItem(true).getDirectAccessInformation(); - assertNotEquals("", dai.filename); - c = new String(getFileContentPartial(dai.filename, (int) dai.offset, faviconData.length)); - assertEquals(new String(faviconData), c); - + testArchive(archive); archive.dispose(); }