diff --git a/medialibrary/jni/AndroidMediaLibrary.cpp b/medialibrary/jni/AndroidMediaLibrary.cpp index 8c0b38093..87e981f20 100644 --- a/medialibrary/jni/AndroidMediaLibrary.cpp +++ b/medialibrary/jni/AndroidMediaLibrary.cpp @@ -682,15 +682,15 @@ AndroidMediaLibrary::onMediaAdded( std::vector mediaList JNIEnv *env = getEnv(); if (env == NULL /*|| env->IsSameObject(weak_thiz, NULL)*/) return; - jobjectArray mediaRefs, results; + utils::jni::objectArray mediaRefs; int index; if ((m_mediaAddedType & (FLAG_MEDIA_ADDED_AUDIO|FLAG_MEDIA_ADDED_VIDEO)) == 0) { index = 0; - mediaRefs = (jobjectArray) env->NewObjectArray(0, p_fields->MediaWrapper.clazz, NULL); + mediaRefs = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(0, p_fields->MediaWrapper.clazz, NULL) }; } else { - mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), p_fields->MediaWrapper.clazz, NULL); + mediaRefs = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), p_fields->MediaWrapper.clazz, NULL) }; index = -1; for (medialibrary::MediaPtr const& media : mediaList) { medialibrary::IMedia::Type type = media->type(); @@ -700,7 +700,7 @@ AndroidMediaLibrary::onMediaAdded( std::vector mediaList { item = mediaToMediaWrapper(env, p_fields, media); } - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); } } @@ -708,11 +708,9 @@ AndroidMediaLibrary::onMediaAdded( std::vector mediaList { if (weak_thiz) { - results = filteredArray(env, mediaRefs, p_fields->MediaWrapper.clazz, -1); - env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaAddedId, results); - env->DeleteLocalRef(results); - } else - env->DeleteLocalRef(mediaRefs); + auto results = filteredArray(env, std::move( mediaRefs ), p_fields->MediaWrapper.clazz, -1); + env->CallVoidMethod(weak_thiz, p_fields->MediaLibrary.onMediaAddedId, results.get()); + } } } } diff --git a/medialibrary/jni/medialibrary.cpp b/medialibrary/jni/medialibrary.cpp index e9c6a61fa..48f8af1bb 100644 --- a/medialibrary/jni/medialibrary.cpp +++ b/medialibrary/jni/medialibrary.cpp @@ -288,15 +288,15 @@ lastMediaPLayed(JNIEnv* env, jobject thiz) { AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz); std::vector mediaPlayed = aml->lastMediaPlayed(); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaPlayed.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaPlayed.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : mediaPlayed) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jboolean @@ -338,15 +338,15 @@ getInternalVideos(JNIEnv* env, jobject thiz, const medialibrary::QueryParameters AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz); const auto query = aml->videoFiles(params); std::vector videoFiles = nbItems != 0 ? query->items(nbItems, offset) : query->all(); - jobjectArray videoRefs = (jobjectArray) env->NewObjectArray(videoFiles.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray videoRefs{ env, (jobjectArray) env->NewObjectArray(videoFiles.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : videoFiles) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(videoRefs, ++index, item.get()); + env->SetObjectArrayElement(videoRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, videoRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( videoRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jobjectArray @@ -382,15 +382,15 @@ getInternalAudio(JNIEnv* env, jobject thiz, const medialibrary::QueryParameters* AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz); const auto query = aml->audioFiles(params); std::vector audioFiles = nbItems != 0 ? query->items(nbItems, offset) : query->all(); - jobjectArray audioRefs = (jobjectArray) env->NewObjectArray(audioFiles.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray audioRefs{ env, (jobjectArray) env->NewObjectArray(audioFiles.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : audioFiles) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(audioRefs, ++index, item.get()); + env->SetObjectArrayElement(audioRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, audioRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( audioRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jobjectArray @@ -967,14 +967,14 @@ getTracksFromAlbum(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, ji const auto query = aml->tracksFromAlbum(id, ¶ms); if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL); std::vector tracks = query->all(); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(tracks.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(tracks.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : tracks) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jint @@ -1043,14 +1043,14 @@ getMediaFromArtist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, ji const auto query = aml->mediaFromArtist(id, ¶ms); if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL); std::vector mediaList = query->all(); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : mediaList) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jobjectArray @@ -1179,15 +1179,15 @@ getMediaFromGenre(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, jbo const auto query = aml->mediaFromGenre(id, withThumbnail, ¶ms); if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL); std::vector mediaList = query->all(); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : mediaList) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jobjectArray @@ -1373,14 +1373,14 @@ getBookmarks(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id) const auto query = media->bookmarks(nullptr); if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.Bookmark.clazz, NULL); std::vector bookmarks = query->all(); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(bookmarks.size(), ml_fields.Bookmark.clazz, NULL); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(bookmarks.size(), ml_fields.Bookmark.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::BookmarkPtr const& bookmark : bookmarks) { auto item = convertBookmarkObject(env, &ml_fields, bookmark); - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, mediaRefs, ml_fields.Bookmark.clazz, drops); + return filteredArray(env, std::move( mediaRefs ), ml_fields.Bookmark.clazz, drops).release(); } jobject @@ -1536,15 +1536,15 @@ getMediaFromPlaylist(JNIEnv* env, jobject thiz, jobject medialibrary, jlong id, const auto query = aml->mediaFromPlaylist(id, ¶ms); if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL); std::vector mediaList = query->all(); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(mediaList.size(), ml_fields.MediaWrapper.clazz, NULL) }; int index = -1, drops = 0; for(medialibrary::MediaPtr const& media : mediaList) { auto item = mediaToMediaWrapper(env, &ml_fields, media); - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); if (item == nullptr) ++drops; } - return filteredArray(env, mediaRefs, ml_fields.MediaWrapper.clazz, drops); + return filteredArray(env, std::move( mediaRefs ), ml_fields.MediaWrapper.clazz, drops).release(); } jobjectArray diff --git a/medialibrary/jni/utils.cpp b/medialibrary/jni/utils.cpp index 60909377f..3761b7ac9 100644 --- a/medialibrary/jni/utils.cpp +++ b/medialibrary/jni/utils.cpp @@ -164,70 +164,70 @@ utils::jni::object convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr, jboolean includeMissing) { //Albums - jobjectArray albums = nullptr; + utils::jni::objectArray albums; int index = -1; if (searchAggregatePtr.albums != nullptr) { - albums = (jobjectArray) env->NewObjectArray(searchAggregatePtr.albums->count(), fields->Album.clazz, NULL); + albums = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(searchAggregatePtr.albums->count(), fields->Album.clazz, NULL) }; for(medialibrary::AlbumPtr const& album : searchAggregatePtr.albums->all()) { auto item = convertAlbumObject(env, fields, album); - env->SetObjectArrayElement(albums, ++index, item.get()); + env->SetObjectArrayElement(albums.get(), ++index, item.get()); } } //Artists - jobjectArray artists = nullptr; + utils::jni::objectArray artists; if (searchAggregatePtr.artists != nullptr) { index = -1; - artists = (jobjectArray) env->NewObjectArray(searchAggregatePtr.artists->count(), fields->Artist.clazz, NULL); + artists = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(searchAggregatePtr.artists->count(), fields->Artist.clazz, NULL) }; for(medialibrary::ArtistPtr const& artist : searchAggregatePtr.artists->all()) { auto item = convertArtistObject(env, fields, artist); - env->SetObjectArrayElement(artists, ++index, item.get()); + env->SetObjectArrayElement(artists.get(), ++index, item.get()); } } //Genres - jobjectArray genres = nullptr; + utils::jni::objectArray genres; if (searchAggregatePtr.genres != nullptr) { index = -1; - genres = (jobjectArray) env->NewObjectArray(searchAggregatePtr.genres->count(), fields->Genre.clazz, NULL); + genres = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(searchAggregatePtr.genres->count(), fields->Genre.clazz, NULL) }; for(medialibrary::GenrePtr const& genre : searchAggregatePtr.genres->all()) { auto item = convertGenreObject(env, fields, genre); - env->SetObjectArrayElement(genres, ++index, item.get()); + env->SetObjectArrayElement(genres.get(), ++index, item.get()); } } //Playlists - jobjectArray playlists = nullptr; + utils::jni::objectArray playlists; if (searchAggregatePtr.playlists != nullptr) { index = -1; - playlists = (jobjectArray) env->NewObjectArray(searchAggregatePtr.playlists->count(), fields->Playlist.clazz, NULL); + playlists = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(searchAggregatePtr.playlists->count(), fields->Playlist.clazz, NULL) }; for(medialibrary::PlaylistPtr const& playlist : searchAggregatePtr.playlists->all()) { auto item = convertPlaylistObject(env, fields, playlist, includeMissing); - env->SetObjectArrayElement(playlists, ++index, item.get()); + env->SetObjectArrayElement(playlists.get(), ++index, item.get()); } } //Media std::vector videos = {}; std::vector tracks = {}; - jobjectArray videoList = nullptr; - jobjectArray tracksList = nullptr; + utils::jni::objectArray videoList; + utils::jni::objectArray tracksList; if (searchAggregatePtr.media != nullptr) { for(medialibrary::MediaPtr const& media : searchAggregatePtr.media->all()) { if (media->subType() == medialibrary::IMedia::SubType::AlbumTrack) tracks.push_back(media); else videos.push_back(media); } - videoList = (jobjectArray) env->NewObjectArray(videos.size(), fields->MediaWrapper.clazz, NULL); + videoList = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(videos.size(), fields->MediaWrapper.clazz, NULL) }; index = -1; for(medialibrary::MediaPtr const& media : videos) { auto item = mediaToMediaWrapper(env, fields, media); - env->SetObjectArrayElement(videoList, ++index, item.get()); + env->SetObjectArrayElement(videoList.get(), ++index, item.get()); } - tracksList = (jobjectArray) env->NewObjectArray(tracks.size(), fields->MediaWrapper.clazz, NULL); + tracksList = utils::jni::objectArray{ env, (jobjectArray) env->NewObjectArray(tracks.size(), fields->MediaWrapper.clazz, NULL) }; index = -1; for(medialibrary::MediaPtr const& media : tracks) { auto item = mediaToMediaWrapper(env, fields, media); - env->SetObjectArrayElement(tracksList, ++index, item.get()); + env->SetObjectArrayElement(tracksList.get(), ++index, item.get()); } } return { env, env->NewObject(fields->SearchAggregate.clazz, fields->SearchAggregate.initID, - albums, artists, genres, videoList, tracksList, playlists) + albums.get(), artists.get(), genres.get(), videoList.get(), tracksList.get(), playlists.get()) }; } @@ -246,17 +246,17 @@ idArray(JNIEnv* env, std::set ids) return results; } -jobjectArray -filteredArray(JNIEnv* env, jobjectArray array, jclass clazz, int removalCount) +utils::jni::objectArray +filteredArray(JNIEnv* env, utils::jni::objectArray array, jclass clazz, int removalCount) { int size = -1, index = -1; if (removalCount == -1) { removalCount = 0; - size = env->GetArrayLength(array); + size = env->GetArrayLength(array.get()); for (int i = 0; iGetObjectArrayElement(array, i) }; + utils::jni::object item{ env, env->GetObjectArrayElement(array.get(), i) }; if (item == nullptr) ++removalCount; } @@ -264,18 +264,17 @@ filteredArray(JNIEnv* env, jobjectArray array, jclass clazz, int removalCount) if (removalCount == 0) return array; if (size == -1) - size = env->GetArrayLength(array); - jobjectArray mediaRefs = (jobjectArray) env->NewObjectArray(size-removalCount, clazz, NULL); + size = env->GetArrayLength(array.get()); + utils::jni::objectArray mediaRefs{ env, (jobjectArray) env->NewObjectArray(size-removalCount, clazz, NULL) }; for (int i = 0; iGetObjectArrayElement(array, i) }; + utils::jni::object item{ env, env->GetObjectArrayElement(array.get(), i) }; if (item != nullptr) { - env->SetObjectArrayElement(mediaRefs, ++index, item.get()); + env->SetObjectArrayElement(mediaRefs.get(), ++index, item.get()); --removalCount; } } - env->DeleteLocalRef(array); return mediaRefs; } diff --git a/medialibrary/jni/utils.h b/medialibrary/jni/utils.h index b4a1c881d..afa8d9fc4 100644 --- a/medialibrary/jni/utils.h +++ b/medialibrary/jni/utils.h @@ -134,6 +134,7 @@ private: using string = localref; using object = localref; +using objectArray = localref; } } @@ -237,7 +238,7 @@ utils::jni::object convertFolderObject(JNIEnv* env, fields *fields, medialibrary utils::jni::object convertVideoGroupObject(JNIEnv* env, fields *fields, medialibrary::MediaGroupPtr const& videogroupPtr); utils::jni::object convertBookmarkObject(JNIEnv* env, fields *fields, medialibrary::BookmarkPtr const& bookmarkPtr); utils::jni::object convertSearchAggregateObject(JNIEnv* env, fields *fields, medialibrary::SearchAggregate const& searchAggregatePtr, jboolean includeMissing); -jobjectArray filteredArray(JNIEnv* env, jobjectArray array, jclass clazz, int removalCount = -1); +utils::jni::objectArray filteredArray(JNIEnv* env, utils::jni::objectArray array, jclass clazz, int removalCount = -1); jlongArray idArray(JNIEnv* env, std::set ids); utils::jni::string vlcNewStringUTF(JNIEnv* env, const char* psz_string);