diff --git a/lib/src/main/cpp/libkiwix/library.cpp b/lib/src/main/cpp/libkiwix/library.cpp index 25e9d99..cac6930 100644 --- a/lib/src/main/cpp/libkiwix/library.cpp +++ b/lib/src/main/cpp/libkiwix/library.cpp @@ -97,8 +97,14 @@ METHOD(jobjectArray, getBookmarks, jboolean onlyValidBookmarks) { auto bookmarks = THIS->getBookmarks(TO_C(onlyValidBookmarks)); jobjectArray retArray = createArray(env, bookmarks.size(), "org/kiwix/libkiwix/Bookmark"); size_t index = 0; + jclass wrapperClass = env->FindClass("org/kiwix/libkiwix/Bookmark"); + jmethodID initMethod = env->GetMethodID(wrapperClass, "", "(J)V"); + for (auto bookmark: bookmarks) { - auto wrapper = BUILD_WRAPPER("org/kiwix/libkiwix/Bookmark", bookmark); + // This double new is necessary as we need to allocate the bookmark itself (as a shared_ptr) on the heap but + // we also want the shared_ptr to be stored in the head as we want to have a ptr (cast as long) to it. + shared_ptr* handle = new shared_ptr(new kiwix::Bookmark(std::move(bookmark))); + jobject wrapper = env->NewObject(wrapperClass, initMethod, reinterpret_cast(handle)); env->SetObjectArrayElement(retArray, index++, wrapper); } return retArray; diff --git a/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java b/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java index a6c1d4c..936ab57 100644 --- a/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java +++ b/lib/src/main/java/org/kiwix/libkiwix/Bookmark.java @@ -25,6 +25,10 @@ public class Bookmark setNativeBookmark(); } + private Bookmark(long handle) { + nativeHandle = handle; + } + public native void setBookId(String bookId); public native void setBookTitle(String bookTitle); public native void setUrl(String url);