Browse Source

medialibrary: use utils::jni::objectArray for native objects arrays

3.4.x
Hugo Beauzée-Luyssen 5 years ago
committed by Nicolas Pomepuy
parent
commit
303984c493
  1. 16
      medialibrary/jni/AndroidMediaLibrary.cpp
  2. 48
      medialibrary/jni/medialibrary.cpp
  3. 55
      medialibrary/jni/utils.cpp
  4. 3
      medialibrary/jni/utils.h

16
medialibrary/jni/AndroidMediaLibrary.cpp

@ -682,15 +682,15 @@ AndroidMediaLibrary::onMediaAdded( std::vector<medialibrary::MediaPtr> 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<medialibrary::MediaPtr> 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<medialibrary::MediaPtr> 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());
}
}
}
}

48
medialibrary/jni/medialibrary.cpp

@ -288,15 +288,15 @@ lastMediaPLayed(JNIEnv* env, jobject thiz)
{
AndroidMediaLibrary *aml = MediaLibrary_getInstance(env, thiz);
std::vector<medialibrary::MediaPtr> 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<medialibrary::MediaPtr> 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<medialibrary::MediaPtr> 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, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
std::vector<medialibrary::MediaPtr> 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, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
std::vector<medialibrary::MediaPtr> 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, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
std::vector<medialibrary::MediaPtr> 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<medialibrary::BookmarkPtr> 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, &params);
if (query == nullptr) return (jobjectArray) env->NewObjectArray(0, ml_fields.MediaWrapper.clazz, NULL);
std::vector<medialibrary::MediaPtr> 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

55
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<medialibrary::MediaPtr> videos = {};
std::vector<medialibrary::MediaPtr> 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<int64_t> 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; i<size; ++i)
{
utils::jni::object item{ env, env->GetObjectArrayElement(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; i<size; ++i)
{
utils::jni::object item{ env, env->GetObjectArrayElement(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;
}

3
medialibrary/jni/utils.h

@ -134,6 +134,7 @@ private:
using string = localref<jstring>;
using object = localref<jobject>;
using objectArray = localref<jobjectArray>;
}
}
@ -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<int64_t> ids);
utils::jni::string vlcNewStringUTF(JNIEnv* env, const char* psz_string);

Loading…
Cancel
Save