From ab82bdd438f1b309c56ce93d1919ffa12f8b3c02 Mon Sep 17 00:00:00 2001 From: Niklas Ulvinge Date: Sun, 19 Jul 2015 19:59:46 +0200 Subject: [PATCH] Optimized RemoveAnnotations to a single call --- android/cpp/jni.cpp | 31 +++++++++++++++++++ .../mapboxgl/annotations/Annotation.java | 2 +- .../mapbox/mapboxgl/annotations/Marker.java | 11 ------- .../com/mapbox/mapboxgl/views/MapView.java | 11 +++++-- .../mapbox/mapboxgl/views/NativeMapView.java | 6 ++++ 5 files changed, 47 insertions(+), 14 deletions(-) diff --git a/android/cpp/jni.cpp b/android/cpp/jni.cpp index 46a73ef3f..89a22b502 100644 --- a/android/cpp/jni.cpp +++ b/android/cpp/jni.cpp @@ -746,6 +746,36 @@ void JNICALL nativeRemoveAnnotation(JNIEnv *env, jobject obj, jlong nativeMapVie nativeMapView->getMap().removeAnnotation((uint32_t)annotationId); } +void JNICALL nativeRemoveAnnotations(JNIEnv *env, jobject obj, jlong nativeMapViewPtr, jlongArray array) { + mbgl::Log::Debug(mbgl::Event::JNI, "nativeRemoveAnnotations"); + assert(nativeMapViewPtr != 0); + NativeMapView *nativeMapView = reinterpret_cast(nativeMapViewPtr); + + std::vector ids; + + if (env->ExceptionCheck() || (array == nullptr)) { + env->ExceptionDescribe(); + return; + } + + jsize len = env->GetArrayLength(array); + if (len < 0) { + env->ExceptionDescribe(); + return; + } + + ids.reserve(len); + jlong* jids = env->GetLongArrayElements(array, nullptr); + + for (jsize i = 0; i < len; i++) { + if(jids[i] == -1L) + continue; + ids.push_back((uint32_t) jids[i]); + } + + nativeMapView->getMap().removeAnnotations(ids); +} + jobject JNICALL nativeGetLatLng(JNIEnv *env, jobject obj, jlong nativeMapViewPtr) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeGetLatLng"); assert(nativeMapViewPtr != 0); @@ -1418,6 +1448,7 @@ extern "C" JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *reserved) { {"nativeAddPolygons", "(JLjava/util/List;)[J", reinterpret_cast(&nativeAddPolygons)}, {"nativeRemoveAnnotation", "(JJ)V", reinterpret_cast(&nativeRemoveAnnotation)}, + {"nativeRemoveAnnotations", "(J[J)V", reinterpret_cast(&nativeRemoveAnnotations)}, {"nativeGetLatLng", "(J)Lcom/mapbox/mapboxgl/geometry/LatLng;", reinterpret_cast(&nativeGetLatLng)}, {"nativeResetPosition", "(J)V", reinterpret_cast(&nativeResetPosition)}, diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java index e38af77cd..6feb733f0 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Annotation.java @@ -23,7 +23,7 @@ public abstract class Annotation { return alpha; } - public long getId() { + public Long getId() { return id; } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java index f0c53a36c..515852ae6 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/annotations/Marker.java @@ -49,17 +49,6 @@ public class Marker extends Annotation { return anchorV; } - /** - * NOTE: Google Maps Android API uses String for IDs. - * - * Internal C++ id is stored as unsigned int. - * - * @return the annotation id - */ - public long getId() { - return id; - } - public LatLng getPosition() { return position; } diff --git a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java index 4ad0d66b8..18da35927 100644 --- a/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java +++ b/android/java/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxgl/views/MapView.java @@ -270,9 +270,16 @@ public class MapView extends SurfaceView { } public void removeAnnotations() { - for (Annotation annotation : annotations) { - annotation.remove(); + long[] ids = new long[annotations.size()]; + for(int i=0; i