From 128b99e4c071f87a1255b49bd59f2e2a7933765d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=A2=C2=80=C2=9Cosana=C3=A2=C2=80=C2=9D?= Date: Fri, 2 Mar 2018 12:24:43 -0500 Subject: take advantage of MAS 3.0-beta.3 changes, ie fromLngLats() take double arrays now --- .../activity/style/FillExtrusionActivity.java | 39 +++---- platform/android/gradle/dependencies.gradle | 2 +- .../android/src/geojson/conversion/geometry.hpp | 112 +++++++++++---------- 3 files changed, 73 insertions(+), 80 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/FillExtrusionActivity.java b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/FillExtrusionActivity.java index 15d7024abf..b7f6b10b0d 100644 --- a/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/FillExtrusionActivity.java +++ b/platform/android/MapboxGLAndroidSDKTestApp/src/main/java/com/mapbox/mapboxsdk/testapp/activity/style/FillExtrusionActivity.java @@ -4,6 +4,7 @@ import android.graphics.Color; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; +import com.mapbox.geojson.Point; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.camera.CameraUpdateFactory; import com.mapbox.mapboxsdk.geometry.LatLng; @@ -14,6 +15,9 @@ import com.mapbox.mapboxsdk.style.sources.GeoJsonSource; import com.mapbox.mapboxsdk.testapp.R; import com.mapbox.geojson.Polygon; +import java.util.Arrays; +import java.util.List; + import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionColor; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionHeight; import static com.mapbox.mapboxsdk.style.layers.PropertyFactory.fillExtrusionOpacity; @@ -35,30 +39,17 @@ public class FillExtrusionActivity extends AppCompatActivity { mapView.onCreate(savedInstanceState); mapView.getMapAsync(map -> { mapboxMap = map; - Polygon domTower = Polygon.fromLngLats(new double[][][] { - new double[][] { - new double[] { - 5.12112557888031, - 52.09071040847704 - }, - new double[] { - 5.121227502822875, - 52.09053901776669 - }, - new double[] { - 5.121484994888306, - 52.090601641371805 - }, - new double[] { - 5.1213884353637695, - 52.090766439912635 - }, - new double[] { - 5.12112557888031, - 52.09071040847704 - } - } - }); + List> lngLats = Arrays.asList( + Arrays.asList( + Point.fromLngLat(5.12112557888031, 52.09071040847704), + Point.fromLngLat(5.121227502822875, 52.09053901776669), + Point.fromLngLat(5.121484994888306, 52.090601641371805), + Point.fromLngLat(5.1213884353637695, 52.090766439912635), + Point.fromLngLat(5.12112557888031, 52.09071040847704) + ) + ); + + Polygon domTower = Polygon.fromLngLats(lngLats); GeoJsonSource source = new GeoJsonSource("extrusion-source", domTower); map.addSource(source); diff --git a/platform/android/gradle/dependencies.gradle b/platform/android/gradle/dependencies.gradle index e696bc3ee3..90688f0058 100644 --- a/platform/android/gradle/dependencies.gradle +++ b/platform/android/gradle/dependencies.gradle @@ -8,7 +8,7 @@ ext { ] versions = [ - mapboxServices : '3.0.0-beta.2', + mapboxServices : '3.0.0-beta.3', mapboxTelemetry: '3.0.0-beta.1', mapboxGestures : '0.1.0-20180228.152340-13', supportLib : '25.4.0', diff --git a/platform/android/src/geojson/conversion/geometry.hpp b/platform/android/src/geojson/conversion/geometry.hpp index 5d2aab4c2d..48b9089692 100644 --- a/platform/android/src/geojson/conversion/geometry.hpp +++ b/platform/android/src/geojson/conversion/geometry.hpp @@ -31,74 +31,76 @@ public: } /** - * static LineString fromLngLats(List points) + * static LineString fromLngLats(double [][]) */ jni::jobject* operator()(const mapbox::geometry::line_string &geometry) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/geojson/LineString")).release(); - static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "(Ljava/util/List;)Lcom/mapbox/geojson/LineString;"); + static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "([[D)Lcom/mapbox/geojson/LineString;"); // Create - jni::LocalObject listOfPoints = jni::NewLocalObject(env, toGeoJsonListOfPoints(env, geometry)); - return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromLngLats, listOfPoints.get())); + jni::LocalObject> lngLatsArray = + jni::NewLocalObject(env, toLngLatArray(env, geometry)); + return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromLngLats, lngLatsArray.get())); } /** - * static MultiPoint fromLngLats(List points) + * static MultiPoint fromLngLats(double [][]) */ jni::jobject* operator()(const mapbox::geometry::multi_point &geometry) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/geojson/MultiPoint")).release(); - static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "(Ljava/util/List;)Lcom/mapbox/geojson/MultiPoint;"); + static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "([[D)Lcom/mapbox/geojson/MultiPoint;"); // Create - jni::LocalObject coordinates = jni::NewLocalObject(env, toGeoJsonListOfPoints(env, geometry)); - return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromLngLats, coordinates.get())); + jni::LocalObject> lngLatsArray = + jni::NewLocalObject(env, toLngLatArray(env, geometry)); + return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromLngLats, lngLatsArray.get())); } /** - * static Polygon fromLngLats(List> coordinates) + * static Polygon fromLngLats(double [][][]) */ jni::jobject* operator()(const mapbox::geometry::polygon &geometry) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/geojson/Polygon")).release(); - static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "(Ljava/util/List;)Lcom/mapbox/geojson/Polygon;"); + static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "([[[D)Lcom/mapbox/geojson/Polygon;"); // Create - jni::LocalObject shape = jni::NewLocalObject(env, toShape<>(env, geometry)); + jni::LocalObject> shape = + jni::NewLocalObject(env, shapeToLngLatArray<>(env, geometry)); return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromLngLats, shape.get())); } /** - * static MultiLineString fromLngLats(List> points) + * static MultiLineString fromLngLats(double [][][]) */ jni::jobject* operator()(const mapbox::geometry::multi_line_string &geometry) const { static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/geojson/MultiLineString")).release(); - static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "(Ljava/util/List;)Lcom/mapbox/geojson/MultiLineString;"); + static jni::jmethodID* fromLngLats = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "([[[D)Lcom/mapbox/geojson/MultiLineString;"); // Create - jni::LocalObject shape = jni::NewLocalObject(env, toShape<>(env, geometry)); + jni::LocalObject> shape = + jni::NewLocalObject(env,shapeToLngLatArray<>(env, geometry)); return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromLngLats, shape.get())); } /** * MultiPolygon (double[][][][]) -> [[[D + Object array == [[[[D - * - * static MultiPolygon fromLngLats(List>> points) */ jni::jobject* operator()(const mapbox::geometry::multi_polygon &geometry) const { - // ArrayList - static jni::jclass* arrayListClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/util/ArrayList")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *arrayListClass, "", "(I)V"); - static jni::jmethodID* add = &jni::GetMethodID(env, *arrayListClass, "add", "(ILjava/lang/Object;)V"); - jni::jobject* arrayList = &jni::NewObject(env, *arrayListClass, *constructor, geometry.size()); + + static jni::jclass* arrayClass = jni::NewGlobalRef(env, &jni::FindClass(env, "[[[D")).release(); + jni::LocalObject> jarray = + jni::NewLocalObject(env, &jni::NewObjectArray(env, geometry.size(), *arrayClass)); for(size_t i = 0; i < geometry.size(); i = i + 1) { - jni::LocalObject shape = jni::NewLocalObject(env, toShape<>(env, geometry.at(i))); - jni::CallMethod(env, arrayList, *add, i, shape.get()); + jni::LocalObject> shape = + jni::NewLocalObject(env, shapeToLngLatArray<>(env, geometry.at(i))); + jni::SetObjectArrayElement(env, *jarray, i, shape.get()); } // Create the MultiPolygon static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/geojson/MultiPolygon")).release(); - static jni::jmethodID* fromGeometries = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "(Ljava/util/List;)Lcom/mapbox/geojson/MultiPolygon;"); - return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromGeometries, arrayList)); + static jni::jmethodID* fromGeometries = &jni::GetStaticMethodID(env, *javaClass, "fromLngLats", "([[[[D)Lcom/mapbox/geojson/MultiPolygon;"); + return reinterpret_cast(jni::CallStaticMethod(env, *javaClass, *fromGeometries, jarray.get())); } /** @@ -125,50 +127,50 @@ public: private: /** - * vector> -> List - */ - static jni::jobject* toGeoJsonListOfPoints(JNIEnv& env, std::vector> points) { - - // ArrayList - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/util/ArrayList")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(I)V"); - static jni::jmethodID* add = &jni::GetMethodID(env, *javaClass, "add", "(ILjava/lang/Object;)V"); - jni::jobject* arrayList = &jni::NewObject(env, *javaClass, *constructor, points.size()); + * x, y -> jarray ([x,y]) + * + */ + static jni::jarray *toLngLatArray(JNIEnv &env, double x, double y) { + jni::jarray &jarray = jni::NewArray(env, 2); + jni::jdouble array[] = {x, y}; + jni::SetArrayRegion(env, jarray, 0, 2, array); + return &jarray; + } + /** + * vector> -> jarray -> [D + Object array == [[D (double[][]) + */ + static jni::jarray* toLngLatArray(JNIEnv &env, + std::vector> points) { - // Point - static jni::jclass* pointJavaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "com/mapbox/geojson/Point")).release(); - static jni::jmethodID* fromLngLat = &jni::GetStaticMethodID(env, *pointJavaClass, "fromLngLat", "(DD)Lcom/mapbox/geojson/Point;"); + static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "[D")).release(); + jni::jarray& jarray = jni::NewObjectArray(env, points.size(), *javaClass); for(size_t i = 0; i < points.size(); i = i + 1) { mapbox::geometry::point point = points.at(i); - jni::LocalObject pointObject = - jni::NewLocalObject(env, jni::CallStaticMethod(env, *pointJavaClass, *fromLngLat, point.x, point.y)); - jni::CallMethod(env, arrayList, *add, i, pointObject.get()); + jni::jarray *lngLatArray = toLngLatArray(env, point.x, point.y); + jni::SetObjectArrayElement(env, jarray, i, lngLatArray); } - return arrayList; + return &jarray; } /** - * geometry -> List> + * polygon + * multi_line_string -> jarray -> [[D + Object array == [[[D (double[][][]) */ template - static jni::jobject* toShape(JNIEnv& env, SHAPE value) { - - // ArrayList - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/util/ArrayList")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(I)V"); - static jni::jmethodID* add = &jni::GetMethodID(env, *javaClass, "add", "(ILjava/lang/Object;)V"); - jni::jobject* arrayList = &jni::NewObject(env, *javaClass, *constructor, value.size()); - - - for(size_t i = 0; i < value.size(); i = i + 1) { - jni::LocalObject listOfPoints = jni::NewLocalObject(env, toGeoJsonListOfPoints(env, value.at(i))); - jni::CallMethod(env, arrayList, *add, i, listOfPoints.get()); + static jni::jarray* shapeToLngLatArray(JNIEnv &env, SHAPE value) { + static jni::jclass *javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "[[D")).release(); + jni::jarray &jarray = jni::NewObjectArray(env, value.size(), *javaClass); + + for (size_t i = 0; i < value.size(); i = i + 1) { + jni::LocalObject> lngLatsArray = + jni::NewLocalObject(env, toLngLatArray(env, value.at(i))); + jni::SetObjectArrayElement(env, jarray, i, lngLatsArray.get()); } - return arrayList; + return &jarray; } }; -- cgit v1.2.1