From 9cd50a891dbd320e9e4816eef4545e0a41f9ab32 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 22 Aug 2018 12:27:43 -0700 Subject: [android] jni.hpp 4.0.0 --- cmake/mason-dependencies.cmake | 2 +- platform/android/scripts/generate-style-code.js | 4 - platform/android/src/annotation/marker.cpp | 12 +- platform/android/src/annotation/marker.hpp | 4 +- platform/android/src/annotation/multi_point.hpp | 8 +- platform/android/src/annotation/polygon.cpp | 15 +- platform/android/src/annotation/polygon.hpp | 2 +- platform/android/src/annotation/polyline.cpp | 6 +- platform/android/src/annotation/polyline.hpp | 2 +- platform/android/src/asset_manager_file_source.cpp | 6 +- platform/android/src/asset_manager_file_source.hpp | 2 +- platform/android/src/bitmap.cpp | 84 +++--- platform/android/src/bitmap.hpp | 14 +- platform/android/src/bitmap_factory.cpp | 10 +- platform/android/src/bitmap_factory.hpp | 4 +- platform/android/src/connectivity_listener.cpp | 2 +- platform/android/src/conversion/collection.cpp | 8 +- platform/android/src/conversion/collection.hpp | 4 +- platform/android/src/conversion/constant.cpp | 58 ++-- platform/android/src/conversion/constant.hpp | 57 ++-- platform/android/src/file_source.cpp | 39 +-- platform/android/src/file_source.hpp | 16 +- platform/android/src/geojson/feature.cpp | 26 +- platform/android/src/geojson/feature.hpp | 6 +- .../android/src/geojson/feature_collection.cpp | 14 +- .../android/src/geojson/feature_collection.hpp | 7 +- platform/android/src/geojson/geometry.cpp | 38 +-- platform/android/src/geojson/geometry.hpp | 6 +- .../android/src/geojson/geometry_collection.cpp | 22 +- .../android/src/geojson/geometry_collection.hpp | 8 +- platform/android/src/geojson/line_string.cpp | 23 +- platform/android/src/geojson/line_string.hpp | 12 +- platform/android/src/geojson/multi_line_string.cpp | 24 +- platform/android/src/geojson/multi_line_string.hpp | 12 +- platform/android/src/geojson/multi_point.cpp | 14 +- platform/android/src/geojson/multi_point.hpp | 10 +- platform/android/src/geojson/multi_polygon.cpp | 26 +- platform/android/src/geojson/multi_polygon.hpp | 10 +- platform/android/src/geojson/point.cpp | 8 +- platform/android/src/geojson/point.hpp | 7 +- platform/android/src/geojson/polygon.cpp | 16 +- platform/android/src/geojson/polygon.hpp | 12 +- platform/android/src/geojson/util.hpp | 16 +- platform/android/src/geometry/lat_lng.cpp | 10 +- platform/android/src/geometry/lat_lng.hpp | 6 +- platform/android/src/geometry/lat_lng_bounds.cpp | 8 +- platform/android/src/geometry/lat_lng_bounds.hpp | 4 +- platform/android/src/geometry/lat_lng_quad.cpp | 8 +- platform/android/src/geometry/lat_lng_quad.hpp | 4 +- platform/android/src/geometry/projected_meters.cpp | 4 +- platform/android/src/geometry/projected_meters.hpp | 2 +- platform/android/src/graphics/pointf.cpp | 8 +- platform/android/src/graphics/pointf.hpp | 4 +- platform/android/src/graphics/rectf.cpp | 16 +- platform/android/src/graphics/rectf.hpp | 8 +- platform/android/src/gson/json_array.cpp | 16 +- platform/android/src/gson/json_array.hpp | 7 +- platform/android/src/gson/json_element.cpp | 29 +- platform/android/src/gson/json_element.hpp | 7 +- platform/android/src/gson/json_object.cpp | 30 +- platform/android/src/gson/json_object.hpp | 7 +- platform/android/src/gson/json_primitive.hpp | 3 +- platform/android/src/http_file_source.cpp | 39 +-- platform/android/src/image.cpp | 7 +- platform/android/src/java/util.hpp | 30 +- .../android/src/jni/generic_global_ref_deleter.hpp | 45 --- platform/android/src/logger.cpp | 14 +- platform/android/src/map/camera_position.cpp | 10 +- platform/android/src/map/camera_position.hpp | 4 +- platform/android/src/map/image.cpp | 14 +- platform/android/src/map/image.hpp | 2 +- platform/android/src/map_renderer.cpp | 30 +- platform/android/src/map_renderer.hpp | 14 +- platform/android/src/map_renderer_runnable.cpp | 6 +- platform/android/src/native_map_view.cpp | 166 +++++------ platform/android/src/native_map_view.hpp | 104 +++---- platform/android/src/offline/offline_manager.cpp | 79 +++--- platform/android/src/offline/offline_manager.hpp | 24 +- platform/android/src/offline/offline_region.cpp | 127 ++++----- platform/android/src/offline/offline_region.hpp | 28 +- .../src/offline/offline_region_definition.cpp | 38 +-- .../src/offline/offline_region_definition.hpp | 16 +- .../android/src/offline/offline_region_error.cpp | 8 +- .../android/src/offline/offline_region_error.hpp | 2 +- .../android/src/offline/offline_region_status.cpp | 4 +- .../android/src/offline/offline_region_status.hpp | 2 +- platform/android/src/snapshotter/map_snapshot.cpp | 10 +- platform/android/src/snapshotter/map_snapshot.hpp | 6 +- .../android/src/snapshotter/map_snapshotter.cpp | 35 ++- .../android/src/snapshotter/map_snapshotter.hpp | 25 +- platform/android/src/style/conversion/filter.cpp | 4 +- platform/android/src/style/conversion/filter.hpp | 2 +- platform/android/src/style/conversion/position.cpp | 2 +- platform/android/src/style/conversion/position.hpp | 4 +- .../src/style/conversion/property_expression.hpp | 4 +- .../src/style/conversion/property_value.hpp | 22 +- .../src/style/conversion/transition_options.cpp | 2 +- .../src/style/conversion/transition_options.hpp | 4 +- .../android/src/style/layers/background_layer.cpp | 37 ++- .../android/src/style/layers/background_layer.hpp | 18 +- platform/android/src/style/layers/circle_layer.cpp | 97 +++---- platform/android/src/style/layers/circle_layer.hpp | 44 +-- platform/android/src/style/layers/custom_layer.cpp | 10 +- platform/android/src/style/layers/custom_layer.hpp | 5 +- .../src/style/layers/fill_extrusion_layer.cpp | 69 +++-- .../src/style/layers/fill_extrusion_layer.hpp | 32 +-- platform/android/src/style/layers/fill_layer.cpp | 65 ++--- platform/android/src/style/layers/fill_layer.hpp | 30 +- .../android/src/style/layers/heatmap_layer.cpp | 47 ++-- .../android/src/style/layers/heatmap_layer.hpp | 22 +- .../android/src/style/layers/hillshade_layer.cpp | 56 ++-- .../android/src/style/layers/hillshade_layer.hpp | 26 +- platform/android/src/style/layers/layer.cpp | 30 +- platform/android/src/style/layers/layer.cpp.ejs | 28 +- platform/android/src/style/layers/layer.hpp | 20 +- platform/android/src/style/layers/layer.hpp.ejs | 12 +- platform/android/src/style/layers/layers.cpp | 8 +- platform/android/src/style/layers/layers.hpp | 4 +- platform/android/src/style/layers/line_layer.cpp | 121 ++++---- platform/android/src/style/layers/line_layer.hpp | 54 ++-- platform/android/src/style/layers/raster_layer.cpp | 74 +++-- platform/android/src/style/layers/raster_layer.hpp | 34 +-- platform/android/src/style/layers/symbol_layer.cpp | 308 +++++++++------------ platform/android/src/style/layers/symbol_layer.hpp | 130 ++++----- .../android/src/style/layers/unknown_layer.cpp | 6 +- .../android/src/style/layers/unknown_layer.hpp | 4 +- platform/android/src/style/light.cpp | 38 ++- platform/android/src/style/light.cpp.ejs | 122 -------- platform/android/src/style/light.hpp | 26 +- platform/android/src/style/light.hpp.ejs | 59 ---- platform/android/src/style/position.cpp | 16 +- platform/android/src/style/position.hpp | 8 +- .../src/style/sources/custom_geometry_source.cpp | 56 ++-- .../src/style/sources/custom_geometry_source.hpp | 18 +- .../android/src/style/sources/geojson_source.cpp | 53 ++-- .../android/src/style/sources/geojson_source.hpp | 25 +- .../android/src/style/sources/image_source.cpp | 22 +- .../android/src/style/sources/image_source.hpp | 14 +- .../src/style/sources/raster_dem_source.cpp | 18 +- .../src/style/sources/raster_dem_source.hpp | 7 +- .../android/src/style/sources/raster_source.cpp | 18 +- .../android/src/style/sources/raster_source.hpp | 7 +- platform/android/src/style/sources/source.cpp | 25 +- platform/android/src/style/sources/source.hpp | 12 +- .../android/src/style/sources/unknown_source.cpp | 8 +- .../android/src/style/sources/unknown_source.hpp | 4 +- .../android/src/style/sources/vector_source.cpp | 26 +- .../android/src/style/sources/vector_source.hpp | 11 +- platform/android/src/style/transition_options.cpp | 4 +- platform/android/src/style/transition_options.hpp | 2 +- platform/android/src/style/value.cpp | 35 +-- platform/android/src/style/value.hpp | 1 + platform/android/src/test/main.jni.cpp | 4 +- platform/android/src/text/collator.cpp | 71 +++-- platform/android/src/text/collator_jni.hpp | 16 +- .../android/src/text/local_glyph_rasterizer.cpp | 19 +- 156 files changed, 1765 insertions(+), 2161 deletions(-) delete mode 100644 platform/android/src/jni/generic_global_ref_deleter.hpp delete mode 100644 platform/android/src/style/light.cpp.ejs delete mode 100644 platform/android/src/style/light.hpp.ejs diff --git a/cmake/mason-dependencies.cmake b/cmake/mason-dependencies.cmake index 7330f2f3a2..6c571db259 100644 --- a/cmake/mason-dependencies.cmake +++ b/cmake/mason-dependencies.cmake @@ -19,7 +19,7 @@ mason_use(cheap-ruler VERSION 2.5.3 HEADER_ONLY) mason_use(vector-tile VERSION 1.0.2 HEADER_ONLY) if(MBGL_PLATFORM STREQUAL "android") - mason_use(jni.hpp VERSION 4.0.0-rc8 HEADER_ONLY) + mason_use(jni.hpp VERSION 4.0.0 HEADER_ONLY) elseif(MBGL_PLATFORM STREQUAL "ios") mason_use(icu VERSION 58.1-min-size) elseif(MBGL_PLATFORM STREQUAL "linux") diff --git a/platform/android/scripts/generate-style-code.js b/platform/android/scripts/generate-style-code.js index 0825ef1c26..4a35b2d6a6 100755 --- a/platform/android/scripts/generate-style-code.js +++ b/platform/android/scripts/generate-style-code.js @@ -335,12 +335,8 @@ global.supportsPropertyFunction = function (property) { // Template processing // // Java + JNI Light (Peer model) -const lightHpp = ejs.compile(fs.readFileSync('platform/android/src/style/light.hpp.ejs', 'utf8'), {strict: true});; -const lightCpp = ejs.compile(fs.readFileSync('platform/android/src/style/light.cpp.ejs', 'utf8'), {strict: true});; const lightJava = ejs.compile(fs.readFileSync('platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/light/light.java.ejs', 'utf8'), {strict: true}); const lightJavaUnitTests = ejs.compile(fs.readFileSync('platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/light.junit.ejs', 'utf8'), {strict: true}); -writeIfModified(`platform/android/src/style/light.hpp`, lightHpp({properties: lightProperties})); -writeIfModified(`platform/android/src/style/light.cpp`, lightCpp({properties: lightProperties})); writeIfModified(`platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/style/light/Light.java`, lightJava({properties: lightProperties})); writeIfModified(`platform/android/MapboxGLAndroidSDKTestApp/src/androidTest/java/com/mapbox/mapboxsdk/testapp/style/LightTest.java`, lightJavaUnitTests({properties: lightProperties})); diff --git a/platform/android/src/annotation/marker.cpp b/platform/android/src/annotation/marker.cpp index b9a8c714a1..899f87a74f 100644 --- a/platform/android/src/annotation/marker.cpp +++ b/platform/android/src/annotation/marker.cpp @@ -3,16 +3,16 @@ namespace mbgl { namespace android { -mbgl::Point Marker::getPosition(jni::JNIEnv& env, jni::Object marker) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::Point Marker::getPosition(jni::JNIEnv& env, const jni::Object& marker) { + static auto& javaClass = jni::Class::Singleton(env); static auto positionField = javaClass.GetField>(env, "position"); - return LatLng::getGeometry(env, *jni::SeizeLocal(env, marker.Get(env, positionField))); + return LatLng::getGeometry(env, marker.Get(env, positionField)); } -std::string Marker::getIconId(jni::JNIEnv& env, jni::Object marker) { - static auto javaClass = jni::Class::Singleton(env); +std::string Marker::getIconId(jni::JNIEnv& env, const jni::Object& marker) { + static auto& javaClass = jni::Class::Singleton(env); static auto iconIdField = javaClass.GetField(env, "iconId"); - return jni::Make(env, *jni::SeizeLocal(env, marker.Get(env, iconIdField))); + return jni::Make(env, marker.Get(env, iconIdField)); } void Marker::registerNative(jni::JNIEnv& env) { diff --git a/platform/android/src/annotation/marker.hpp b/platform/android/src/annotation/marker.hpp index d03c244921..b38a25b4fb 100644 --- a/platform/android/src/annotation/marker.hpp +++ b/platform/android/src/annotation/marker.hpp @@ -15,9 +15,9 @@ public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/annotations/Marker"; }; - static mbgl::Point getPosition(jni::JNIEnv&, jni::Object); + static mbgl::Point getPosition(jni::JNIEnv&, const jni::Object&); - static std::string getIconId(jni::JNIEnv&, jni::Object); + static std::string getIconId(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/annotation/multi_point.hpp b/platform/android/src/annotation/multi_point.hpp index 1a6b945261..20f1b3eaf2 100644 --- a/platform/android/src/annotation/multi_point.hpp +++ b/platform/android/src/annotation/multi_point.hpp @@ -14,16 +14,16 @@ class MultiPoint : protected mbgl::util::noncopyable { protected: template - static Geometry toGeometry(JNIEnv& env, jni::Object pointsList) { - auto jarray = jni::SeizeLocal(env, java::util::List::toArray(env, pointsList)); + static Geometry toGeometry(JNIEnv& env, const jni::Object& pointsList) { + auto jarray = java::util::List::toArray(env, pointsList); - std::size_t size = jarray->Length(env); + std::size_t size = jarray.Length(env); Geometry geometry; geometry.reserve(size); for (std::size_t i = 0; i < size; i++) { - geometry.push_back(LatLng::getGeometry(env, *jni::SeizeLocal(env, jarray->Get(env, i)))); + geometry.push_back(LatLng::getGeometry(env, jarray.Get(env, i))); } return geometry; diff --git a/platform/android/src/annotation/polygon.cpp b/platform/android/src/annotation/polygon.cpp index 4168c3ceef..f22cffb100 100644 --- a/platform/android/src/annotation/polygon.cpp +++ b/platform/android/src/annotation/polygon.cpp @@ -5,8 +5,8 @@ namespace mbgl { namespace android { -mbgl::FillAnnotation Polygon::toAnnotation(jni::JNIEnv& env, jni::Object polygon) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::FillAnnotation Polygon::toAnnotation(jni::JNIEnv& env, const jni::Object& polygon) { + static auto& javaClass = jni::Class::Singleton(env); static auto points = javaClass.GetField>(env, "points"); static auto holes = javaClass.GetField>(env, "holes"); static auto alpha = javaClass.GetField(env, "alpha"); @@ -14,17 +14,14 @@ mbgl::FillAnnotation Polygon::toAnnotation(jni::JNIEnv& env, jni::Object(env, "strokeColor"); mbgl::Polygon geometry { - MultiPoint::toGeometry>(env, *jni::SeizeLocal(env, polygon.Get(env, points))) + MultiPoint::toGeometry>(env, polygon.Get(env, points)) }; - auto jHoleListsArray = jni::SeizeLocal(env, - java::util::List::toArray(env, - *jni::SeizeLocal(env, polygon.Get(env, holes)))); + auto jHoleListsArray = java::util::List::toArray(env, polygon.Get(env, holes)); - std::size_t jHoleListsSize = jHoleListsArray->Length(env); + std::size_t jHoleListsSize = jHoleListsArray.Length(env); for (std::size_t i = 0; i < jHoleListsSize; i++) { - geometry.push_back(MultiPoint::toGeometry>(env, - *jni::SeizeLocal(env, jHoleListsArray->Get(env, i)))); + geometry.push_back(MultiPoint::toGeometry>(env, jHoleListsArray.Get(env, i))); } mbgl::FillAnnotation annotation { geometry }; diff --git a/platform/android/src/annotation/polygon.hpp b/platform/android/src/annotation/polygon.hpp index 92d3fe0a71..bc21878ef3 100644 --- a/platform/android/src/annotation/polygon.hpp +++ b/platform/android/src/annotation/polygon.hpp @@ -11,7 +11,7 @@ class Polygon : private MultiPoint { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/annotations/Polygon"; }; - static mbgl::FillAnnotation toAnnotation(jni::JNIEnv&, jni::Object); + static mbgl::FillAnnotation toAnnotation(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/annotation/polyline.cpp b/platform/android/src/annotation/polyline.cpp index 080efa1960..d6161e856e 100644 --- a/platform/android/src/annotation/polyline.cpp +++ b/platform/android/src/annotation/polyline.cpp @@ -5,15 +5,15 @@ namespace mbgl { namespace android { -mbgl::LineAnnotation Polyline::toAnnotation(jni::JNIEnv& env, jni::Object polyline) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::LineAnnotation Polyline::toAnnotation(jni::JNIEnv& env, const jni::Object& polyline) { + static auto& javaClass = jni::Class::Singleton(env); static auto points = javaClass.GetField>(env, "points"); static auto alpha = javaClass.GetField(env, "alpha"); static auto color = javaClass.GetField(env, "color"); static auto width = javaClass.GetField(env, "width"); mbgl::LineAnnotation annotation { - MultiPoint::toGeometry>(env, *jni::SeizeLocal(env, polyline.Get(env, points))) + MultiPoint::toGeometry>(env, polyline.Get(env, points)) }; annotation.opacity = polyline.Get(env, alpha); diff --git a/platform/android/src/annotation/polyline.hpp b/platform/android/src/annotation/polyline.hpp index 36c2d49e6d..6178e98cfc 100644 --- a/platform/android/src/annotation/polyline.hpp +++ b/platform/android/src/annotation/polyline.hpp @@ -11,7 +11,7 @@ class Polyline : private MultiPoint { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/annotations/Polyline"; }; - static mbgl::LineAnnotation toAnnotation(jni::JNIEnv&, jni::Object); + static mbgl::LineAnnotation toAnnotation(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/asset_manager_file_source.cpp b/platform/android/src/asset_manager_file_source.cpp index aa65e3ff48..b9150deef9 100644 --- a/platform/android/src/asset_manager_file_source.cpp +++ b/platform/android/src/asset_manager_file_source.cpp @@ -38,10 +38,10 @@ private: AAssetManager* assetManager; }; -AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, jni::Object assetManager_) - : assetManager(assetManager_.NewGlobalRef(env)), +AssetManagerFileSource::AssetManagerFileSource(jni::JNIEnv& env, const jni::Object& assetManager_) + : assetManager(jni::NewGlobal(env, assetManager_)), impl(std::make_unique>("AssetManagerFileSource", - AAssetManager_fromJava(&env, jni::Unwrap(**assetManager)))) { + AAssetManager_fromJava(&env, jni::Unwrap(assetManager.get())))) { } AssetManagerFileSource::~AssetManagerFileSource() = default; diff --git a/platform/android/src/asset_manager_file_source.hpp b/platform/android/src/asset_manager_file_source.hpp index bb0809a442..4ec5b4c30e 100644 --- a/platform/android/src/asset_manager_file_source.hpp +++ b/platform/android/src/asset_manager_file_source.hpp @@ -14,7 +14,7 @@ template class Thread; class AssetManagerFileSource : public FileSource { public: - AssetManagerFileSource(jni::JNIEnv&, jni::Object); + AssetManagerFileSource(jni::JNIEnv&, const jni::Object&); ~AssetManagerFileSource() override; std::unique_ptr request(const Resource&, Callback) override; diff --git a/platform/android/src/bitmap.cpp b/platform/android/src/bitmap.cpp index 53136b868e..eb7c676b12 100644 --- a/platform/android/src/bitmap.cpp +++ b/platform/android/src/bitmap.cpp @@ -8,7 +8,7 @@ namespace android { class PixelGuard { public: - PixelGuard(jni::JNIEnv& env_, jni::Object bitmap_) : env(env_), bitmap(bitmap_) { + PixelGuard(jni::JNIEnv& env_, const jni::Object& bitmap_) : env(env_), bitmap(bitmap_) { const int result = AndroidBitmap_lockPixels(&env, jni::Unwrap(*bitmap), reinterpret_cast(&address)); if (result != ANDROID_BITMAP_RESULT_SUCCESS) { @@ -29,25 +29,21 @@ public: private: jni::JNIEnv& env; - jni::Object bitmap; + const jni::Object& bitmap; uint8_t* address; }; -jni::Object Bitmap::Config::Create(jni::JNIEnv& env, Value value) { - static auto _class = jni::Class::Singleton(env); +jni::Local> Bitmap::Config::Create(jni::JNIEnv& env, Value value) { + static auto& _class = jni::Class::Singleton(env); switch (value) { case ALPHA_8: - return _class.Get(env, - jni::StaticField>(env, _class, "ALPHA_8")); + return _class.Get(env, _class.GetStaticField>(env, "ALPHA_8")); case ARGB_4444: - return _class.Get(env, - jni::StaticField>(env, _class, "ARGB_4444")); + return _class.Get(env, _class.GetStaticField>(env, "ARGB_4444")); case ARGB_8888: - return _class.Get(env, - jni::StaticField>(env, _class, "ARGB_8888")); + return _class.Get(env, _class.GetStaticField>(env, "ARGB_8888")); case RGB_565: - return _class.Get(env, - jni::StaticField>(env, _class, "RGB_565")); + return _class.Get(env, _class.GetStaticField>(env, "RGB_565")); default: throw std::runtime_error("invalid enum value for Bitmap.Config"); } @@ -58,17 +54,41 @@ void Bitmap::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } -jni::Object Bitmap::CreateBitmap(jni::JNIEnv& env, - jni::jint width, - jni::jint height, - jni::Object config) { - static auto _class = jni::Class::Singleton(env); +jni::Local> Bitmap::CreateBitmap(jni::JNIEnv& env, + jni::jint width, + jni::jint height, + const jni::Object& config) { + static auto& _class = jni::Class::Singleton(env); static auto method = _class.GetStaticMethod (jni::jint, jni::jint, jni::Object)>(env, "createBitmap"); return _class.Call(env, method, width, height, config); } -jni::Object Bitmap::CreateBitmap(jni::JNIEnv& env, const PremultipliedImage& image) { +PremultipliedImage Bitmap::GetImage(jni::JNIEnv& env, const jni::Object& bitmap) { + AndroidBitmapInfo info; + const int result = AndroidBitmap_getInfo(&env, jni::Unwrap(*bitmap), &info); + if (result != ANDROID_BITMAP_RESULT_SUCCESS) { + throw std::runtime_error("bitmap decoding: couldn't get bitmap info"); + } + if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { + return Bitmap::GetImage(env, Bitmap::Copy(env, bitmap)); + } + + PixelGuard guard(env, bitmap); + + // Copy the Android Bitmap into the PremultipliedImage. + auto pixels = + std::make_unique(info.width * info.height * PremultipliedImage::channels); + for (uint32_t y = 0; y < info.height; y++) { + auto begin = guard.get() + y * info.stride; + std::copy(begin, begin + info.width * PremultipliedImage::channels, + pixels.get() + y * info.width * PremultipliedImage::channels); + } + + return { Size{ info.width, info.height }, std::move(pixels) }; +} + +jni::Local> Bitmap::CreateBitmap(jni::JNIEnv& env, const PremultipliedImage& image) { auto bitmap = CreateBitmap(env, image.size.width, image.size.height, Config::ARGB_8888); AndroidBitmapInfo info; @@ -93,32 +113,8 @@ jni::Object Bitmap::CreateBitmap(jni::JNIEnv& env, const PremultipliedIm return bitmap; } -PremultipliedImage Bitmap::GetImage(jni::JNIEnv& env, jni::Object bitmap) { - AndroidBitmapInfo info; - const int result = AndroidBitmap_getInfo(&env, jni::Unwrap(*bitmap), &info); - if (result != ANDROID_BITMAP_RESULT_SUCCESS) { - throw std::runtime_error("bitmap decoding: couldn't get bitmap info"); - } - if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { - return Bitmap::GetImage(env, Bitmap::Copy(env, bitmap)); - } - - PixelGuard guard(env, bitmap); - - // Copy the Android Bitmap into the PremultipliedImage. - auto pixels = - std::make_unique(info.width * info.height * PremultipliedImage::channels); - for (uint32_t y = 0; y < info.height; y++) { - auto begin = guard.get() + y * info.stride; - std::copy(begin, begin + info.width * PremultipliedImage::channels, - pixels.get() + y * info.width * PremultipliedImage::channels); - } - - return { Size{ info.width, info.height }, std::move(pixels) }; -} - -jni::Object Bitmap::Copy(jni::JNIEnv& env, jni::Object bitmap) { - static auto klass = jni::Class::Singleton(env); +jni::Local> Bitmap::Copy(jni::JNIEnv& env, const jni::Object& bitmap) { + static auto& klass = jni::Class::Singleton(env); static auto copy = klass.GetMethod (jni::Object, jni::jboolean)>(env, "copy"); return bitmap.Call(env, copy, Bitmap::Config::Create(env, Bitmap::Config::Value::ARGB_8888), jni::jni_false); diff --git a/platform/android/src/bitmap.hpp b/platform/android/src/bitmap.hpp index 2266bc0e67..9d96405c26 100644 --- a/platform/android/src/bitmap.hpp +++ b/platform/android/src/bitmap.hpp @@ -20,23 +20,23 @@ public: RGB_565, }; - static jni::Object Create(jni::JNIEnv&, Value); + static jni::Local> Create(jni::JNIEnv&, Value); }; static constexpr auto Name() { return "android/graphics/Bitmap"; }; static void registerNative(jni::JNIEnv&); - static jni::Object - CreateBitmap(jni::JNIEnv&, jni::jint width, jni::jint height, jni::Object); + static jni::Local> + CreateBitmap(jni::JNIEnv&, jni::jint width, jni::jint height, const jni::Object&); - static jni::Object + static jni::Local> CreateBitmap(jni::JNIEnv& env, jni::jint width, jni::jint height, Config::Value config) { return CreateBitmap(env, width, height, Config::Create(env, config)); } - static PremultipliedImage GetImage(jni::JNIEnv&, jni::Object); - static jni::Object CreateBitmap(jni::JNIEnv&, const PremultipliedImage&); - static jni::Object Copy(jni::JNIEnv&, jni::Object); + static PremultipliedImage GetImage(jni::JNIEnv&, const jni::Object&); + static jni::Local> CreateBitmap(jni::JNIEnv&, const PremultipliedImage&); + static jni::Local> Copy(jni::JNIEnv&, const jni::Object&); }; } // namespace android diff --git a/platform/android/src/bitmap_factory.cpp b/platform/android/src/bitmap_factory.cpp index 79cdc913a0..170bd52ea5 100644 --- a/platform/android/src/bitmap_factory.cpp +++ b/platform/android/src/bitmap_factory.cpp @@ -7,11 +7,11 @@ void BitmapFactory::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } -jni::Object BitmapFactory::DecodeByteArray(jni::JNIEnv& env, - jni::Array data, - jni::jint offset, - jni::jint length) { - static auto _class = jni::Class::Singleton(env); +jni::Local> BitmapFactory::DecodeByteArray(jni::JNIEnv& env, + jni::Array& data, + jni::jint offset, + jni::jint length) { + static auto& _class = jni::Class::Singleton(env); // Images are loaded with ARGB_8888 config, and premultiplied by default, which is exactly // what we want, so we're not providing a BitmapFactory.Options object. diff --git a/platform/android/src/bitmap_factory.hpp b/platform/android/src/bitmap_factory.hpp index 6e019d017c..f73b7a2906 100644 --- a/platform/android/src/bitmap_factory.hpp +++ b/platform/android/src/bitmap_factory.hpp @@ -12,8 +12,8 @@ public: static constexpr auto Name() { return "android/graphics/BitmapFactory"; }; static void registerNative(jni::JNIEnv&); - static jni::Object - DecodeByteArray(jni::JNIEnv&, jni::Array data, jni::jint offset, jni::jint length); + static jni::Local> + DecodeByteArray(jni::JNIEnv&, jni::Array& data, jni::jint offset, jni::jint length); }; } // namespace android diff --git a/platform/android/src/connectivity_listener.cpp b/platform/android/src/connectivity_listener.cpp index 3fcc580aab..9c13f1f749 100644 --- a/platform/android/src/connectivity_listener.cpp +++ b/platform/android/src/connectivity_listener.cpp @@ -21,7 +21,7 @@ namespace android { void ConnectivityListener::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/conversion/collection.cpp b/platform/android/src/conversion/collection.cpp index 3195458aa6..954a161baf 100644 --- a/platform/android/src/conversion/collection.cpp +++ b/platform/android/src/conversion/collection.cpp @@ -5,23 +5,23 @@ namespace mbgl { namespace android { namespace conversion { -std::vector toVector(JNIEnv& env, jni::Array array) { +std::vector toVector(JNIEnv& env, const jni::Array& array) { std::size_t len = array.Length(env); std::vector vector; vector.reserve(len); for (std::size_t i = 0; i < len; i++) { - vector.push_back(*convert(env, *jni::SeizeLocal(env, array.Get(env, i)))); + vector.push_back(jni::Make(env, array.Get(env, i))); } return vector; } -jni::Array toArray(JNIEnv& env, const std::vector& vector) { +jni::Local> toArray(JNIEnv& env, const std::vector& vector) { auto result = jni::Array::New(env, vector.size()); for (std::size_t i = 0; i < vector.size(); i++) { - result.Set(env, i, *jni::SeizeLocal(env, jni::Make(env, vector.at(i)))); + result.Set(env, i, jni::Make(env, vector.at(i))); } return result; diff --git a/platform/android/src/conversion/collection.hpp b/platform/android/src/conversion/collection.hpp index c6b08370ee..322ebb62e0 100644 --- a/platform/android/src/conversion/collection.hpp +++ b/platform/android/src/conversion/collection.hpp @@ -10,8 +10,8 @@ namespace mbgl { namespace android { namespace conversion { -std::vector toVector(JNIEnv& env, jni::Array array); -jni::Array toArray(JNIEnv& env, const std::vector&); +std::vector toVector(JNIEnv& env, const jni::Array& array); +jni::Local> toArray(JNIEnv& env, const std::vector&); } } diff --git a/platform/android/src/conversion/constant.cpp b/platform/android/src/conversion/constant.cpp index 16e8b32943..804d5fd146 100644 --- a/platform/android/src/conversion/constant.cpp +++ b/platform/android/src/conversion/constant.cpp @@ -1,4 +1,5 @@ #include "constant.hpp" +#include "collection.hpp" #include @@ -6,63 +7,46 @@ namespace mbgl { namespace android { namespace conversion { -Result Converter::operator()(jni::JNIEnv& env, const bool& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Boolean")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(Z)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jboolean) value)}; +Result>> Converter>, bool>::operator()(jni::JNIEnv& env, const bool& value) const { + return jni::Box(env, value ? jni::jni_true : jni::jni_false); } -Result Converter::operator()(jni::JNIEnv& env, const float& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(F)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; +Result>> Converter>, float>::operator()(jni::JNIEnv& env, const float& value) const { + return jni::Box(env, value); } -Result Converter::operator()(jni::JNIEnv& env, const double& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Double")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(D)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jfloat) value)}; +Result>> Converter>, double>::operator()(jni::JNIEnv& env, const double& value) const { + return jni::Box(env, value); } -Result Converter::operator()(jni::JNIEnv& env, const std::string& value) const { - return {jni::Make(env, value).Get()}; +Result>> Converter>, std::string>::operator()(jni::JNIEnv& env, const std::string& value) const { + return jni::Make(env, value); } -Result Converter::operator()(jni::JNIEnv& env, const Color& value) const { +Result>> Converter>, Color>::operator()(jni::JNIEnv& env, const Color& value) const { std::stringstream sstream; sstream << "rgba(" << value.r << ", " << value.g << ", " << value.b << ", " << value.a << ")"; - std::string result = sstream.str(); - return convert(env, result); + return jni::Make(env, sstream.str()); } -Result Converter>::operator()(jni::JNIEnv& env, const std::vector& value) const { - static jni::jclass* stringCass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/String")).release(); - jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *stringCass); +Result>> Converter>, std::vector>::operator()(jni::JNIEnv& env, const std::vector& value) const { + auto result = jni::Array::New(env, value.size()); - for(size_t i = 0; i < value.size(); i = i + 1) { - Result converted = convert(env, value.at(i)); - jni::SetObjectArrayElement(env, jarray, i, *converted); + for (std::size_t i = 0; i < value.size(); i++) { + result.Set(env, i, jni::Make(env, value.at(i))); } - return &jarray; + return result; } -Result Converter>::operator()(jni::JNIEnv& env, const std::vector& value) const { - static jni::jclass* floatClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Float")).release(); - jni::jarray& jarray = jni::NewObjectArray(env, value.size(), *floatClass); +Result>> Converter>, std::vector>::operator()(jni::JNIEnv& env, const std::vector& value) const { + auto result = jni::Array::New(env, value.size()); - for(size_t i = 0; i < value.size(); i = i + 1) { - Result converted = convert(env, value.at(i)); - jni::SetObjectArrayElement(env, jarray, i, *converted); + for (std::size_t i = 0; i < value.size(); i++) { + result.Set(env, i, jni::Box(env, value.at(i))); } - return &jarray; -} - -// Java -> C++ - -Result Converter::operator()(jni::JNIEnv& env, const jni::String& value) const { - return { jni::Make(env, value) }; + return result; } } // namespace conversion diff --git a/platform/android/src/conversion/constant.hpp b/platform/android/src/conversion/constant.hpp index 0e665cf56a..c6dafe1174 100644 --- a/platform/android/src/conversion/constant.hpp +++ b/platform/android/src/conversion/constant.hpp @@ -16,18 +16,18 @@ namespace android { namespace conversion { template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const bool& value) const; +struct Converter>, bool> { + Result>> operator()(jni::JNIEnv& env, const bool& value) const; }; template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const float& value) const; +struct Converter>, float> { + Result>> operator()(jni::JNIEnv& env, const float& value) const; }; template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const double& value) const; +struct Converter>, double> { + Result>> operator()(jni::JNIEnv& env, const double& value) const; }; /** @@ -35,61 +35,52 @@ struct Converter { * TODO: use BigDecimal for > 64 / unsigned? */ template -struct Converter::value>::type> { - Result operator()(jni::JNIEnv& env, const T& value) const { - static jni::jclass* javaClass = jni::NewGlobalRef(env, &jni::FindClass(env, "java/lang/Long")).release(); - static jni::jmethodID* constructor = &jni::GetMethodID(env, *javaClass, "", "(J)V"); - return {&jni::NewObject(env, *javaClass, *constructor, (jlong) value)}; +struct Converter>, T, typename std::enable_if::value>::type> { + Result>> operator()(jni::JNIEnv& env, const T& value) const { + return jni::Box(env, jni::jlong(value)); } }; // TODO: convert integral types to primitive jni types template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const std::string& value) const; +struct Converter>, std::string> { + Result>> operator()(jni::JNIEnv& env, const std::string& value) const; }; template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const Color& value) const; +struct Converter>, Color> { + Result>> operator()(jni::JNIEnv& env, const Color& value) const; }; template -struct Converter> { - Result operator()(jni::JNIEnv& env, const std::array& value) const { +struct Converter>, std::array> { + Result>> operator()(jni::JNIEnv& env, const std::array& value) const { std::vector v; for (const float& id : value) { v.push_back(id); } - return convert>(env, v); + return convert>, std::vector>(env, v); } }; template <> -struct Converter> { - Result operator()(jni::JNIEnv& env, const std::vector& value) const; +struct Converter>, std::vector> { + Result>> operator()(jni::JNIEnv& env, const std::vector& value) const; }; template <> -struct Converter> { - Result operator()(jni::JNIEnv& env, const std::vector& value) const; +struct Converter>, std::vector> { + Result>> operator()(jni::JNIEnv& env, const std::vector& value) const; }; template -struct Converter::value>> { - Result operator()(jni::JNIEnv& env, const T& value) const { - return convert(env, Enum::toString(value)); +struct Converter>, T, typename std::enable_if_t::value>> { + Result>> operator()(jni::JNIEnv& env, const T& value) const { + return convert>, std::string>(env, Enum::toString(value)); } }; -// Java -> C++ - -template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const jni::String& value) const; -}; - } // namespace conversion -} // namespace style +} // namespace android } // namespace mbgl diff --git a/platform/android/src/file_source.cpp b/platform/android/src/file_source.cpp index 32c304b909..d9b8e12dc4 100644 --- a/platform/android/src/file_source.cpp +++ b/platform/android/src/file_source.cpp @@ -1,4 +1,5 @@ #include "file_source.hpp" +#include "attach_env.hpp" #include #include @@ -6,7 +7,6 @@ #include #include "asset_manager_file_source.hpp" -#include "jni/generic_global_ref_deleter.hpp" namespace mbgl { namespace android { @@ -14,9 +14,9 @@ namespace android { // FileSource // FileSource::FileSource(jni::JNIEnv& _env, - jni::String accessToken, - jni::String _cachePath, - jni::Object assetManager) { + const jni::String& accessToken, + const jni::String& _cachePath, + const jni::Object& assetManager) { // Create a core default file source fileSource = std::make_unique( jni::Make(_env, _cachePath) + "/mbgl-offline.db", @@ -31,30 +31,31 @@ FileSource::FileSource(jni::JNIEnv& _env, FileSource::~FileSource() { } -jni::String FileSource::getAccessToken(jni::JNIEnv& env) { +jni::Local FileSource::getAccessToken(jni::JNIEnv& env) { return jni::Make(env, fileSource->getAccessToken()); } -void FileSource::setAccessToken(jni::JNIEnv& env, jni::String token) { +void FileSource::setAccessToken(jni::JNIEnv& env, const jni::String& token) { fileSource->setAccessToken(jni::Make(env, token)); } -void FileSource::setAPIBaseUrl(jni::JNIEnv& env, jni::String url) { +void FileSource::setAPIBaseUrl(jni::JNIEnv& env, const jni::String& url) { fileSource->setAPIBaseURL(jni::Make(env, url)); } -void FileSource::setResourceTransform(jni::JNIEnv& env, jni::Object transformCallback) { +void FileSource::setResourceTransform(jni::JNIEnv& env, const jni::Object& transformCallback) { if (transformCallback) { + auto global = jni::NewGlobal(env, transformCallback); resourceTransform = std::make_unique>(*Scheduler::GetCurrent(), // Capture the ResourceTransformCallback object as a managed global into // the lambda. It is released automatically when we're setting a new ResourceTransform in // a subsequent call. // Note: we're converting it to shared_ptr because this lambda is converted to a std::function, // which requires copyability of its captured variables. - [callback = std::shared_ptr(transformCallback.NewGlobalRef(env).release().Get(), GenericGlobalRefDeleter())] + [callback = std::make_shared(std::move(global))] (mbgl::Resource::Kind kind, const std::string&& url_) { android::UniqueEnv _env = android::AttachEnv(); - return FileSource::ResourceTransformCallback::onURL(*_env, jni::Object(*callback), int(kind), url_); + return FileSource::ResourceTransformCallback::onURL(*_env, *callback, int(kind), url_); }); fileSource->setResourceTransform(resourceTransform->self()); } else { @@ -92,13 +93,13 @@ jni::jboolean FileSource::isResumed(jni::JNIEnv&) { return (jboolean) false; } -FileSource* FileSource::getNativePeer(jni::JNIEnv& env, jni::Object jFileSource) { - static auto javaClass = jni::Class::Singleton(env); +FileSource* FileSource::getNativePeer(jni::JNIEnv& env, const jni::Object& jFileSource) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "nativePtr"); return reinterpret_cast(jFileSource.Get(env, field)); } -mbgl::DefaultFileSource& FileSource::getDefaultFileSource(jni::JNIEnv& env, jni::Object jFileSource) { +mbgl::DefaultFileSource& FileSource::getDefaultFileSource(jni::JNIEnv& env, const jni::Object& jFileSource) { FileSource* fileSource = FileSource::getNativePeer(env, jFileSource); assert(fileSource != nullptr); return *fileSource->fileSource; @@ -110,14 +111,14 @@ void FileSource::registerNative(jni::JNIEnv& env) { // https://developer.android.com/training/articles/perf-jni#faq_FindClass jni::Class::Singleton(env); - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&FileSource::getAccessToken, "getAccessToken"), @@ -133,13 +134,13 @@ void FileSource::registerNative(jni::JNIEnv& env) { // FileSource::ResourceTransformCallback // -std::string FileSource::ResourceTransformCallback::onURL(jni::JNIEnv& env, jni::Object callback, int kind, std::string url_) { - static auto javaClass = jni::Class::Singleton(env); +std::string FileSource::ResourceTransformCallback::onURL(jni::JNIEnv& env, const jni::Object& callback, int kind, std::string url_) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onURL"); return jni::Make(env, - *jni::SeizeLocal(env, callback.Call(env, method, kind, - *jni::SeizeLocal(env, jni::Make(env, url_))))); + callback.Call(env, method, kind, + jni::Make(env, url_))); } } // namespace android diff --git a/platform/android/src/file_source.hpp b/platform/android/src/file_source.hpp index f1b11c754c..572ac647b7 100644 --- a/platform/android/src/file_source.hpp +++ b/platform/android/src/file_source.hpp @@ -24,20 +24,20 @@ public: struct ResourceTransformCallback { static constexpr auto Name() { return "com/mapbox/mapboxsdk/storage/FileSource$ResourceTransformCallback"; } - static std::string onURL(jni::JNIEnv&, jni::Object, int, std::string); + static std::string onURL(jni::JNIEnv&, const jni::Object&, int, std::string); }; - FileSource(jni::JNIEnv&, jni::String, jni::String, jni::Object); + FileSource(jni::JNIEnv&, const jni::String&, const jni::String&, const jni::Object&); ~FileSource(); - jni::String getAccessToken(jni::JNIEnv&); + jni::Local getAccessToken(jni::JNIEnv&); - void setAccessToken(jni::JNIEnv&, jni::String); + void setAccessToken(jni::JNIEnv&, const jni::String&); - void setAPIBaseUrl(jni::JNIEnv&, jni::String); + void setAPIBaseUrl(jni::JNIEnv&, const jni::String&); - void setResourceTransform(jni::JNIEnv&, jni::Object); + void setResourceTransform(jni::JNIEnv&, const jni::Object&); void resume(jni::JNIEnv&); @@ -45,9 +45,9 @@ public: jni::jboolean isResumed(jni::JNIEnv&); - static FileSource* getNativePeer(jni::JNIEnv&, jni::Object); + static FileSource* getNativePeer(jni::JNIEnv&, const jni::Object&); - static mbgl::DefaultFileSource& getDefaultFileSource(jni::JNIEnv&, jni::Object); + static mbgl::DefaultFileSource& getDefaultFileSource(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/geojson/feature.cpp b/platform/android/src/geojson/feature.cpp index 809ac42ef7..e79c238864 100644 --- a/platform/android/src/geojson/feature.cpp +++ b/platform/android/src/geojson/feature.cpp @@ -8,18 +8,18 @@ namespace geojson { using namespace gson; -mbgl::Feature Feature::convert(jni::JNIEnv& env, jni::Object jFeature) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::Feature Feature::convert(jni::JNIEnv& env, const jni::Object& jFeature) { + static auto& javaClass = jni::Class::Singleton(env); static auto id = javaClass.GetMethod(env, "id"); static auto geometry = javaClass.GetMethod ()>(env, "geometry"); static auto properties = javaClass.GetMethod ()>(env, "properties"); - auto jId = jni::SeizeLocal(env, jFeature.Call(env, id)); + auto jId = jFeature.Call(env, id); return mbgl::Feature { - Geometry::convert(env, *jni::SeizeLocal(env, jFeature.Call(env, geometry))), - JsonObject::convert(env, *jni::SeizeLocal(env, jFeature.Call(env, properties))), - jId ? std::experimental::optional(jni::Make(env, *jId)) + Geometry::convert(env, jFeature.Call(env, geometry)), + JsonObject::convert(env, jFeature.Call(env, properties)), + jId ? std::experimental::optional(jni::Make(env, jId)) : std::experimental::nullopt }; } @@ -43,21 +43,21 @@ public: } }; -jni::Object convertFeature(jni::JNIEnv& env, const mbgl::Feature& value) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> convertFeature(jni::JNIEnv& env, const mbgl::Feature& value) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object, jni::Object, jni::String)>(env, "fromGeometry"); return javaClass.Call(env, method, - *jni::SeizeLocal(env, Geometry::New(env, value.geometry)), - *jni::SeizeLocal(env, JsonObject::New(env, value.properties)), - *jni::SeizeLocal(env, jni::Make(env, value.id ? value.id.value().match(FeatureIdVisitor()) : ""))); + Geometry::New(env, value.geometry), + JsonObject::New(env, value.properties), + jni::Make(env, value.id ? value.id.value().match(FeatureIdVisitor()) : "")); } -jni::Array> Feature::convert(jni::JNIEnv& env, const std::vector& value) { +jni::Local>> Feature::convert(jni::JNIEnv& env, const std::vector& value) { auto features = jni::Array>::New(env, value.size()); for (size_t i = 0; i < value.size(); i = i + 1) { - features.Set(env, i, *jni::SeizeLocal(env, convertFeature(env, value.at(i)))); + features.Set(env, i, convertFeature(env, value.at(i))); } return features; diff --git a/platform/android/src/geojson/feature.hpp b/platform/android/src/geojson/feature.hpp index fba4815e0c..fdf5d977ba 100644 --- a/platform/android/src/geojson/feature.hpp +++ b/platform/android/src/geojson/feature.hpp @@ -8,12 +8,12 @@ namespace mbgl { namespace android { namespace geojson { -class Feature : public jni::ObjectTag { +class Feature { public: static constexpr auto Name() { return "com/mapbox/geojson/Feature"; }; - static mbgl::Feature convert(jni::JNIEnv&, jni::Object); - static jni::Array> convert(jni::JNIEnv&, const std::vector&); + static mbgl::Feature convert(jni::JNIEnv&, const jni::Object&); + static jni::Local>> convert(jni::JNIEnv&, const std::vector&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/feature_collection.cpp b/platform/android/src/geojson/feature_collection.cpp index c2825e037b..f90d5226b7 100644 --- a/platform/android/src/geojson/feature_collection.cpp +++ b/platform/android/src/geojson/feature_collection.cpp @@ -6,24 +6,24 @@ namespace mbgl { namespace android { namespace geojson { -mbgl::FeatureCollection FeatureCollection::convert(jni::JNIEnv& env, jni::Object jCollection) { +mbgl::FeatureCollection FeatureCollection::convert(jni::JNIEnv& env, const jni::Object& jCollection) { auto collection = mbgl::FeatureCollection(); if (jCollection) { - auto jFeatureList = jni::SeizeLocal(env, FeatureCollection::features(env, jCollection)); - auto jFeatures = jni::SeizeLocal(env, java::util::List::toArray(env, *jFeatureList)); - auto size = size_t(jFeatures->Length(env)); + auto jFeatureList = FeatureCollection::features(env, jCollection); + auto jFeatures = java::util::List::toArray(env, jFeatureList); + auto size = size_t(jFeatures.Length(env)); collection.reserve(size); for (size_t i = 0; i < size; i++) { - collection.push_back(Feature::convert(env, *jni::SeizeLocal(env, jFeatures->Get(env, i)))); + collection.push_back(Feature::convert(env, jFeatures.Get(env, i))); } } return collection; } -jni::Object FeatureCollection::features(jni::JNIEnv& env, jni::Object jCollection) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> FeatureCollection::features(jni::JNIEnv& env, const jni::Object& jCollection) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "features"); return jCollection.Call(env, method); } diff --git a/platform/android/src/geojson/feature_collection.hpp b/platform/android/src/geojson/feature_collection.hpp index 1b45cca5de..66e92eacad 100644 --- a/platform/android/src/geojson/feature_collection.hpp +++ b/platform/android/src/geojson/feature_collection.hpp @@ -3,7 +3,6 @@ #include "../java/util.hpp" #include -#include #include @@ -11,13 +10,13 @@ namespace mbgl { namespace android { namespace geojson { -class FeatureCollection : private mbgl::util::noncopyable { +class FeatureCollection { public: static constexpr auto Name() { return "com/mapbox/geojson/FeatureCollection"; }; - static mbgl::FeatureCollection convert(jni::JNIEnv&, jni::Object); + static mbgl::FeatureCollection convert(jni::JNIEnv&, const jni::Object&); - static jni::Object features(jni::JNIEnv&, jni::Object); + static jni::Local> features(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/geometry.cpp b/platform/android/src/geojson/geometry.cpp index 4262b4ee69..2356af780a 100644 --- a/platform/android/src/geojson/geometry.cpp +++ b/platform/android/src/geojson/geometry.cpp @@ -22,65 +22,65 @@ public: jni::JNIEnv& env; - jni::Object operator()(const mbgl::Point &geometry) const { + jni::Local> operator()(const mbgl::Point &geometry) const { return Point::New(env, geometry); } - jni::Object operator()(const mbgl::LineString &geometry) const { + jni::Local> operator()(const mbgl::LineString &geometry) const { return LineString::New(env, geometry); } - jni::Object operator()(const mbgl::MultiLineString &geometry) const { + jni::Local> operator()(const mbgl::MultiLineString &geometry) const { return MultiLineString::New(env, geometry); } - jni::Object operator()(const mbgl::MultiPoint &geometry) const { + jni::Local> operator()(const mbgl::MultiPoint &geometry) const { return MultiPoint::New(env, geometry); } - jni::Object operator()(const mbgl::Polygon &geometry) const { + jni::Local> operator()(const mbgl::Polygon &geometry) const { return Polygon::New(env, geometry); } - jni::Object operator()(const mbgl::MultiPolygon &geometry) const { + jni::Local> operator()(const mbgl::MultiPolygon &geometry) const { return MultiPolygon::New(env, geometry); } - jni::Object operator()(const mapbox::geometry::geometry_collection &geometry) const { + jni::Local> operator()(const mapbox::geometry::geometry_collection &geometry) const { return GeometryCollection::New(env, geometry); } }; -jni::Object Geometry::New(jni::JNIEnv& env, mbgl::Geometry geometry) { +jni::Local> Geometry::New(jni::JNIEnv& env, mbgl::Geometry geometry) { GeometryEvaluator evaluator { env } ; return mbgl::Geometry::visit(geometry, evaluator); } -mbgl::Geometry Geometry::convert(jni::JNIEnv &env, jni::Object jGeometry) { +mbgl::Geometry Geometry::convert(jni::JNIEnv &env, const jni::Object& jGeometry) { auto type = Geometry::getType(env, jGeometry); if (type == Point::Type()) { - return { Point::convert(env, jni::Object(jGeometry.Get())) }; + return { Point::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } else if (type == MultiPoint::Type()) { - return { MultiPoint::convert(env, jni::Object(jGeometry.Get())) }; + return { MultiPoint::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } else if (type == LineString::Type()) { - return { LineString::convert(env, jni::Object(jGeometry.Get())) }; + return { LineString::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } else if (type == MultiLineString::Type()) { - return { MultiLineString::convert(env, jni::Object(jGeometry.Get())) }; + return { MultiLineString::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } else if (type == Polygon::Type()) { - return { Polygon::convert(env, jni::Object(jGeometry.Get())) }; + return { Polygon::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } else if (type == MultiPolygon::Type()) { - return { MultiPolygon::convert(env, jni::Object(jGeometry.Get())) }; + return { MultiPolygon::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } else if (type == GeometryCollection::Type()) { - return { GeometryCollection::convert(env, jni::Object(jGeometry.Get())) }; + return { GeometryCollection::convert(env, jni::Cast(env, jni::Class::Singleton(env), jGeometry)) }; } throw std::runtime_error(std::string {"Unsupported GeoJSON type: " } + type); } -std::string Geometry::getType(jni::JNIEnv &env, jni::Object jGeometry) { - static auto javaClass = jni::Class::Singleton(env); +std::string Geometry::getType(jni::JNIEnv &env, const jni::Object& jGeometry) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "type"); - return jni::Make(env, *jni::SeizeLocal(env, jGeometry.Call(env, method))); + return jni::Make(env, jGeometry.Call(env, method)); } void Geometry::registerNative(jni::JNIEnv &env) { diff --git a/platform/android/src/geojson/geometry.hpp b/platform/android/src/geojson/geometry.hpp index 836c3bd5a0..4bf55c858b 100644 --- a/platform/android/src/geojson/geometry.hpp +++ b/platform/android/src/geojson/geometry.hpp @@ -14,11 +14,11 @@ class Geometry { public: static constexpr auto Name() { return "com/mapbox/geojson/Geometry"; }; - static jni::Object New(jni::JNIEnv&, mbgl::Geometry); + static jni::Local> New(jni::JNIEnv&, mbgl::Geometry); - static mbgl::Geometry convert(jni::JNIEnv&, jni::Object); + static mbgl::Geometry convert(jni::JNIEnv&, const jni::Object&); - static std::string getType(jni::JNIEnv&, jni::Object); + static std::string getType(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/geometry_collection.cpp b/platform/android/src/geojson/geometry_collection.cpp index ad0af71214..cca909126d 100644 --- a/platform/android/src/geojson/geometry_collection.cpp +++ b/platform/android/src/geojson/geometry_collection.cpp @@ -5,36 +5,34 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object GeometryCollection::New(jni::JNIEnv& env, const mapbox::geometry::geometry_collection& collection) { +jni::Local> GeometryCollection::New(jni::JNIEnv& env, const mapbox::geometry::geometry_collection& collection) { // Create an array of geometries - auto jarray = jni::SeizeLocal(env, jni::Array>::New(env, collection.size())); + auto jarray = jni::Array>::New(env, collection.size()); for (size_t i = 0; i < collection.size(); i++) { - jarray->Set(env, i, *jni::SeizeLocal(env, Geometry::New(env, collection.at(i)))); + jarray.Set(env, i, Geometry::New(env, collection.at(i))); } // create the GeometryCollection - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "fromGeometries"); - return javaClass.Call(env, method, *jni::SeizeLocal(env, java::util::Arrays::asList(env, *jarray))); + return javaClass.Call(env, method, java::util::Arrays::asList(env, jarray)); } -mapbox::geometry::geometry_collection GeometryCollection::convert(jni::JNIEnv &env, jni::Object jCollection) { +mapbox::geometry::geometry_collection GeometryCollection::convert(jni::JNIEnv &env, const jni::Object& jCollection) { // Get geometries - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto getGeometries = javaClass.GetMethod ()>(env, "geometries"); // Turn into array - auto jarray = jni::SeizeLocal(env, - java::util::List::toArray(env, - *jni::SeizeLocal(env, jCollection.Call(env, getGeometries)))); + auto jarray = java::util::List::toArray(env, jCollection.Call(env, getGeometries)); // Convert each geometry mapbox::geometry::geometry_collection collection{}; - auto size = jarray->Length(env); + auto size = jarray.Length(env); for (jni::jsize i = 0; i < size; i++) { - collection.push_back(Geometry::convert(env, *jni::SeizeLocal(env, jarray->Get(env, i)))); + collection.push_back(Geometry::convert(env, jarray.Get(env, i))); } return collection; diff --git a/platform/android/src/geojson/geometry_collection.hpp b/platform/android/src/geojson/geometry_collection.hpp index a301d86933..9f02ac848d 100644 --- a/platform/android/src/geojson/geometry_collection.hpp +++ b/platform/android/src/geojson/geometry_collection.hpp @@ -8,15 +8,15 @@ namespace mbgl { namespace android { namespace geojson { -class GeometryCollection : public Geometry { +class GeometryCollection { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/GeometryCollection"; }; - static constexpr auto Type() { return "GeometryCollection"; }; - static jni::Object New(jni::JNIEnv&, const mapbox::geometry::geometry_collection&); + static jni::Local> New(jni::JNIEnv&, const mapbox::geometry::geometry_collection&); - static mapbox::geometry::geometry_collection convert(jni::JNIEnv&, jni::Object); + static mapbox::geometry::geometry_collection convert(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/line_string.cpp b/platform/android/src/geojson/line_string.cpp index 5a18a02bb7..ae1345c958 100644 --- a/platform/android/src/geojson/line_string.cpp +++ b/platform/android/src/geojson/line_string.cpp @@ -7,42 +7,41 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object LineString::New(jni::JNIEnv& env, const mbgl::LineString& lineString) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> LineString::New(jni::JNIEnv& env, const mbgl::LineString& lineString) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod(jni::Object)>(env, "fromLngLats"); - return javaClass.Call(env, method, - *jni::SeizeLocal(env, asPointsList(env, lineString))); + return javaClass.Call(env, method, asPointsList(env, lineString)); } -mapbox::geojson::line_string LineString::convert(jni::JNIEnv &env, jni::Object jLineString) { +mapbox::geojson::line_string LineString::convert(jni::JNIEnv &env, const jni::Object& jLineString) { mapbox::geojson::line_string lineString; if (jLineString) { - lineString = LineString::convert(env, *jni::SeizeLocal(env, LineString::coordinates(env, jLineString))); + lineString = LineString::convert(env, LineString::coordinates(env, jLineString)); } return lineString; } -mapbox::geojson::line_string LineString::convert(jni::JNIEnv &env, jni::Object*/> jPointList) { +mapbox::geojson::line_string LineString::convert(jni::JNIEnv &env, const jni::Object*/>& jPointList) { mapbox::geojson::line_string lineString; if (jPointList) { - auto jPointArray = jni::SeizeLocal(env, java::util::List::toArray(env, jPointList)); - auto size = jPointArray->Length(env); + auto jPointArray = java::util::List::toArray(env, jPointList); + auto size = jPointArray.Length(env); lineString.reserve(size); for (std::size_t i = 0; i < size; i++) { - lineString.push_back(Point::convert(env, *jni::SeizeLocal(env, jPointArray->Get(env, i)))); + lineString.push_back(Point::convert(env, jPointArray.Get(env, i))); } } return lineString; } -jni::Object LineString::coordinates(jni::JNIEnv &env, jni::Object jLineString) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> LineString::coordinates(jni::JNIEnv &env, const jni::Object& jLineString) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "coordinates"); return jLineString.Call(env, method); } diff --git a/platform/android/src/geojson/line_string.hpp b/platform/android/src/geojson/line_string.hpp index 4df9349185..906d809fa8 100644 --- a/platform/android/src/geojson/line_string.hpp +++ b/platform/android/src/geojson/line_string.hpp @@ -14,19 +14,19 @@ namespace android { namespace geojson { -class LineString : public Geometry { +class LineString { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/LineString"; }; - static constexpr auto Type() { return "LineString"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::LineString&); + static jni::Local> New(jni::JNIEnv&, const mbgl::LineString&); - static mapbox::geojson::line_string convert(jni::JNIEnv&, jni::Object); + static mapbox::geojson::line_string convert(jni::JNIEnv&, const jni::Object&); - static mapbox::geojson::line_string convert(jni::JNIEnv&, jni::Object*/>); + static mapbox::geojson::line_string convert(jni::JNIEnv&, const jni::Object*/>&); - static jni::Object coordinates(jni::JNIEnv&, jni::Object); + static jni::Local> coordinates(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/multi_line_string.cpp b/platform/android/src/geojson/multi_line_string.cpp index 0a0974062c..1aaf53c01f 100644 --- a/platform/android/src/geojson/multi_line_string.cpp +++ b/platform/android/src/geojson/multi_line_string.cpp @@ -7,44 +7,42 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object MultiLineString::New(jni::JNIEnv& env, const mbgl::MultiLineString& multiLineString) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> MultiLineString::New(jni::JNIEnv& env, const mbgl::MultiLineString& multiLineString) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "fromLngLats"); - return javaClass.Call(env, method, - *jni::SeizeLocal(env, asPointsListsList(env, multiLineString))); + return javaClass.Call(env, method, asPointsListsList(env, multiLineString)); } -mapbox::geojson::multi_line_string MultiLineString::convert(jni::JNIEnv &env, jni::Object jMultiLineString) { +mapbox::geojson::multi_line_string MultiLineString::convert(jni::JNIEnv &env, const jni::Object& jMultiLineString) { mapbox::geojson::multi_line_string multiLineString; if (jMultiLineString) { - multiLineString = MultiLineString::convert(env, - *jni::SeizeLocal(env, MultiLineString::coordinates(env, jMultiLineString))); + multiLineString = MultiLineString::convert(env, MultiLineString::coordinates(env, jMultiLineString)); } return multiLineString; } -mapbox::geojson::multi_line_string MultiLineString::convert(jni::JNIEnv &env, jni::Object>*/> jPointListsList) { +mapbox::geojson::multi_line_string MultiLineString::convert(jni::JNIEnv &env, const jni::Object>*/>& jPointListsList) { mapbox::geojson::multi_line_string multiLineString; if (jPointListsList) { - auto jPositionListsArray = jni::SeizeLocal(env, java::util::List::toArray(env, jPointListsList)); + auto jPositionListsArray = java::util::List::toArray(env, jPointListsList); - auto size = jPositionListsArray->Length(env); + auto size = jPositionListsArray.Length(env); multiLineString.reserve(size); for (std::size_t i = 0; i < size; i++) { - multiLineString.push_back(LineString::convert(env, *jni::SeizeLocal(env, jPositionListsArray->Get(env, i)))); + multiLineString.push_back(LineString::convert(env, jPositionListsArray.Get(env, i))); } } return multiLineString; } -jni::Object MultiLineString::coordinates(jni::JNIEnv &env, jni::Object jLineString) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> MultiLineString::coordinates(jni::JNIEnv &env, const jni::Object& jLineString) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "coordinates"); return jLineString.Call(env, method); } diff --git a/platform/android/src/geojson/multi_line_string.hpp b/platform/android/src/geojson/multi_line_string.hpp index c66aadaf03..65ce43bd1f 100644 --- a/platform/android/src/geojson/multi_line_string.hpp +++ b/platform/android/src/geojson/multi_line_string.hpp @@ -12,19 +12,19 @@ namespace mbgl { namespace android { namespace geojson { -class MultiLineString : public Geometry { +class MultiLineString { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/MultiLineString"; }; - static constexpr auto Type() { return "MultiLineString"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::MultiLineString&); + static jni::Local> New(jni::JNIEnv&, const mbgl::MultiLineString&); - static mapbox::geojson::multi_line_string convert(jni::JNIEnv&, jni::Object); + static mapbox::geojson::multi_line_string convert(jni::JNIEnv&, const jni::Object&); - static mapbox::geojson::multi_line_string convert(jni::JNIEnv&, jni::Object>*/>); + static mapbox::geojson::multi_line_string convert(jni::JNIEnv&, const jni::Object>*/>&); - static jni::Object coordinates(jni::JNIEnv&, jni::Object); + static jni::Local> coordinates(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/multi_point.cpp b/platform/android/src/geojson/multi_point.cpp index 5f51058f38..d530ef721f 100644 --- a/platform/android/src/geojson/multi_point.cpp +++ b/platform/android/src/geojson/multi_point.cpp @@ -8,26 +8,26 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object MultiPoint::New(JNIEnv& env, const mbgl::MultiPoint& multiPoint) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> MultiPoint::New(JNIEnv& env, const mbgl::MultiPoint& multiPoint) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod(jni::Object)>(env, "fromLngLats"); - return javaClass.Call(env, method, *jni::SeizeLocal(env, asPointsList(env, multiPoint))); + return javaClass.Call(env, method, asPointsList(env, multiPoint)); } -mapbox::geojson::multi_point MultiPoint::convert(jni::JNIEnv &env, jni::Object jMultiPoint) { +mapbox::geojson::multi_point MultiPoint::convert(jni::JNIEnv& env, const jni::Object& jMultiPoint) { mapbox::geojson::multi_point multiPoint; if (jMultiPoint) { multiPoint = convertExplicit( - LineString::convert(env, *jni::SeizeLocal(env, MultiPoint::coordinates(env, jMultiPoint)))); + LineString::convert(env, MultiPoint::coordinates(env, jMultiPoint))); } return multiPoint; } -jni::Object MultiPoint::coordinates(jni::JNIEnv &env, jni::Object jMultiPoint) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> MultiPoint::coordinates(jni::JNIEnv& env, const jni::Object& jMultiPoint) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "coordinates"); return jMultiPoint.Call(env, method); } diff --git a/platform/android/src/geojson/multi_point.hpp b/platform/android/src/geojson/multi_point.hpp index 0df16bfd6a..a3ca49b731 100644 --- a/platform/android/src/geojson/multi_point.hpp +++ b/platform/android/src/geojson/multi_point.hpp @@ -13,17 +13,17 @@ namespace mbgl { namespace android { namespace geojson { -class MultiPoint : public Geometry { +class MultiPoint { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/MultiPoint"; }; - static constexpr auto Type() { return "MultiPoint"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::MultiPoint&); + static jni::Local> New(jni::JNIEnv&, const mbgl::MultiPoint&); - static mapbox::geojson::multi_point convert(jni::JNIEnv&, jni::Object); + static mapbox::geojson::multi_point convert(jni::JNIEnv&, const jni::Object&); - static jni::Object coordinates(jni::JNIEnv&, jni::Object); + static jni::Local> coordinates(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/multi_polygon.cpp b/platform/android/src/geojson/multi_polygon.cpp index 109ac714c3..3c5c3ec338 100644 --- a/platform/android/src/geojson/multi_polygon.cpp +++ b/platform/android/src/geojson/multi_polygon.cpp @@ -7,41 +7,39 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object MultiPolygon::New(JNIEnv& env, const mbgl::MultiPolygon& multiPolygon) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> MultiPolygon::New(JNIEnv& env, const mbgl::MultiPolygon& multiPolygon) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "fromLngLats"); - auto jarray = jni::SeizeLocal(env, - jni::Array>::New(env, multiPolygon.size())); + auto jarray = jni::Array>::New(env, multiPolygon.size()); for (size_t i = 0; i < multiPolygon.size(); i++) { - jarray->Set(env, i, *jni::SeizeLocal(env, asPointsListsList(env, multiPolygon.at(i)))); + jarray.Set(env, i, asPointsListsList(env, multiPolygon.at(i))); } - return javaClass.Call(env, method, - *jni::SeizeLocal(env, java::util::Arrays::asList(env, *jarray))); + return javaClass.Call(env, method, java::util::Arrays::asList(env, jarray)); } -mapbox::geojson::multi_polygon MultiPolygon::convert(jni::JNIEnv &env, jni::Object jMultiPolygon) { +mapbox::geojson::multi_polygon MultiPolygon::convert(jni::JNIEnv& env, const jni::Object& jMultiPolygon) { mapbox::geojson::multi_polygon multiPolygon; if (jMultiPolygon) { - auto jPointListsListList = jni::SeizeLocal(env, MultiPolygon::coordinates(env, jMultiPolygon)); - auto jPointListsListArray = jni::SeizeLocal(env, java::util::List::toArray(env, *jPointListsListList)); + auto jPointListsListList = MultiPolygon::coordinates(env, jMultiPolygon); + auto jPointListsListArray = java::util::List::toArray(env, jPointListsListList); - auto size = jPointListsListArray->Length(env); + auto size = jPointListsListArray.Length(env); multiPolygon.reserve(size); for (size_t i = 0; i < size; i++) { - multiPolygon.push_back(Polygon::convert(env, *jni::SeizeLocal(env, jPointListsListArray->Get(env, i)))); + multiPolygon.push_back(Polygon::convert(env, jPointListsListArray.Get(env, i))); } } return multiPolygon; } -jni::Object MultiPolygon::coordinates(jni::JNIEnv &env, jni::Object jPolygon) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> MultiPolygon::coordinates(jni::JNIEnv& env, const jni::Object& jPolygon) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "coordinates"); return jPolygon.Call(env, method); } diff --git a/platform/android/src/geojson/multi_polygon.hpp b/platform/android/src/geojson/multi_polygon.hpp index 3477e989ea..fd7b08016d 100644 --- a/platform/android/src/geojson/multi_polygon.hpp +++ b/platform/android/src/geojson/multi_polygon.hpp @@ -12,17 +12,17 @@ namespace mbgl { namespace android { namespace geojson { -class MultiPolygon : public Geometry { +class MultiPolygon { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/MultiPolygon"; }; - static constexpr auto Type() { return "MultiPolygon"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::MultiPolygon&); + static jni::Local> New(jni::JNIEnv&, const mbgl::MultiPolygon&); - static mapbox::geojson::multi_polygon convert(jni::JNIEnv&, jni::Object); + static mapbox::geojson::multi_polygon convert(jni::JNIEnv&, const jni::Object&); - static jni::Object coordinates(jni::JNIEnv&, jni::Object); + static jni::Local> coordinates(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/point.cpp b/platform/android/src/geojson/point.cpp index 7fcc183dc1..2000447c0f 100644 --- a/platform/android/src/geojson/point.cpp +++ b/platform/android/src/geojson/point.cpp @@ -4,14 +4,14 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object Point::New(jni::JNIEnv& env, const mbgl::Point& point) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Point::New(jni::JNIEnv& env, const mbgl::Point& point) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::jdouble, jni::jdouble)>(env, "fromLngLat"); return javaClass.Call(env, method, point.x, point.y); } -mbgl::Point Point::convert(jni::JNIEnv &env, jni::Object jPoint) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::Point Point::convert(jni::JNIEnv &env, const jni::Object& jPoint) { + static auto& javaClass = jni::Class::Singleton(env); static auto longitude = javaClass.GetMethod(env, "longitude"); static auto latitude = javaClass.GetMethod(env, "latitude"); diff --git a/platform/android/src/geojson/point.hpp b/platform/android/src/geojson/point.hpp index d5cc7780f3..b5d71ecae1 100644 --- a/platform/android/src/geojson/point.hpp +++ b/platform/android/src/geojson/point.hpp @@ -10,13 +10,14 @@ namespace mbgl { namespace android { namespace geojson { -class Point : public Geometry { +class Point { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/Point"; }; static constexpr auto Type() { return "Point"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::Point&); - static mbgl::Point convert(jni::JNIEnv&, jni::Object); + static jni::Local> New(jni::JNIEnv&, const mbgl::Point&); + static mbgl::Point convert(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geojson/polygon.cpp b/platform/android/src/geojson/polygon.cpp index add843e294..4437d134a8 100644 --- a/platform/android/src/geojson/polygon.cpp +++ b/platform/android/src/geojson/polygon.cpp @@ -8,24 +8,24 @@ namespace mbgl { namespace android { namespace geojson { -jni::Object Polygon::New(jni::JNIEnv& env, const mbgl::Polygon& polygon) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Polygon::New(jni::JNIEnv& env, const mbgl::Polygon& polygon) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "fromLngLats"); - return javaClass.Call(env, method, *jni::SeizeLocal(env, asPointsListsList(env, polygon))); + return javaClass.Call(env, method, asPointsListsList(env, polygon)); } -mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, jni::Object jPolygon) { +mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, const jni::Object& jPolygon) { mapbox::geojson::polygon polygon; if (jPolygon) { - polygon = Polygon::convert(env, *jni::SeizeLocal(env, Polygon::coordinates(env, jPolygon))); + polygon = Polygon::convert(env, Polygon::coordinates(env, jPolygon)); } return polygon; } -mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, jni::Object>*/> jPointListsList) { +mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, const jni::Object>*/>& jPointListsList) { mapbox::geojson::polygon polygon; if (jPointListsList) { @@ -40,8 +40,8 @@ mapbox::geojson::polygon Polygon::convert(jni::JNIEnv &env, jni::Object Polygon::coordinates(jni::JNIEnv &env, jni::Object jPolygon) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Polygon::coordinates(jni::JNIEnv &env, const jni::Object& jPolygon) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "coordinates"); return jPolygon.Call(env, method); } diff --git a/platform/android/src/geojson/polygon.hpp b/platform/android/src/geojson/polygon.hpp index adfa60df4d..8e1761feda 100644 --- a/platform/android/src/geojson/polygon.hpp +++ b/platform/android/src/geojson/polygon.hpp @@ -13,19 +13,19 @@ namespace mbgl { namespace android { namespace geojson { -class Polygon : public Geometry { +class Polygon { public: + using SuperTag = Geometry; static constexpr auto Name() { return "com/mapbox/geojson/Polygon"; }; - static constexpr auto Type() { return "Polygon"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::Polygon&); + static jni::Local> New(jni::JNIEnv&, const mbgl::Polygon&); - static mapbox::geojson::polygon convert(jni::JNIEnv &, jni::Object); + static mapbox::geojson::polygon convert(jni::JNIEnv &, const jni::Object&); - static mapbox::geojson::polygon convert(jni::JNIEnv&, jni::Object>*/>); + static mapbox::geojson::polygon convert(jni::JNIEnv&, const jni::Object>*/>&); - static jni::Object coordinates(jni::JNIEnv&, jni::Object); + static jni::Local> coordinates(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv &); }; diff --git a/platform/android/src/geojson/util.hpp b/platform/android/src/geojson/util.hpp index e889931c56..59154516fa 100644 --- a/platform/android/src/geojson/util.hpp +++ b/platform/android/src/geojson/util.hpp @@ -23,28 +23,28 @@ To convertExplicit(From&& src) { * Geometry -> List */ template -static jni::Object asPointsList(jni::JNIEnv& env, const T& pointsList) { - auto jarray = jni::SeizeLocal(env, jni::Array>::New(env, pointsList.size())); +static jni::Local> asPointsList(jni::JNIEnv& env, const T& pointsList) { + auto jarray = jni::Array>::New(env, pointsList.size()); for (jni::jsize i = 0; i < pointsList.size(); i++) { - jarray->Set(env, i, *jni::SeizeLocal(env, Point::New(env, pointsList.at(i)))); + jarray.Set(env, i, Point::New(env, pointsList.at(i))); } - return java::util::Arrays::asList(env, *jarray); + return java::util::Arrays::asList(env, jarray); } /** * Geometry -> List> */ template -static jni::Object asPointsListsList(JNIEnv& env, SHAPE value) { - auto jarray = jni::SeizeLocal(env, jni::Array>::New(env, value.size())); +static jni::Local> asPointsListsList(JNIEnv& env, const SHAPE& value) { + auto jarray = jni::Array>::New(env, value.size()); for (size_t i = 0; i < value.size(); i++) { - jarray->Set(env, i, *jni::SeizeLocal(env, asPointsList(env, value[i]))); + jarray.Set(env, i, asPointsList(env, value[i])); } - return java::util::Arrays::asList(env, *jarray); + return java::util::Arrays::asList(env, jarray); } } // namespace geojson diff --git a/platform/android/src/geometry/lat_lng.cpp b/platform/android/src/geometry/lat_lng.cpp index 135755d67e..5d8313cb2a 100644 --- a/platform/android/src/geometry/lat_lng.cpp +++ b/platform/android/src/geometry/lat_lng.cpp @@ -3,20 +3,20 @@ namespace mbgl { namespace android { -jni::Object LatLng::New(jni::JNIEnv& env, const mbgl::LatLng& latLng) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> LatLng::New(jni::JNIEnv& env, const mbgl::LatLng& latLng) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, latLng.latitude(), latLng.longitude()); } -mbgl::Point LatLng::getGeometry(jni::JNIEnv& env, jni::Object latLng) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::Point LatLng::getGeometry(jni::JNIEnv& env, const jni::Object& latLng) { + static auto& javaClass = jni::Class::Singleton(env); static auto latitudeField = javaClass.GetField(env, "latitude"); static auto longitudeField = javaClass.GetField(env, "longitude"); return mbgl::Point(latLng.Get(env, longitudeField), latLng.Get(env, latitudeField)); } -mbgl::LatLng LatLng::getLatLng(jni::JNIEnv& env, jni::Object latLng) { +mbgl::LatLng LatLng::getLatLng(jni::JNIEnv& env, const jni::Object& latLng) { auto point = LatLng::getGeometry(env, latLng); return mbgl::LatLng(point.y, point.x); } diff --git a/platform/android/src/geometry/lat_lng.hpp b/platform/android/src/geometry/lat_lng.hpp index 4431f1c739..30b7db1ef3 100644 --- a/platform/android/src/geometry/lat_lng.hpp +++ b/platform/android/src/geometry/lat_lng.hpp @@ -14,11 +14,11 @@ public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/geometry/LatLng"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::LatLng&); + static jni::Local> New(jni::JNIEnv&, const mbgl::LatLng&); - static mbgl::Point getGeometry(jni::JNIEnv&, jni::Object); + static mbgl::Point getGeometry(jni::JNIEnv&, const jni::Object&); - static mbgl::LatLng getLatLng(jni::JNIEnv&, jni::Object); + static mbgl::LatLng getLatLng(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/geometry/lat_lng_bounds.cpp b/platform/android/src/geometry/lat_lng_bounds.cpp index 583120cb68..d76ff5b365 100644 --- a/platform/android/src/geometry/lat_lng_bounds.cpp +++ b/platform/android/src/geometry/lat_lng_bounds.cpp @@ -3,14 +3,14 @@ namespace mbgl { namespace android { -jni::Object LatLngBounds::New(jni::JNIEnv& env, mbgl::LatLngBounds bounds) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> LatLngBounds::New(jni::JNIEnv& env, mbgl::LatLngBounds bounds) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, bounds.north(), bounds.east(), bounds.south(), bounds.west()); } -mbgl::LatLngBounds LatLngBounds::getLatLngBounds(jni::JNIEnv& env, jni::Object bounds) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::LatLngBounds LatLngBounds::getLatLngBounds(jni::JNIEnv& env, const jni::Object& bounds) { + static auto& javaClass = jni::Class::Singleton(env); static auto swLatField = javaClass.GetField(env, "latitudeSouth"); static auto swLonField = javaClass.GetField(env, "longitudeWest"); static auto neLatField = javaClass.GetField(env, "latitudeNorth"); diff --git a/platform/android/src/geometry/lat_lng_bounds.hpp b/platform/android/src/geometry/lat_lng_bounds.hpp index 751e0babda..d51026711d 100644 --- a/platform/android/src/geometry/lat_lng_bounds.hpp +++ b/platform/android/src/geometry/lat_lng_bounds.hpp @@ -14,9 +14,9 @@ public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/geometry/LatLngBounds"; }; - static jni::Object New(jni::JNIEnv&, mbgl::LatLngBounds); + static jni::Local> New(jni::JNIEnv&, mbgl::LatLngBounds); - static mbgl::LatLngBounds getLatLngBounds(jni::JNIEnv&, jni::Object); + static mbgl::LatLngBounds getLatLngBounds(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geometry/lat_lng_quad.cpp b/platform/android/src/geometry/lat_lng_quad.cpp index 5530a22903..1a1e49048b 100644 --- a/platform/android/src/geometry/lat_lng_quad.cpp +++ b/platform/android/src/geometry/lat_lng_quad.cpp @@ -4,8 +4,8 @@ namespace mbgl { namespace android { -jni::Object LatLngQuad::New(jni::JNIEnv& env, std::array coordinates) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> LatLngQuad::New(jni::JNIEnv& env, std::array coordinates) { + static auto& javaClass = jni::Class::Singleton(env); static auto quadConstructor = javaClass.GetConstructor, jni::Object, jni::Object, jni::Object>(env); return javaClass.New(env, quadConstructor, LatLng::New(env, coordinates[0]), @@ -14,8 +14,8 @@ jni::Object LatLngQuad::New(jni::JNIEnv& env, std::array LatLngQuad::getLatLngArray(jni::JNIEnv& env, jni::Object quad) { - static auto javaClass = jni::Class::Singleton(env); +std::array LatLngQuad::getLatLngArray(jni::JNIEnv& env, const jni::Object& quad) { + static auto& javaClass = jni::Class::Singleton(env); static auto topLeftField = javaClass.GetField >(env, "topLeft"); static auto topRightField = javaClass.GetField >(env, "topRight"); static auto bottomRightField = javaClass.GetField >(env, "bottomRight"); diff --git a/platform/android/src/geometry/lat_lng_quad.hpp b/platform/android/src/geometry/lat_lng_quad.hpp index ca1430ffbc..f6560b57ba 100644 --- a/platform/android/src/geometry/lat_lng_quad.hpp +++ b/platform/android/src/geometry/lat_lng_quad.hpp @@ -15,9 +15,9 @@ public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/geometry/LatLngQuad"; }; - static jni::Object New(jni::JNIEnv&, std::array); + static jni::Local> New(jni::JNIEnv&, std::array); - static std::array getLatLngArray(jni::JNIEnv&, jni::Object); + static std::array getLatLngArray(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/geometry/projected_meters.cpp b/platform/android/src/geometry/projected_meters.cpp index 4dfd7b57b2..e079de0062 100644 --- a/platform/android/src/geometry/projected_meters.cpp +++ b/platform/android/src/geometry/projected_meters.cpp @@ -3,8 +3,8 @@ namespace mbgl { namespace android { -jni::Object ProjectedMeters::New(jni::JNIEnv& env, double northing, double easting) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> ProjectedMeters::New(jni::JNIEnv& env, double northing, double easting) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, northing, easting); } diff --git a/platform/android/src/geometry/projected_meters.hpp b/platform/android/src/geometry/projected_meters.hpp index 5279e6bef2..baad1efc81 100644 --- a/platform/android/src/geometry/projected_meters.hpp +++ b/platform/android/src/geometry/projected_meters.hpp @@ -12,7 +12,7 @@ class ProjectedMeters : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/geometry/ProjectedMeters"; }; - static jni::Object New(jni::JNIEnv&, double, double); + static jni::Local> New(jni::JNIEnv&, double, double); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/graphics/pointf.cpp b/platform/android/src/graphics/pointf.cpp index eceb65b07a..2fc762d6e9 100644 --- a/platform/android/src/graphics/pointf.cpp +++ b/platform/android/src/graphics/pointf.cpp @@ -4,14 +4,14 @@ namespace mbgl { namespace android { -jni::Object PointF::New(jni::JNIEnv& env, float x, float y) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> PointF::New(jni::JNIEnv& env, float x, float y) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, x, y); } -mbgl::ScreenCoordinate PointF::getScreenCoordinate(jni::JNIEnv& env, jni::Object point) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::ScreenCoordinate PointF::getScreenCoordinate(jni::JNIEnv& env, const jni::Object& point) { + static auto& javaClass = jni::Class::Singleton(env); static auto xField = javaClass.GetField(env, "x"); static auto yField = javaClass.GetField(env, "y"); return mbgl::ScreenCoordinate{point.Get(env, xField), point.Get(env, yField)}; diff --git a/platform/android/src/graphics/pointf.hpp b/platform/android/src/graphics/pointf.hpp index 27bd49138f..899468b8e3 100644 --- a/platform/android/src/graphics/pointf.hpp +++ b/platform/android/src/graphics/pointf.hpp @@ -12,9 +12,9 @@ public: static constexpr auto Name() { return "android/graphics/PointF"; }; - static jni::Object New(jni::JNIEnv&, float, float); + static jni::Local> New(jni::JNIEnv&, float, float); - static mbgl::ScreenCoordinate getScreenCoordinate(jni::JNIEnv&, jni::Object); + static mbgl::ScreenCoordinate getScreenCoordinate(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/graphics/rectf.cpp b/platform/android/src/graphics/rectf.cpp index 9f05728b4c..8f418da037 100644 --- a/platform/android/src/graphics/rectf.cpp +++ b/platform/android/src/graphics/rectf.cpp @@ -3,26 +3,26 @@ namespace mbgl { namespace android { -float RectF::getLeft(jni::JNIEnv& env, jni::Object rectf) { - static auto javaClass = jni::Class::Singleton(env); +float RectF::getLeft(jni::JNIEnv& env, const jni::Object& rectf) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "left"); return rectf.Get(env, field); } -float RectF::getTop(jni::JNIEnv& env, jni::Object rectf) { - static auto javaClass = jni::Class::Singleton(env); +float RectF::getTop(jni::JNIEnv& env, const jni::Object& rectf) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "top"); return rectf.Get(env, field); } -float RectF::getRight(jni::JNIEnv& env, jni::Object rectf) { - static auto javaClass = jni::Class::Singleton(env); +float RectF::getRight(jni::JNIEnv& env, const jni::Object& rectf) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "right"); return rectf.Get(env, field); } -float RectF::getBottom(jni::JNIEnv& env, jni::Object rectf) { - static auto javaClass = jni::Class::Singleton(env); +float RectF::getBottom(jni::JNIEnv& env, const jni::Object& rectf) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "bottom"); return rectf.Get(env, field); } diff --git a/platform/android/src/graphics/rectf.hpp b/platform/android/src/graphics/rectf.hpp index db836e78ba..ba611f2262 100644 --- a/platform/android/src/graphics/rectf.hpp +++ b/platform/android/src/graphics/rectf.hpp @@ -12,13 +12,13 @@ public: static constexpr auto Name() { return "android/graphics/RectF"; }; - static float getLeft(jni::JNIEnv&, jni::Object); + static float getLeft(jni::JNIEnv&, const jni::Object&); - static float getTop(jni::JNIEnv&, jni::Object); + static float getTop(jni::JNIEnv&, const jni::Object&); - static float getRight(jni::JNIEnv&, jni::Object); + static float getRight(jni::JNIEnv&, const jni::Object&); - static float getBottom(jni::JNIEnv&, jni::Object); + static float getBottom(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/gson/json_array.cpp b/platform/android/src/gson/json_array.cpp index b5fb85e5d9..8ffa658b76 100644 --- a/platform/android/src/gson/json_array.cpp +++ b/platform/android/src/gson/json_array.cpp @@ -5,25 +5,25 @@ namespace mbgl { namespace android { namespace gson { -jni::Object JsonArray::New(jni::JNIEnv& env, const std::vector& values){ - static auto javaClass = jni::Class::Singleton(env); +jni::Local> JsonArray::New(jni::JNIEnv& env, const std::vector& values){ + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); static auto addMethod = javaClass.GetMethod)>(env, "add"); auto jsonArray = javaClass.New(env, constructor); for (const auto &v : values) { - jsonArray.Call(env, addMethod, *jni::SeizeLocal(env, JsonElement::New(env, v))); + jsonArray.Call(env, addMethod, JsonElement::New(env, v)); } return jsonArray; } -std::vector JsonArray::convert(jni::JNIEnv& env, const jni::Object jsonArray) { +std::vector JsonArray::convert(jni::JNIEnv& env, const jni::Object& jsonArray) { std::vector values; if (jsonArray) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto getMethod = javaClass.GetMethod (jni::jint)>(env, "get"); static auto sizeMethod = javaClass.GetMethod(env, "size"); @@ -31,9 +31,9 @@ std::vector JsonArray::convert(jni::JNIEnv& env, const jni::Object< values.reserve(uint(size)); for (int i = 0; i < size; i++) { - auto entry = jni::SeizeLocal(env, jsonArray.Call(env, getMethod, i)); - if (*entry) { - values.push_back(JsonElement::convert(env, *entry)); + auto entry = jsonArray.Call(env, getMethod, i); + if (entry) { + values.push_back(JsonElement::convert(env, entry)); } } } diff --git a/platform/android/src/gson/json_array.hpp b/platform/android/src/gson/json_array.hpp index b41596819f..24d5d3d291 100644 --- a/platform/android/src/gson/json_array.hpp +++ b/platform/android/src/gson/json_array.hpp @@ -8,12 +8,13 @@ namespace mbgl { namespace android { namespace gson { -class JsonArray : public JsonElement { +class JsonArray { public: + using SuperTag = JsonElement; static constexpr auto Name() { return "com/google/gson/JsonArray"; }; - static jni::Object New(jni::JNIEnv&, const std::vector&); - static std::vector convert(JNIEnv&, jni::Object); + static jni::Local> New(jni::JNIEnv&, const std::vector&); + static std::vector convert(JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/gson/json_element.cpp b/platform/android/src/gson/json_element.cpp index 28cb368386..7c9a34c03c 100644 --- a/platform/android/src/gson/json_element.cpp +++ b/platform/android/src/gson/json_element.cpp @@ -7,35 +7,30 @@ namespace mbgl { namespace android { namespace gson { -jni::Object JsonElement::New(jni::JNIEnv& env, const mbgl::Value& value) { - static auto primitive = jni::Class::Singleton(env); +jni::Local> JsonElement::New(jni::JNIEnv& env, const mbgl::Value& value) { + static auto& primitive = jni::Class::Singleton(env); static auto stringConstructor = primitive.GetConstructor(env); static auto numberConstructor = primitive.GetConstructor(env); static auto booleanConstructor = primitive.GetConstructor(env); return value.match( [&] (const mbgl::NullValue&) { - return jni::Object(); + return jni::Local>(); }, [&] (const std::string& value) { - return primitive.New(env, stringConstructor, - *jni::SeizeLocal(env, jni::Make(env, value))); + return primitive.New(env, stringConstructor, jni::Make(env, value)); }, [&] (const double value) { - return primitive.New(env, numberConstructor, - *jni::SeizeLocal(env, jni::Number(jni::Box(env, value)))); + return primitive.New(env, numberConstructor, jni::Box(env, value)); }, [&] (const int64_t value) { - return primitive.New(env, numberConstructor, - *jni::SeizeLocal(env, jni::Number(jni::Box(env, value)))); + return primitive.New(env, numberConstructor, jni::Box(env, value)); }, [&] (const uint64_t value) { - return primitive.New(env, numberConstructor, - *jni::SeizeLocal(env, jni::Number(jni::Box(env, int64_t(value))))); // TODO: should use BigInteger + return primitive.New(env, numberConstructor, jni::Box(env, int64_t(value))); // TODO: should use BigInteger }, [&] (const bool value) { - return primitive.New(env, booleanConstructor, - *jni::SeizeLocal(env, jni::Box(env, value ? jni::jni_true : jni::jni_false))); + return primitive.New(env, booleanConstructor, jni::Box(env, value ? jni::jni_true : jni::jni_false)); }, [&] (const std::vector& values) { return JsonArray::New(env, values); @@ -46,17 +41,17 @@ jni::Object JsonElement::New(jni::JNIEnv& env, const mbgl::Value& v ); } -mbgl::Value JsonElement::convert(jni::JNIEnv &env, jni::Object jsonElement) { +mbgl::Value JsonElement::convert(jni::JNIEnv &env, const jni::Object& jsonElement) { if (!jsonElement) { return mbgl::NullValue(); } - static auto elementClass = jni::Class::Singleton(env); + static auto& elementClass = jni::Class::Singleton(env); static auto isJsonObject = elementClass.GetMethod(env, "isJsonObject"); static auto isJsonArray = elementClass.GetMethod(env, "isJsonArray"); static auto isJsonPrimitive = elementClass.GetMethod(env, "isJsonPrimitive"); - static auto primitiveClass = jni::Class::Singleton(env); + static auto& primitiveClass = jni::Class::Singleton(env); static auto isBoolean = primitiveClass.GetMethod(env, "isBoolean"); static auto isString = primitiveClass.GetMethod(env, "isString"); static auto isNumber = primitiveClass.GetMethod(env, "isNumber"); @@ -71,7 +66,7 @@ mbgl::Value JsonElement::convert(jni::JNIEnv &env, jni::Object json } else if (primitive.Call(env, isNumber)) { return primitive.Call(env, getAsDouble); // TODO: how to differentiate types here? } else if (primitive.Call(env, isString)) { - return jni::Make(env, *jni::SeizeLocal(env, primitive.Call(env, getAsString))); + return jni::Make(env, primitive.Call(env, getAsString)); } else { return mbgl::NullValue(); } diff --git a/platform/android/src/gson/json_element.hpp b/platform/android/src/gson/json_element.hpp index 384459dc41..e3b8a0268d 100644 --- a/platform/android/src/gson/json_element.hpp +++ b/platform/android/src/gson/json_element.hpp @@ -8,12 +8,13 @@ namespace mbgl { namespace android { namespace gson { -class JsonElement : public jni::ObjectTag { +class JsonElement { public: + using SuperTag = jni::ObjectTag; static constexpr auto Name() { return "com/google/gson/JsonElement"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::Value&); - static mbgl::Value convert(JNIEnv&, jni::Object); + static jni::Local> New(jni::JNIEnv&, const mbgl::Value&); + static mbgl::Value convert(JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/gson/json_object.cpp b/platform/android/src/gson/json_object.cpp index 5dcb07642f..10d244ee48 100644 --- a/platform/android/src/gson/json_object.cpp +++ b/platform/android/src/gson/json_object.cpp @@ -9,48 +9,46 @@ namespace android { namespace gson { -jni::Object JsonObject::New(jni::JNIEnv& env, const mbgl::PropertyMap& values) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> JsonObject::New(jni::JNIEnv& env, const mbgl::PropertyMap& values) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); static auto addMethod = javaClass.GetMethod)>(env, "add"); - jni::Object jsonObject = javaClass.New(env, constructor); + auto jsonObject = javaClass.New(env, constructor); for (auto &item : values) { jsonObject.Call(env, addMethod, - *jni::SeizeLocal(env, jni::Make(env, item.first)), - *jni::SeizeLocal(env, JsonElement::New(env, item.second))); + jni::Make(env, item.first), + JsonElement::New(env, item.second)); } return jsonObject; } template // void (jni::String, jni::Object) -static void iterateEntrySet(jni::JNIEnv& env, jni::Object jsonObject, F callback) { +static void iterateEntrySet(jni::JNIEnv& env, const jni::Object& jsonObject, F callback) { // Get Set> - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "entrySet"); - auto entryArray = - jni::SeizeLocal(env, java::util::Set::toArray(env, - *jni::SeizeLocal(env, jsonObject.Call(env, method)))); + auto entryArray = java::util::Set::toArray(env, jsonObject.Call(env, method)); - size_t size = entryArray->Length(env); + size_t size = entryArray.Length(env); for (size_t i = 0; i < size; i++) { - auto entry = jni::SeizeLocal(env, entryArray->Get(env, i)); + auto entry = entryArray.Get(env, i); if (entry) { callback( - *jni::SeizeLocal(env, java::util::Map::Entry::getKey(env, *entry)), - *jni::SeizeLocal(env, java::util::Map::Entry::getValue(env, *entry))); + java::util::Map::Entry::getKey(env, entry), + java::util::Map::Entry::getValue(env, entry)); } } } -mbgl::PropertyMap JsonObject::convert(jni::JNIEnv &env, jni::Object jsonObject) { +mbgl::PropertyMap JsonObject::convert(jni::JNIEnv& env, const jni::Object& jsonObject) { mbgl::PropertyMap map; if (jsonObject) { - iterateEntrySet(env, jsonObject, [&map, &env](jni::String jId, jni::Object jsonElement) { + iterateEntrySet(env, jsonObject, [&map, &env](const jni::String& jId, const jni::Object& jsonElement) { map[jni::Make(env, jId)] = JsonElement::convert(env, jsonElement); }); } diff --git a/platform/android/src/gson/json_object.hpp b/platform/android/src/gson/json_object.hpp index 256161f0d9..b8916f8ae1 100644 --- a/platform/android/src/gson/json_object.hpp +++ b/platform/android/src/gson/json_object.hpp @@ -8,12 +8,13 @@ namespace mbgl { namespace android { namespace gson { -class JsonObject : public JsonElement { +class JsonObject { public: + using SuperTag = JsonElement; static constexpr auto Name() { return "com/google/gson/JsonObject"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::PropertyMap&); - static mbgl::PropertyMap convert(JNIEnv&, jni::Object); + static jni::Local> New(jni::JNIEnv&, const mbgl::PropertyMap&); + static mbgl::PropertyMap convert(JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/gson/json_primitive.hpp b/platform/android/src/gson/json_primitive.hpp index fb3eefc855..36f138d902 100644 --- a/platform/android/src/gson/json_primitive.hpp +++ b/platform/android/src/gson/json_primitive.hpp @@ -8,8 +8,9 @@ namespace mbgl { namespace android { namespace gson { -class JsonPrimitive : public JsonElement { +class JsonPrimitive { public: + using SuperTag = JsonElement; static constexpr auto Name() { return "com/google/gson/JsonPrimitive"; }; static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/http_file_source.cpp b/platform/android/src/http_file_source.cpp index 6b359aab8c..e1b3493f0f 100644 --- a/platform/android/src/http_file_source.cpp +++ b/platform/android/src/http_file_source.cpp @@ -25,12 +25,12 @@ public: HTTPRequest(jni::JNIEnv&, const Resource&, FileSource::Callback); ~HTTPRequest(); - void onFailure(jni::JNIEnv&, int type, jni::String message); + void onFailure(jni::JNIEnv&, int type, const jni::String& message); void onResponse(jni::JNIEnv&, int code, - jni::String etag, jni::String modified, - jni::String cacheControl, jni::String expires, - jni::String retryAfter, jni::String xRateLimitReset, - jni::Array body); + const jni::String& etag, const jni::String& modified, + const jni::String& cacheControl, const jni::String& expires, + const jni::String& retryAfter, const jni::String& xRateLimitReset, + const jni::Array& body); jni::Global> javaRequest; @@ -54,7 +54,7 @@ private: namespace android { void RegisterNativeHTTPRequest(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) @@ -79,31 +79,32 @@ HTTPRequest::HTTPRequest(jni::JNIEnv& env, const Resource& resource_, FileSource jni::UniqueLocalFrame frame = jni::PushLocalFrame(env, 10); - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - javaRequest = javaClass.New(env, constructor, - reinterpret_cast(this), - jni::Make(env, resource.url), - jni::Make(env, etagStr), - jni::Make(env, modifiedStr)).NewGlobalRef(env); + javaRequest = jni::NewGlobal(env, + javaClass.New(env, constructor, + reinterpret_cast(this), + jni::Make(env, resource.url), + jni::Make(env, etagStr), + jni::Make(env, modifiedStr))); } HTTPRequest::~HTTPRequest() { android::UniqueEnv env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto cancel = javaClass.GetMethod(*env, "cancel"); - javaRequest->Call(*env, cancel); + javaRequest.Call(*env, cancel); } void HTTPRequest::onResponse(jni::JNIEnv& env, int code, - jni::String etag, jni::String modified, - jni::String cacheControl, jni::String expires, - jni::String jRetryAfter, jni::String jXRateLimitReset, - jni::Array body) { + const jni::String& etag, const jni::String& modified, + const jni::String& cacheControl, const jni::String& expires, + const jni::String& jRetryAfter, const jni::String& jXRateLimitReset, + const jni::Array& body) { using Error = Response::Error; @@ -158,7 +159,7 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, int code, async.send(); } -void HTTPRequest::onFailure(jni::JNIEnv& env, int type, jni::String message) { +void HTTPRequest::onFailure(jni::JNIEnv& env, int type, const jni::String& message) { std::string messageStr = jni::Make(env, message); using Error = Response::Error; diff --git a/platform/android/src/image.cpp b/platform/android/src/image.cpp index a85e9aeaa2..31515ff16f 100644 --- a/platform/android/src/image.cpp +++ b/platform/android/src/image.cpp @@ -11,12 +11,11 @@ namespace mbgl { PremultipliedImage decodeImage(const std::string& string) { auto env{ android::AttachEnv() }; - auto array = jni::SeizeLocal(*env, jni::Array::New(*env, string.size())); - jni::SetArrayRegion(*env, **array, 0, string.size(), + auto array = jni::Array::New(*env, string.size()); + jni::SetArrayRegion(*env, *array, 0, string.size(), reinterpret_cast(string.data())); - return android::Bitmap::GetImage(*env, - *jni::SeizeLocal(*env, android::BitmapFactory::DecodeByteArray(*env, *array, 0, string.size()))); + return android::Bitmap::GetImage(*env, android::BitmapFactory::DecodeByteArray(*env, array, 0, string.size())); } } // namespace mbgl diff --git a/platform/android/src/java/util.hpp b/platform/android/src/java/util.hpp index 808f14be15..9b0c01459e 100644 --- a/platform/android/src/java/util.hpp +++ b/platform/android/src/java/util.hpp @@ -14,10 +14,11 @@ public: static constexpr auto Name() { return "java/util/List"; }; template - static jni::Array> toArray(jni::JNIEnv& env, jni::Object list) { - static auto javaClass = jni::Class::Singleton(env); + static jni::Local>> toArray(jni::JNIEnv& env, const jni::Object& list) { + static auto& javaClass = jni::Class::Singleton(env); static auto toArray = javaClass.GetMethod> ()>(env, "toArray"); - return (jni::Array>) list.Call(env, toArray); + + return jni::Local>>(env, list.Call(env, toArray).release()); }; }; @@ -26,10 +27,12 @@ public: static constexpr auto Name() { return "java/util/Arrays"; }; template - static jni::Object asList(jni::JNIEnv& env, jni::Array> array) { - static auto javaClass = jni::Class::Singleton(env); + static jni::Local> asList(jni::JNIEnv& env, const jni::Array>& array) { + static auto& javaClass = jni::Class::Singleton(env); static auto asList = javaClass.GetStaticMethod(jni::Array>)>(env, "asList"); - return javaClass.Call(env, asList, (jni::Array>) array); + + auto typeErasedArray = jni::Local>>(env, jni::NewLocal(env, array).release()); + return javaClass.Call(env, asList, typeErasedArray); } }; @@ -38,10 +41,11 @@ public: static constexpr auto Name() { return "java/util/Set"; }; template - static jni::Array> toArray(jni::JNIEnv& env, jni::Object list) { - static auto javaClass = jni::Class::Singleton(env); + static jni::Local>> toArray(jni::JNIEnv& env, const jni::Object& list) { + static auto& javaClass = jni::Class::Singleton(env); static auto toArray = javaClass.GetMethod> ()>(env, "toArray"); - return (jni::Array>) list.Call(env, toArray); + + return jni::Local>>(env, list.Call(env, toArray).release()); }; }; @@ -54,15 +58,15 @@ public: static constexpr auto Name() { return "java/util/Map$Entry"; }; template - static jni::Object getKey(jni::JNIEnv& env, jni::Object entry) { - static auto javaClass = jni::Class::Singleton(env); + static jni::Local> getKey(jni::JNIEnv& env, const jni::Object& entry) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "getKey"); return jni::Cast(env, jni::Class::Singleton(env), entry.Call(env, method)); } template - static jni::Object getValue(jni::JNIEnv& env, jni::Object entry) { - static auto javaClass = jni::Class::Singleton(env); + static jni::Local> getValue(jni::JNIEnv& env, const jni::Object& entry) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod ()>(env, "getValue"); return jni::Cast(env, jni::Class::Singleton(env), entry.Call(env, method)); } diff --git a/platform/android/src/jni/generic_global_ref_deleter.hpp b/platform/android/src/jni/generic_global_ref_deleter.hpp deleted file mode 100644 index b865ee9f8b..0000000000 --- a/platform/android/src/jni/generic_global_ref_deleter.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#pragma once - -#include - -#include "../attach_env.hpp" - -namespace mbgl { -namespace android { - -// A deleter that doesn't retain an JNIEnv handle but instead tries to attach the JVM. This means -// it can be used on any thread to delete a global ref. -struct GenericGlobalRefDeleter { - void operator()(jni::jobject* p) const { - if (p) { - AttachEnv()->DeleteGlobalRef(jni::Unwrap(p)); - } - } -}; - -struct GenericWeakGlobalRefDeleter { - void operator()(jni::jobject* p) const { - if (p) { - AttachEnv()->DeleteWeakGlobalRef(jni::Unwrap(p)); - } - } -}; - -template < class T > -using GenericGlobal = jni::UniquePointerlike< T, GenericGlobalRefDeleter >; - -template < class T > -using GenericWeak = jni::UniquePointerlike< T, GenericWeakGlobalRefDeleter >; - -template < class T > -GenericGlobal SeizeGenericGlobal(T&& t) { - return GenericGlobal(std::move(t), GenericGlobalRefDeleter()); -}; - -template < class T > -GenericWeak SeizeGenericWeak(T&& t) { - return GenericWeak(std::move(t), GenericWeakGlobalRefDeleter()); -}; - -} // namespace android -} // namespace mbgl diff --git a/platform/android/src/logger.cpp b/platform/android/src/logger.cpp index ddc4d84525..f5d78cc83c 100644 --- a/platform/android/src/logger.cpp +++ b/platform/android/src/logger.cpp @@ -9,24 +9,24 @@ void Logger::registerNative(jni::JNIEnv& env) { } void Logger::log(jni::JNIEnv& env, EventSeverity severity, const std::string &msg) { - static auto _class = jni::Class::Singleton(env); + static auto& _class = jni::Class::Singleton(env); - auto tag = jni::SeizeLocal(env, jni::Make(env, "Mbgl")); - auto message = jni::SeizeLocal(env, jni::Make(env, msg)); + auto tag = jni::Make(env, "Mbgl"); + auto message = jni::Make(env, msg); using Signature = void(jni::String, jni::String); if (severity == EventSeverity::Debug) { auto static debug = _class.GetStaticMethod(env, "d"); - _class.Call(env, debug, *tag, *message); + _class.Call(env, debug, tag, message); } else if (severity == EventSeverity::Info) { auto static info = _class.GetStaticMethod(env, "i"); - _class.Call(env, info, *tag, *message); + _class.Call(env, info, tag, message); } else if(severity == EventSeverity::Warning) { auto static warning = _class.GetStaticMethod(env, "w"); - _class.Call(env, warning, *tag, *message); + _class.Call(env, warning, tag, message); } else { auto static error = _class.GetStaticMethod(env, "e"); - _class.Call(env, error, *tag, *message); + _class.Call(env, error, tag, message); } } diff --git a/platform/android/src/map/camera_position.cpp b/platform/android/src/map/camera_position.cpp index 5700341d65..3caf4ea2f3 100644 --- a/platform/android/src/map/camera_position.cpp +++ b/platform/android/src/map/camera_position.cpp @@ -4,8 +4,8 @@ namespace mbgl { namespace android { -jni::Object CameraPosition::New(jni::JNIEnv &env, mbgl::CameraOptions options) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> CameraPosition::New(jni::JNIEnv &env, mbgl::CameraOptions options) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor, double, double, double>(env); // wrap LatLng values coming from core @@ -28,14 +28,14 @@ jni::Object CameraPosition::New(jni::JNIEnv &env, mbgl::CameraOp return javaClass.New(env, constructor, LatLng::New(env, center), options.zoom.value_or(0), tilt_degrees, bearing_degrees); } -mbgl::CameraOptions CameraPosition::getCameraOptions(jni::JNIEnv& env, jni::Object position) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::CameraOptions CameraPosition::getCameraOptions(jni::JNIEnv& env, const jni::Object& position) { + static auto& javaClass = jni::Class::Singleton(env); static auto bearing = javaClass.GetField(env, "bearing"); static auto target = javaClass.GetField>(env, "target"); static auto tilt = javaClass.GetField(env, "tilt"); static auto zoom = javaClass.GetField(env, "zoom"); - auto center = LatLng::getLatLng(env, *jni::SeizeLocal(env, position.Get(env, target))); + auto center = LatLng::getLatLng(env, position.Get(env, target)); return mbgl::CameraOptions { center, diff --git a/platform/android/src/map/camera_position.hpp b/platform/android/src/map/camera_position.hpp index d577811915..7579f9fed1 100644 --- a/platform/android/src/map/camera_position.hpp +++ b/platform/android/src/map/camera_position.hpp @@ -12,9 +12,9 @@ class CameraPosition : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/camera/CameraPosition"; }; - static jni::Object New(jni::JNIEnv&, mbgl::CameraOptions); + static jni::Local> New(jni::JNIEnv&, mbgl::CameraOptions); - static mbgl::CameraOptions getCameraOptions(jni::JNIEnv&, jni::Object); + static mbgl::CameraOptions getCameraOptions(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/map/image.cpp b/platform/android/src/map/image.cpp index ee3c7012a7..a91cc938ed 100644 --- a/platform/android/src/map/image.cpp +++ b/platform/android/src/map/image.cpp @@ -5,8 +5,8 @@ namespace mbgl { namespace android { -mbgl::style::Image Image::getImage(jni::JNIEnv& env, jni::Object image) { - static auto javaClass = jni::Class::Singleton(env); +mbgl::style::Image Image::getImage(jni::JNIEnv& env, const jni::Object& image) { + static auto& javaClass = jni::Class::Singleton(env); static auto widthField = javaClass.GetField(env, "width"); static auto heightField = javaClass.GetField(env, "height"); static auto pixelRatioField = javaClass.GetField(env, "pixelRatio"); @@ -17,19 +17,19 @@ mbgl::style::Image Image::getImage(jni::JNIEnv& env, jni::Object image) { auto height = image.Get(env, heightField); auto width = image.Get(env, widthField); auto pixelRatio = image.Get(env, pixelRatioField); - auto pixels = jni::SeizeLocal(env, image.Get(env, bufferField)); - auto name = jni::Make(env, *jni::SeizeLocal(env, image.Get(env, nameField))); + auto pixels = image.Get(env, bufferField); + auto name = jni::Make(env, image.Get(env, nameField)); auto sdf = (bool) image.Get(env, sdfField); - jni::NullCheck(env, pixels->Get()); - std::size_t size = pixels->Length(env); + jni::NullCheck(env, pixels.get()); + std::size_t size = pixels.Length(env); mbgl::PremultipliedImage premultipliedImage({ static_cast(width), static_cast(height) }); if (premultipliedImage.bytes() != uint32_t(size)) { throw mbgl::util::SpriteImageException("Sprite image pixel count mismatch"); } - jni::GetArrayRegion(env, **pixels, 0, size, reinterpret_cast(premultipliedImage.data.get())); + jni::GetArrayRegion(env, *pixels, 0, size, reinterpret_cast(premultipliedImage.data.get())); return mbgl::style::Image {name, std::move(premultipliedImage), pixelRatio, sdf}; } diff --git a/platform/android/src/map/image.hpp b/platform/android/src/map/image.hpp index 17ed4cbef8..7549bc646a 100644 --- a/platform/android/src/map/image.hpp +++ b/platform/android/src/map/image.hpp @@ -12,7 +12,7 @@ class Image : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/maps/Image"; }; - static mbgl::style::Image getImage(jni::JNIEnv&, jni::Object); + static mbgl::style::Image getImage(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/map_renderer.cpp b/platform/android/src/map_renderer.cpp index 1f8c82ac05..13790c4544 100644 --- a/platform/android/src/map_renderer.cpp +++ b/platform/android/src/map_renderer.cpp @@ -14,15 +14,17 @@ namespace mbgl { namespace android { -MapRenderer::MapRenderer(jni::JNIEnv& _env, jni::Object obj, - jni::Object _fileSource, jni::jfloat pixelRatio_, - jni::String programCacheDir_, - jni::String localIdeographFontFamily_) - : javaPeer(SeizeGenericWeak(obj.NewWeakGlobalRef(_env).release())) +MapRenderer::MapRenderer(jni::JNIEnv& _env, + const jni::Object& obj, + const jni::Object& _fileSource, + jni::jfloat pixelRatio_, + const jni::String& programCacheDir_, + const jni::String& localIdeographFontFamily_) + : javaPeer(_env, obj) , pixelRatio(pixelRatio_) , fileSource(FileSource::getDefaultFileSource(_env, _fileSource)) , programCacheDir(jni::Make(_env, programCacheDir_)) - , localIdeographFontFamily(localIdeographFontFamily_ == nullptr ? optional{} : jni::Make(_env, localIdeographFontFamily_ )) + , localIdeographFontFamily(localIdeographFontFamily_ ? jni::Make(_env, localIdeographFontFamily_) : optional{}) , threadPool(sharedThreadPool()) , mailbox(std::make_shared(*this)) { } @@ -53,10 +55,10 @@ void MapRenderer::schedule(std::weak_ptr scheduled) { auto peer = runnable->peer(); // Queue the event on the Java Peer - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto queueEvent = javaClass.GetMethod)>(*_env, "queueEvent"); - javaPeer->Call(*_env, queueEvent, *peer); + javaPeer.get(*_env).Call(*_env, queueEvent, peer); // Release the c++ peer as it will be destroyed on GC of the Java Peer runnable.release(); @@ -64,9 +66,9 @@ void MapRenderer::schedule(std::weak_ptr scheduled) { void MapRenderer::requestRender() { android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto onInvalidate = javaClass.GetMethod(*_env, "requestRender"); - javaPeer->Call(*_env, onInvalidate); + javaPeer.get(*_env).Call(*_env, onInvalidate); } void MapRenderer::update(std::shared_ptr params) { @@ -184,13 +186,13 @@ void MapRenderer::onSurfaceChanged(JNIEnv&, jint width, jint height) { void MapRenderer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer(env, javaClass, "nativePtr", - std::make_unique, jni::Object, jni::jfloat, jni::String, jni::String>, + jni::MakePeer&, const jni::Object&, jni::jfloat, const jni::String&, const jni::String&>, "nativeInitialize", "finalize", METHOD(&MapRenderer::render, "nativeRender"), METHOD(&MapRenderer::onSurfaceCreated, @@ -199,8 +201,8 @@ void MapRenderer::registerNative(jni::JNIEnv& env) { "nativeOnSurfaceChanged")); } -MapRenderer& MapRenderer::getNativePeer(JNIEnv& env, jni::Object jObject) { - static auto javaClass = jni::Class::Singleton(env); +MapRenderer& MapRenderer::getNativePeer(JNIEnv& env, const jni::Object& jObject) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "nativePtr"); MapRenderer* mapRenderer = reinterpret_cast(jObject.Get(env, field)); assert(mapRenderer != nullptr); diff --git a/platform/android/src/map_renderer.hpp b/platform/android/src/map_renderer.hpp index 6fcf2fee71..d60447e0ec 100644 --- a/platform/android/src/map_renderer.hpp +++ b/platform/android/src/map_renderer.hpp @@ -9,8 +9,6 @@ #include #include -#include "jni/generic_global_ref_deleter.hpp" - namespace mbgl { template @@ -40,14 +38,14 @@ public: static void registerNative(jni::JNIEnv&); - static MapRenderer& getNativePeer(JNIEnv&, jni::Object); + static MapRenderer& getNativePeer(JNIEnv&, const jni::Object&); MapRenderer(jni::JNIEnv& _env, - jni::Object, - jni::Object, + const jni::Object&, + const jni::Object&, jni::jfloat pixelRatio, - jni::String programCacheDir, - jni::String localIdeographFontFamily); + const jni::String& programCacheDir, + const jni::String& localIdeographFontFamily); ~MapRenderer() override; @@ -97,7 +95,7 @@ private: void onSurfaceChanged(JNIEnv&, jint width, jint height); private: - GenericWeak> javaPeer; + jni::WeakReference, jni::EnvAttachingDeleter> javaPeer; float pixelRatio; DefaultFileSource& fileSource; diff --git a/platform/android/src/map_renderer_runnable.cpp b/platform/android/src/map_renderer_runnable.cpp index 1bfccebd2d..77c3aa301d 100644 --- a/platform/android/src/map_renderer_runnable.cpp +++ b/platform/android/src/map_renderer_runnable.cpp @@ -12,10 +12,10 @@ MapRendererRunnable::MapRendererRunnable(jni::JNIEnv& env, std::weak_ptr::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); auto instance = javaClass.New(env, constructor, reinterpret_cast(this)); - javaPeer = instance.NewGlobalRef(env); + javaPeer = jni::NewGlobal(env, instance); } MapRendererRunnable::~MapRendererRunnable() = default; @@ -32,7 +32,7 @@ jni::Global> MapRendererRunnable::peer() { void MapRendererRunnable::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp index d396e00b47..25605e09e4 100755 --- a/platform/android/src/native_map_view.cpp +++ b/platform/android/src/native_map_view.cpp @@ -57,11 +57,11 @@ namespace mbgl { namespace android { NativeMapView::NativeMapView(jni::JNIEnv& _env, - jni::Object _obj, - jni::Object jFileSource, - jni::Object jMapRenderer, + const jni::Object& _obj, + const jni::Object& jFileSource, + const jni::Object& jMapRenderer, jni::jfloat _pixelRatio) - : javaPeer(_obj.NewWeakGlobalRef(_env)) + : javaPeer(_env, _obj) , mapRenderer(MapRenderer::getNativePeer(_env, jMapRenderer)) , pixelRatio(_pixelRatio) , threadPool(sharedThreadPool()) { @@ -103,9 +103,9 @@ void NativeMapView::notifyMapChange(mbgl::MapChange change) { assert(vm != nullptr); android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto onMapChanged = javaClass.GetMethod(*_env, "onMapChanged"); - javaPeer->Call(*_env, onMapChanged, (int) change); + javaPeer.get(*_env).Call(*_env, onMapChanged, (int) change); } void NativeMapView::onCameraWillChange(MapObserver::CameraChangeMode mode) { @@ -180,23 +180,23 @@ void NativeMapView::resizeView(jni::JNIEnv&, int w, int h) { map->setSize({ static_cast(width), static_cast(height) }); } -jni::String NativeMapView::getStyleUrl(jni::JNIEnv& env) { +jni::Local NativeMapView::getStyleUrl(jni::JNIEnv& env) { return jni::Make(env, map->getStyle().getURL()); } -void NativeMapView::setStyleUrl(jni::JNIEnv& env, jni::String url) { +void NativeMapView::setStyleUrl(jni::JNIEnv& env, const jni::String& url) { map->getStyle().loadURL(jni::Make(env, url)); } -jni::String NativeMapView::getStyleJson(jni::JNIEnv& env) { +jni::Local NativeMapView::getStyleJson(jni::JNIEnv& env) { return jni::Make(env, map->getStyle().getJSON()); } -void NativeMapView::setStyleJson(jni::JNIEnv& env, jni::String json) { +void NativeMapView::setStyleJson(jni::JNIEnv& env, const jni::String& json) { map->getStyle().loadJSON(jni::Make(env, json)); } -void NativeMapView::setLatLngBounds(jni::JNIEnv& env, jni::Object jBounds) { +void NativeMapView::setLatLngBounds(jni::JNIEnv& env, const jni::Object& jBounds) { if (jBounds) { map->setLatLngBounds(mbgl::android::LatLngBounds::getLatLngBounds(env, jBounds)); } else { @@ -281,7 +281,7 @@ void NativeMapView::flyTo(jni::JNIEnv&, jni::jdouble angle, jni::jdouble latitud map->flyTo(cameraOptions, animationOptions); } -jni::Object NativeMapView::getLatLng(JNIEnv& env) { +jni::Local> NativeMapView::getLatLng(JNIEnv& env) { return LatLng::New(env, map->getLatLng(insets)); } @@ -289,12 +289,12 @@ void NativeMapView::setLatLng(jni::JNIEnv&, jni::jdouble latitude, jni::jdouble map->setLatLng(mbgl::LatLng(latitude, longitude), insets, mbgl::AnimationOptions{mbgl::Milliseconds(duration)}); } -jni::Object NativeMapView::getCameraForLatLngBounds(jni::JNIEnv& env, jni::Object jBounds, double top, double left, double bottom, double right, double bearing, double tilt) { +jni::Local> NativeMapView::getCameraForLatLngBounds(jni::JNIEnv& env, const jni::Object& jBounds, double top, double left, double bottom, double right, double bearing, double tilt) { mbgl::EdgeInsets padding = {top, left, bottom, right}; return CameraPosition::New(env, map->cameraForLatLngBounds(mbgl::android::LatLngBounds::getLatLngBounds(env, jBounds), padding, bearing, tilt)); } -jni::Object NativeMapView::getCameraForGeometry(jni::JNIEnv& env, jni::Object jGeometry, double top, double left, double bottom, double right, double bearing, double tilt) { +jni::Local> NativeMapView::getCameraForGeometry(jni::JNIEnv& env, const jni::Object& jGeometry, double top, double left, double bottom, double right, double bearing, double tilt) { auto geometry = geojson::Geometry::convert(env, jGeometry); mbgl::EdgeInsets padding = {top, left, bottom, right}; return CameraPosition::New(env, map->cameraForGeometry(geometry, padding, bearing, tilt)); @@ -369,7 +369,7 @@ void NativeMapView::resetNorth(jni::JNIEnv&) { map->resetNorth(); } -void NativeMapView::setVisibleCoordinateBounds(JNIEnv& env, jni::Array> coordinates, jni::Object padding, jdouble direction, jni::jlong duration) { +void NativeMapView::setVisibleCoordinateBounds(JNIEnv& env, const jni::Array>& coordinates, const jni::Object& padding, jdouble direction, jni::jlong duration) { NullCheck(env, &coordinates); std::size_t count = coordinates.Length(env); @@ -377,7 +377,7 @@ void NativeMapView::setVisibleCoordinateBounds(JNIEnv& env, jni::Array::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto onSnapshotReady = javaClass.GetMethod)>(*_env, "onSnapshotReady"); - javaPeer->Call(*_env, onSnapshotReady, bitmap); + javaPeer.get(*_env).Call(*_env, onSnapshotReady, bitmap); }); } -jni::Object NativeMapView::getCameraPosition(jni::JNIEnv& env) { +jni::Local> NativeMapView::getCameraPosition(jni::JNIEnv& env) { return CameraPosition::New(env, map->getCameraOptions(insets)); } -void NativeMapView::updateMarker(jni::JNIEnv& env, jni::jlong markerId, jni::jdouble lat, jni::jdouble lon, jni::String jid) { +void NativeMapView::updateMarker(jni::JNIEnv& env, jni::jlong markerId, jni::jdouble lat, jni::jdouble lon, const jni::String& jid) { if (markerId == -1) { return; } @@ -428,7 +428,7 @@ void NativeMapView::updateMarker(jni::JNIEnv& env, jni::jlong markerId, jni::jdo map->updateAnnotation(markerId, mbgl::SymbolAnnotation { mbgl::Point(lon, lat), iconId }); } -jni::Array NativeMapView::addMarkers(jni::JNIEnv& env, jni::Array> jmarkers) { +jni::Local> NativeMapView::addMarkers(jni::JNIEnv& env, const jni::Array>& jmarkers) { jni::NullCheck(env, &jmarkers); std::size_t len = jmarkers.Length(env); @@ -436,10 +436,10 @@ jni::Array NativeMapView::addMarkers(jni::JNIEnv& env, jni::ArrayaddAnnotation(mbgl::SymbolAnnotation { - Marker::getPosition(env, *marker), - Marker::getIconId(env, *marker) + Marker::getPosition(env, marker), + Marker::getIconId(env, marker) })); } @@ -477,25 +477,25 @@ jni::jdouble NativeMapView::getMetersPerPixelAtLatitude(JNIEnv&, jni::jdouble la return mbgl::Projection::getMetersPerPixelAtLatitude(lat, zoom); } -jni::Object NativeMapView::projectedMetersForLatLng(JNIEnv& env, jni::jdouble latitude, jni::jdouble longitude) { +jni::Local> NativeMapView::projectedMetersForLatLng(JNIEnv& env, jni::jdouble latitude, jni::jdouble longitude) { mbgl::ProjectedMeters projectedMeters = mbgl::Projection::projectedMetersForLatLng(mbgl::LatLng(latitude, longitude)); return ProjectedMeters::New(env, projectedMeters.northing(), projectedMeters.easting()); } -jni::Object NativeMapView::latLngForProjectedMeters(JNIEnv& env, jdouble northing, jdouble easting) { +jni::Local> NativeMapView::latLngForProjectedMeters(JNIEnv& env, jdouble northing, jdouble easting) { return LatLng::New(env, mbgl::Projection::latLngForProjectedMeters(mbgl::ProjectedMeters(northing, easting))); } -jni::Object NativeMapView::pixelForLatLng(JNIEnv& env, jdouble latitude, jdouble longitude) { +jni::Local> NativeMapView::pixelForLatLng(JNIEnv& env, jdouble latitude, jdouble longitude) { mbgl::ScreenCoordinate pixel = map->pixelForLatLng(mbgl::LatLng(latitude, longitude)); return PointF::New(env, static_cast(pixel.x), static_cast(pixel.y)); } -jni::Object NativeMapView::latLngForPixel(JNIEnv& env, jfloat x, jfloat y) { +jni::Local> NativeMapView::latLngForPixel(JNIEnv& env, jfloat x, jfloat y) { return LatLng::New(env, map->latLngForPixel(mbgl::ScreenCoordinate(x, y))); } -jni::Array NativeMapView::addPolylines(JNIEnv& env, jni::Array> polylines) { +jni::Local> NativeMapView::addPolylines(JNIEnv& env, const jni::Array>& polylines) { NullCheck(env, &polylines); std::size_t len = polylines.Length(env); @@ -503,7 +503,7 @@ jni::Array NativeMapView::addPolylines(JNIEnv& env, jni::ArrayaddAnnotation(annotation)); } @@ -514,7 +514,7 @@ jni::Array NativeMapView::addPolylines(JNIEnv& env, jni::Array NativeMapView::addPolygons(JNIEnv& env, jni::Array> polygons) { +jni::Local> NativeMapView::addPolygons(JNIEnv& env, const jni::Array>& polygons) { NullCheck(env, &polygons); std::size_t len = polygons.Length(env); @@ -522,7 +522,7 @@ jni::Array NativeMapView::addPolygons(JNIEnv& env, jni::ArrayaddAnnotation(annotation)); } @@ -533,18 +533,18 @@ jni::Array NativeMapView::addPolygons(JNIEnv& env, jni::Array polyline) { +void NativeMapView::updatePolyline(JNIEnv& env, jlong polylineId, const jni::Object& polyline) { mbgl::LineAnnotation annotation = Polyline::toAnnotation(env, polyline); map->updateAnnotation(polylineId, annotation); } //TODO: Move to Polygon class and make native peer -void NativeMapView::updatePolygon(JNIEnv& env, jlong polygonId, jni::Object polygon) { +void NativeMapView::updatePolygon(JNIEnv& env, jlong polygonId, const jni::Object& polygon) { mbgl::FillAnnotation annotation = Polygon::toAnnotation(env, polygon); map->updateAnnotation(polygonId, annotation); } -void NativeMapView::removeAnnotations(JNIEnv& env, jni::Array ids) { +void NativeMapView::removeAnnotations(JNIEnv& env, const jni::Array& ids) { NullCheck(env, &ids); std::size_t len = ids.Length(env); auto elements = jni::GetArrayElements(env, *ids); @@ -558,7 +558,7 @@ void NativeMapView::removeAnnotations(JNIEnv& env, jni::Array ids) { } } -void NativeMapView::addAnnotationIcon(JNIEnv& env, jni::String symbol, jint w, jint h, jfloat scale, jni::Array jpixels) { +void NativeMapView::addAnnotationIcon(JNIEnv& env, const jni::String& symbol, jint w, jint h, jfloat scale, const jni::Array& jpixels) { const std::string symbolName = jni::Make(env, symbol); NullCheck(env, &jpixels); @@ -574,12 +574,12 @@ void NativeMapView::addAnnotationIcon(JNIEnv& env, jni::String symbol, jint w, j symbolName, std::move(premultipliedImage), float(scale))); } -void NativeMapView::removeAnnotationIcon(JNIEnv& env, jni::String symbol) { +void NativeMapView::removeAnnotationIcon(JNIEnv& env, const jni::String& symbol) { const std::string symbolName = jni::Make(env, symbol); map->removeAnnotationImage(symbolName); } -jdouble NativeMapView::getTopOffsetPixelsForAnnotationSymbol(JNIEnv& env, jni::String symbolName) { +jdouble NativeMapView::getTopOffsetPixelsForAnnotationSymbol(JNIEnv& env, const jni::String& symbolName) { return map->getTopOffsetPixelsForAnnotationImage(jni::Make(env, symbolName)); } @@ -605,7 +605,7 @@ void NativeMapView::setTransitionDelay(JNIEnv&, jlong delay) { map->getStyle().setTransitionOptions(transitionOptions); } -jni::Array NativeMapView::queryPointAnnotations(JNIEnv& env, jni::Object rect) { +jni::Local> NativeMapView::queryPointAnnotations(JNIEnv& env, const jni::Object& rect) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -626,7 +626,7 @@ jni::Array NativeMapView::queryPointAnnotations(JNIEnv& env, jni::Object< return result; } -jni::Array NativeMapView::queryShapeAnnotations(JNIEnv &env, jni::Object rect) { +jni::Local> NativeMapView::queryShapeAnnotations(JNIEnv& env, const jni::Object& rect) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -646,31 +646,31 @@ jni::Array NativeMapView::queryShapeAnnotations(JNIEnv &env, jni::Object< return result; } -jni::Array> NativeMapView::queryRenderedFeaturesForPoint(JNIEnv& env, jni::jfloat x, jni::jfloat y, - jni::Array layerIds, - jni::Array> jfilter) { +jni::Local>> NativeMapView::queryRenderedFeaturesForPoint(JNIEnv& env, jni::jfloat x, jni::jfloat y, + const jni::Array& layerIds, + const jni::Array>& jfilter) { using namespace mbgl::android::conversion; using namespace mbgl::android::geojson; mbgl::optional> layers; - if (layerIds != nullptr && layerIds.Length(env) > 0) { + if (layerIds && layerIds.Length(env) > 0) { layers = android::conversion::toVector(env, layerIds); } mapbox::geometry::point point = {x, y}; return Feature::convert( env, - rendererFrontend->queryRenderedFeatures(point, { layers, toFilter(env, jni::SeizeLocal(env, std::move(jfilter))) })); + rendererFrontend->queryRenderedFeatures(point, { layers, toFilter(env, jfilter) })); } -jni::Array> NativeMapView::queryRenderedFeaturesForBox(JNIEnv& env, jni::jfloat left, jni::jfloat top, - jni::jfloat right, jni::jfloat bottom, jni::Array layerIds, - jni::Array> jfilter) { +jni::Local>> NativeMapView::queryRenderedFeaturesForBox(JNIEnv& env, jni::jfloat left, jni::jfloat top, + jni::jfloat right, jni::jfloat bottom, const jni::Array& layerIds, + const jni::Array>& jfilter) { using namespace mbgl::android::conversion; using namespace mbgl::android::geojson; mbgl::optional> layers; - if (layerIds != nullptr && layerIds.Length(env) > 0) { + if (layerIds && layerIds.Length(env) > 0) { layers = toVector(env, layerIds); } mapbox::geometry::box box = { @@ -680,48 +680,48 @@ jni::Array> NativeMapView::queryRenderedFeaturesFo return Feature::convert( env, - rendererFrontend->queryRenderedFeatures(box, { layers, toFilter(env, jni::SeizeLocal(env, std::move(jfilter))) })); + rendererFrontend->queryRenderedFeatures(box, { layers, toFilter(env, jfilter) })); } -jni::Object NativeMapView::getLight(JNIEnv& env) { +jni::Local> NativeMapView::getLight(JNIEnv& env) { mbgl::style::Light* light = map->getStyle().getLight(); if (light) { - return jni::Object(Light::createJavaLightPeer(env, *map, *light)); + return Light::createJavaLightPeer(env, *map, *light); } else { - return jni::Object(); + return jni::Local>(); } } -jni::Array> NativeMapView::getLayers(JNIEnv& env) { +jni::Local>> NativeMapView::getLayers(JNIEnv& env) { // Get the core layers std::vector layers = map->getStyle().getLayers(); // Convert - jni::Array> jLayers = jni::Array>::New(env, layers.size()); + auto jLayers = jni::Array>::New(env, layers.size()); int index = 0; for (auto layer : layers) { - jLayers.Set(env, index, *jni::SeizeLocal(env, jni::Object(createJavaLayerPeer(env, *map, *layer)))); + jLayers.Set(env, index, createJavaLayerPeer(env, *map, *layer)); index++; } return jLayers; } -jni::Object NativeMapView::getLayer(JNIEnv& env, jni::String layerId) { +jni::Local> NativeMapView::getLayer(JNIEnv& env, const jni::String& layerId) { // Find the layer mbgl::style::Layer* coreLayer = map->getStyle().getLayer(jni::Make(env, layerId)); if (!coreLayer) { mbgl::Log::Debug(mbgl::Event::JNI, "No layer found"); - return jni::Object(); + return jni::Local>(); } // Create and return the layer's native peer - return jni::Object(createJavaLayerPeer(env, *map, *coreLayer)); + return createJavaLayerPeer(env, *map, *coreLayer); } -void NativeMapView::addLayer(JNIEnv& env, jlong nativeLayerPtr, jni::String before) { +void NativeMapView::addLayer(JNIEnv& env, jlong nativeLayerPtr, const jni::String& before) { assert(nativeLayerPtr != 0); Layer *layer = reinterpret_cast(nativeLayerPtr); @@ -732,7 +732,7 @@ void NativeMapView::addLayer(JNIEnv& env, jlong nativeLayerPtr, jni::String befo } } -void NativeMapView::addLayerAbove(JNIEnv& env, jlong nativeLayerPtr, jni::String above) { +void NativeMapView::addLayerAbove(JNIEnv& env, jlong nativeLayerPtr, const jni::String& above) { assert(nativeLayerPtr != 0); Layer *layer = reinterpret_cast(nativeLayerPtr); @@ -795,33 +795,33 @@ void NativeMapView::addLayerAt(JNIEnv& env, jlong nativeLayerPtr, jni::jint inde /** * Remove by layer id. */ -jni::Object NativeMapView::removeLayerById(JNIEnv& env, jni::String id) { +jni::Local> NativeMapView::removeLayerById(JNIEnv& env, const jni::String& id) { std::unique_ptr coreLayer = map->getStyle().removeLayer(jni::Make(env, id)); if (coreLayer) { - return jni::Object(createJavaLayerPeer(env, *map, std::move(coreLayer))); + return createJavaLayerPeer(env, *map, std::move(coreLayer)); } else { - return jni::Object(); + return jni::Local>(); } } /** * Remove layer at index. */ -jni::Object NativeMapView::removeLayerAt(JNIEnv& env, jni::jint index) { +jni::Local> NativeMapView::removeLayerAt(JNIEnv& env, jni::jint index) { auto layers = map->getStyle().getLayers(); // Check index int numLayers = layers.size() - 1; if (index > numLayers || index < 0) { Log::Warning(Event::JNI, "Index out of range: %i", index); - return jni::Object(); + return jni::Local>(); } std::unique_ptr coreLayer = map->getStyle().removeLayer(layers.at(index)->getID()); if (coreLayer) { - return jni::Object(createJavaLayerPeer(env, *map, std::move(coreLayer))); + return createJavaLayerPeer(env, *map, std::move(coreLayer)); } else { - return jni::Object(); + return jni::Local>(); } } @@ -838,12 +838,12 @@ void NativeMapView::removeLayer(JNIEnv&, jlong layerPtr) { } } -jni::Array> NativeMapView::getSources(JNIEnv& env) { +jni::Local>> NativeMapView::getSources(JNIEnv& env) { // Get the core sources std::vector sources = map->getStyle().getSources(); // Convert - jni::Array> jSources = jni::Array>::New(env, sources.size()); + auto jSources = jni::Array>::New(env, sources.size()); int index = 0; for (auto source : sources) { jSources.Set(env, index, Source::peerForCoreSource(env, *source, *rendererFrontend)); @@ -853,19 +853,19 @@ jni::Array> NativeMapView::getSources(JNIEnv& env) { return jSources; } -jni::Object NativeMapView::getSource(JNIEnv& env, jni::String sourceId) { +jni::Local> NativeMapView::getSource(JNIEnv& env, const jni::String& sourceId) { // Find the source mbgl::style::Source* coreSource = map->getStyle().getSource(jni::Make(env, sourceId)); if (!coreSource) { mbgl::Log::Debug(mbgl::Event::JNI, "No source found"); - return jni::Object(); + return jni::Local>(); } // Create and return the source's native peer - return Source::peerForCoreSource(env, *coreSource, *rendererFrontend); + return jni::NewLocal(env, Source::peerForCoreSource(env, *coreSource, *rendererFrontend)); } -void NativeMapView::addSource(JNIEnv& env, jni::Object obj, jlong sourcePtr) { +void NativeMapView::addSource(JNIEnv& env, const jni::Object& obj, jlong sourcePtr) { assert(sourcePtr != 0); Source *source = reinterpret_cast(sourcePtr); @@ -876,7 +876,7 @@ void NativeMapView::addSource(JNIEnv& env, jni::Object obj, jlong source } } -void NativeMapView::removeSource(JNIEnv& env, jni::Object obj, jlong sourcePtr) { +void NativeMapView::removeSource(JNIEnv& env, const jni::Object& obj, jlong sourcePtr) { assert(sourcePtr != 0); mbgl::android::Source *source = reinterpret_cast(sourcePtr); @@ -885,7 +885,7 @@ void NativeMapView::removeSource(JNIEnv& env, jni::Object obj, jlong sou } } -void NativeMapView::addImage(JNIEnv& env, jni::String name, jni::Object bitmap, jni::jfloat scale, jni::jboolean sdf) { +void NativeMapView::addImage(JNIEnv& env, const jni::String& name, const jni::Object& bitmap, jni::jfloat scale, jni::jboolean sdf) { jni::NullCheck(env, &bitmap); mbgl::PremultipliedImage premultipliedImage = Bitmap::GetImage(env, bitmap); @@ -897,26 +897,26 @@ void NativeMapView::addImage(JNIEnv& env, jni::String name, jni::Object ); } -void NativeMapView::addImages(JNIEnv& env, jni::Array> jimages) { +void NativeMapView::addImages(JNIEnv& env, const jni::Array>& jimages) { jni::NullCheck(env, &jimages); std::size_t len = jimages.Length(env); for (std::size_t i = 0; i < len; i++) { - auto image = mbgl::android::Image::getImage(env, *jni::SeizeLocal(env, jimages.Get(env, i))); + auto image = mbgl::android::Image::getImage(env, jimages.Get(env, i)); map->getStyle().addImage(std::make_unique(image)); } } -void NativeMapView::removeImage(JNIEnv& env, jni::String name) { +void NativeMapView::removeImage(JNIEnv& env, const jni::String& name) { map->getStyle().removeImage(jni::Make(env, name)); } -jni::Object NativeMapView::getImage(JNIEnv& env, jni::String name) { +jni::Local> NativeMapView::getImage(JNIEnv& env, const jni::String& name) { const mbgl::style::Image *image = map->getStyle().getImage(jni::Make(env, name)); if (image) { return Bitmap::CreateBitmap(env, image->getImage()); } else { - return jni::Object(); + return jni::Local>(); } } @@ -936,13 +936,13 @@ mbgl::Map& NativeMapView::getMap() { void NativeMapView::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer(env, javaClass, "nativePtr", - std::make_unique, jni::Object, jni::Object, jni::jfloat>, + jni::MakePeer&, const jni::Object&, const jni::Object&, jni::jfloat>, "nativeInitialize", "nativeDestroy", METHOD(&NativeMapView::resizeView, "nativeResizeView"), diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp index d398b39bf7..969833a25b 100755 --- a/platform/android/src/native_map_view.hpp +++ b/platform/android/src/native_map_view.hpp @@ -48,9 +48,9 @@ public: static void registerNative(jni::JNIEnv&); NativeMapView(jni::JNIEnv&, - jni::Object, - jni::Object, - jni::Object, + const jni::Object&, + const jni::Object&, + const jni::Object&, jni::jfloat pixelRatio); virtual ~NativeMapView(); @@ -76,15 +76,15 @@ public: void resizeView(jni::JNIEnv&, int, int); - jni::String getStyleUrl(jni::JNIEnv&); + jni::Local getStyleUrl(jni::JNIEnv&); - void setStyleUrl(jni::JNIEnv&, jni::String); + void setStyleUrl(jni::JNIEnv&, const jni::String&); - jni::String getStyleJson(jni::JNIEnv&); + jni::Local getStyleJson(jni::JNIEnv&); - void setStyleJson(jni::JNIEnv&, jni::String); + void setStyleJson(jni::JNIEnv&, const jni::String&); - void setLatLngBounds(jni::JNIEnv&, jni::Object); + void setLatLngBounds(jni::JNIEnv&, const jni::Object&); void cancelTransitions(jni::JNIEnv&); @@ -98,13 +98,13 @@ public: void flyTo(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong, jni::jdouble, jni::jdouble); - jni::Object getLatLng(JNIEnv&); + jni::Local> getLatLng(JNIEnv&); void setLatLng(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jlong); - jni::Object getCameraForLatLngBounds(jni::JNIEnv&, jni::Object, double top, double left, double bottom, double right, double bearing, double tilt); + jni::Local> getCameraForLatLngBounds(jni::JNIEnv&, const jni::Object&, double top, double left, double bottom, double right, double bearing, double tilt); - jni::Object getCameraForGeometry(jni::JNIEnv&, jni::Object, double top, double left, double bottom, double right, double bearing, double tilt); + jni::Local> getCameraForGeometry(jni::JNIEnv&, const jni::Object&, double top, double left, double bottom, double right, double bearing, double tilt); void setReachability(jni::JNIEnv&, jni::jboolean); @@ -138,17 +138,17 @@ public: void resetNorth(jni::JNIEnv&); - void setVisibleCoordinateBounds(JNIEnv&, jni::Array>, jni::Object, jni::jdouble, jni::jlong); + void setVisibleCoordinateBounds(JNIEnv&, const jni::Array>&, const jni::Object&, jni::jdouble, jni::jlong); void setContentPadding(JNIEnv&, double, double, double, double); void scheduleSnapshot(jni::JNIEnv&); - jni::Object getCameraPosition(jni::JNIEnv&); + jni::Local> getCameraPosition(jni::JNIEnv&); - void updateMarker(jni::JNIEnv&, jni::jlong, jni::jdouble, jni::jdouble, jni::String); + void updateMarker(jni::JNIEnv&, jni::jlong, jni::jdouble, jni::jdouble, const jni::String&); - jni::Array addMarkers(jni::JNIEnv&, jni::Array>); + jni::Local> addMarkers(jni::JNIEnv&, const jni::Array>&); void onLowMemory(JNIEnv& env); @@ -162,29 +162,29 @@ public: jni::jdouble getMetersPerPixelAtLatitude(JNIEnv&, jni::jdouble, jni::jdouble); - jni::Object projectedMetersForLatLng(JNIEnv&, jni::jdouble, jni::jdouble); + jni::Local> projectedMetersForLatLng(JNIEnv&, jni::jdouble, jni::jdouble); - jni::Object pixelForLatLng(JNIEnv&, jdouble, jdouble); + jni::Local> pixelForLatLng(JNIEnv&, jdouble, jdouble); - jni::Object latLngForProjectedMeters(JNIEnv&, jdouble, jdouble); + jni::Local> latLngForProjectedMeters(JNIEnv&, jdouble, jdouble); - jni::Object latLngForPixel(JNIEnv&, jfloat, jfloat); + jni::Local> latLngForPixel(JNIEnv&, jfloat, jfloat); - jni::Array addPolylines(JNIEnv&, jni::Array>); + jni::Local> addPolylines(JNIEnv&, const jni::Array>&); - jni::Array addPolygons(JNIEnv&, jni::Array>); + jni::Local> addPolygons(JNIEnv&, const jni::Array>&); - void updatePolyline(JNIEnv&, jlong, jni::Object); + void updatePolyline(JNIEnv&, jlong, const jni::Object&); - void updatePolygon(JNIEnv&, jlong, jni::Object); + void updatePolygon(JNIEnv&, jlong, const jni::Object&); - void removeAnnotations(JNIEnv&, jni::Array); + void removeAnnotations(JNIEnv&, const jni::Array&); - void addAnnotationIcon(JNIEnv&, jni::String, jint, jint, jfloat, jni::Array); + void addAnnotationIcon(JNIEnv&, const jni::String&, jint, jint, jfloat, const jni::Array&); - void removeAnnotationIcon(JNIEnv&, jni::String); + void removeAnnotationIcon(JNIEnv&, const jni::String&); - jni::jdouble getTopOffsetPixelsForAnnotationSymbol(JNIEnv&, jni::String); + jni::jdouble getTopOffsetPixelsForAnnotationSymbol(JNIEnv&, const jni::String&); jni::jlong getTransitionDuration(JNIEnv&); @@ -194,53 +194,53 @@ public: void setTransitionDelay(JNIEnv&, jni::jlong); - jni::Array queryPointAnnotations(JNIEnv&, jni::Object); + jni::Local> queryPointAnnotations(JNIEnv&, const jni::Object&); - jni::Array queryShapeAnnotations(JNIEnv&, jni::Object); + jni::Local> queryShapeAnnotations(JNIEnv&, const jni::Object&); - jni::Array> queryRenderedFeaturesForPoint(JNIEnv&, jni::jfloat, jni::jfloat, - jni::Array, - jni::Array> jfilter); + jni::Local>> queryRenderedFeaturesForPoint(JNIEnv&, jni::jfloat, jni::jfloat, + const jni::Array&, + const jni::Array>& jfilter); - jni::Array> queryRenderedFeaturesForBox(JNIEnv&, jni::jfloat, jni::jfloat, jni::jfloat, - jni::jfloat, jni::Array, - jni::Array> jfilter); + jni::Local>> queryRenderedFeaturesForBox(JNIEnv&, jni::jfloat, jni::jfloat, jni::jfloat, + jni::jfloat, const jni::Array&, + const jni::Array>& jfilter); - jni::Object getLight(JNIEnv&); + jni::Local> getLight(JNIEnv&); - jni::Array> getLayers(JNIEnv&); + jni::Local>> getLayers(JNIEnv&); - jni::Object getLayer(JNIEnv&, jni::String); + jni::Local> getLayer(JNIEnv&, const jni::String&); - void addLayer(JNIEnv&, jlong, jni::String); + void addLayer(JNIEnv&, jlong, const jni::String&); - void addLayerAbove(JNIEnv&, jlong, jni::String); + void addLayerAbove(JNIEnv&, jlong, const jni::String&); void addLayerAt(JNIEnv&, jni::jlong, jni::jint); - jni::Object removeLayerById(JNIEnv&, jni::String); + jni::Local> removeLayerById(JNIEnv&, const jni::String&); - jni::Object removeLayerAt(JNIEnv&, jni::jint); + jni::Local> removeLayerAt(JNIEnv&, jni::jint); void removeLayer(JNIEnv&, jlong); - jni::Array> getSources(JNIEnv&); + jni::Local>> getSources(JNIEnv&); - jni::Object getSource(JNIEnv&, jni::String); + jni::Local> getSource(JNIEnv&, const jni::String&); - void addSource(JNIEnv&, jni::Object, jlong nativePtr); + void addSource(JNIEnv&, const jni::Object&, jlong nativePtr); - jni::Object removeSourceById(JNIEnv&, jni::String); + jni::Local> removeSourceById(JNIEnv&, const jni::String&); - void removeSource(JNIEnv&, jni::Object, jlong nativePtr); + void removeSource(JNIEnv&, const jni::Object&, jlong nativePtr); - void addImage(JNIEnv&, jni::String, jni::Object bitmap, jni::jfloat, jni::jboolean); + void addImage(JNIEnv&, const jni::String&, const jni::Object& bitmap, jni::jfloat, jni::jboolean); - void addImages(JNIEnv&, jni::Array>); + void addImages(JNIEnv&, const jni::Array>&); - void removeImage(JNIEnv&, jni::String); + void removeImage(JNIEnv&, const jni::String&); - jni::Object getImage(JNIEnv&, jni::String); + jni::Local> getImage(JNIEnv&, const jni::String&); void setPrefetchesTiles(JNIEnv&, jni::jboolean); @@ -252,7 +252,7 @@ private: std::unique_ptr rendererFrontend; JavaVM *vm = nullptr; - jni::Weak> javaPeer; + jni::WeakReference> javaPeer; MapRenderer& mapRenderer; diff --git a/platform/android/src/offline/offline_manager.cpp b/platform/android/src/offline/offline_manager.cpp index 263f7b9d8b..b27af8bdae 100644 --- a/platform/android/src/offline/offline_manager.cpp +++ b/platform/android/src/offline/offline_manager.cpp @@ -3,14 +3,13 @@ #include #include "../attach_env.hpp" -#include "../jni/generic_global_ref_deleter.hpp" namespace mbgl { namespace android { // OfflineManager // -OfflineManager::OfflineManager(jni::JNIEnv& env, jni::Object jFileSource) +OfflineManager::OfflineManager(jni::JNIEnv& env, const jni::Object& jFileSource) : fileSource(mbgl::android::FileSource::getDefaultFileSource(env, jFileSource)) { } @@ -20,12 +19,14 @@ void OfflineManager::setOfflineMapboxTileCountLimit(jni::JNIEnv&, jni::jlong lim fileSource.setOfflineMapboxTileCountLimit(limit); } -void OfflineManager::listOfflineRegions(jni::JNIEnv& env_, jni::Object jFileSource_, jni::Object callback_) { - // list regions +void OfflineManager::listOfflineRegions(jni::JNIEnv& env_, const jni::Object& jFileSource_, const jni::Object& callback_) { + auto globalCallback = jni::NewGlobal(env_, callback_); + auto globalFilesource = jni::NewGlobal(env_, jFileSource_); + fileSource.listOfflineRegions([ //Keep a shared ptr to a global reference of the callback and file source so they are not GC'd in the meanwhile - callback = std::shared_ptr(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()), - jFileSource = std::shared_ptr(jFileSource_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) + callback = std::make_shared(std::move(globalCallback)), + jFileSource = std::make_shared(std::move(globalFilesource)) ](mbgl::expected regions) mutable { // Reattach, the callback comes from a different thread @@ -33,20 +34,19 @@ void OfflineManager::listOfflineRegions(jni::JNIEnv& env_, jni::Object(*jFileSource), - jni::Object(*callback), std::move(*regions)); + *env, *jFileSource, *callback, std::move(*regions)); } else { OfflineManager::ListOfflineRegionsCallback::onError( - *env, jni::Object(*callback), regions.error()); + *env, *callback, regions.error()); } }); } void OfflineManager::createOfflineRegion(jni::JNIEnv& env_, - jni::Object jFileSource_, - jni::Object definition_, - jni::Array metadata_, - jni::Object callback_) { + const jni::Object& jFileSource_, + const jni::Object& definition_, + const jni::Array& metadata_, + const jni::Object& callback_) { // Convert auto definition = OfflineRegionDefinition::getDefinition(env_, definition_); @@ -55,11 +55,14 @@ void OfflineManager::createOfflineRegion(jni::JNIEnv& env_, metadata = OfflineRegion::metadata(env_, metadata_); } + auto globalCallback = jni::NewGlobal(env_, callback_); + auto globalFilesource = jni::NewGlobal(env_, jFileSource_); + // Create region fileSource.createOfflineRegion(definition, metadata, [ //Keep a shared ptr to a global reference of the callback and file source so they are not GC'd in the meanwhile - callback = std::shared_ptr(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()), - jFileSource = std::shared_ptr(jFileSource_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) + callback = std::make_shared(std::move(globalCallback)), + jFileSource = std::make_shared(std::move(globalFilesource)) ](mbgl::expected region) mutable { // Reattach, the callback comes from a different thread @@ -67,12 +70,11 @@ void OfflineManager::createOfflineRegion(jni::JNIEnv& env_, if (region) { OfflineManager::CreateOfflineRegionCallback::onCreate( - *env, - jni::Object(*jFileSource), - jni::Object(*callback), std::move(*region) + *env, *jFileSource, *callback, std::move(*region) ); } else { - OfflineManager::CreateOfflineRegionCallback::onError(*env, jni::Object(*callback), region.error()); + OfflineManager::CreateOfflineRegionCallback::onError( + *env, *callback, region.error()); } }); } @@ -81,12 +83,12 @@ void OfflineManager::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); jni::Class::Singleton(env); - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&OfflineManager::setOfflineMapboxTileCountLimit, "setOfflineMapboxTileCountLimit"), @@ -97,53 +99,50 @@ void OfflineManager::registerNative(jni::JNIEnv& env) { // OfflineManager::ListOfflineRegionsCallback // void OfflineManager::ListOfflineRegionsCallback::onError(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, std::exception_ptr error) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onError"); - callback.Call(env, method, - *jni::SeizeLocal(env, jni::Make(env, mbgl::util::toString(error)))); + callback.Call(env, method, jni::Make(env, mbgl::util::toString(error))); } void OfflineManager::ListOfflineRegionsCallback::onList(jni::JNIEnv& env, - jni::Object jFileSource, - jni::Object callback, + const jni::Object& jFileSource, + const jni::Object& callback, mbgl::optional> regions) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod>)>(env, "onList"); std::size_t index = 0; - auto jregions = jni::SeizeLocal(env, jni::Array>::New(env, regions->size())); + auto jregions = jni::Array>::New(env, regions->size()); for (auto& region : *regions) { - jregions->Set(env, index, *jni::SeizeLocal(env, OfflineRegion::New(env, jFileSource, std::move(region)))); + jregions.Set(env, index, OfflineRegion::New(env, jFileSource, std::move(region))); index++; } - callback.Call(env, method, *jregions); + callback.Call(env, method, jregions); } // OfflineManager::CreateOfflineRegionCallback // void OfflineManager::CreateOfflineRegionCallback::onError(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, std::exception_ptr error) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onError"); - callback.Call(env, method, - *jni::SeizeLocal(env, jni::Make(env, mbgl::util::toString(error)))); + callback.Call(env, method, jni::Make(env, mbgl::util::toString(error))); } void OfflineManager::CreateOfflineRegionCallback::onCreate(jni::JNIEnv& env, - jni::Object jFileSource, - jni::Object callback, + const jni::Object& jFileSource, + const jni::Object& callback, mbgl::optional region) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod)>(env, "onCreate"); - callback.Call(env, method, - *jni::SeizeLocal(env, OfflineRegion::New(env, jFileSource, std::move(*region)))); + callback.Call(env, method, OfflineRegion::New(env, jFileSource, std::move(*region))); } } // namespace android diff --git a/platform/android/src/offline/offline_manager.hpp b/platform/android/src/offline/offline_manager.hpp index 43f5045c71..21ca5ca9c1 100644 --- a/platform/android/src/offline/offline_manager.hpp +++ b/platform/android/src/offline/offline_manager.hpp @@ -20,11 +20,11 @@ public: public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineManager$ListOfflineRegionsCallback";} - static void onError(jni::JNIEnv&, jni::Object, std::exception_ptr); + static void onError(jni::JNIEnv&, const jni::Object&, std::exception_ptr); static void onList(jni::JNIEnv&, - jni::Object, - jni::Object, + const jni::Object&, + const jni::Object&, mbgl::optional>); }; @@ -32,11 +32,11 @@ public: public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineManager$CreateOfflineRegionCallback"; } - static void onError(jni::JNIEnv&, jni::Object, std::exception_ptr); + static void onError(jni::JNIEnv&, const jni::Object&, std::exception_ptr); static void onCreate(jni::JNIEnv&, - jni::Object, - jni::Object, + const jni::Object&, + const jni::Object&, mbgl::optional); }; @@ -44,18 +44,18 @@ public: static void registerNative(jni::JNIEnv&); - OfflineManager(jni::JNIEnv&, jni::Object); + OfflineManager(jni::JNIEnv&, const jni::Object&); ~OfflineManager(); void setOfflineMapboxTileCountLimit(jni::JNIEnv&, jni::jlong limit); - void listOfflineRegions(jni::JNIEnv&, jni::Object, jni::Object callback); + void listOfflineRegions(jni::JNIEnv&, const jni::Object&, const jni::Object& callback); void createOfflineRegion(jni::JNIEnv&, - jni::Object jFileSource_, - jni::Object definition, - jni::Array metadata, - jni::Object callback); + const jni::Object& jFileSource_, + const jni::Object& definition, + const jni::Array& metadata, + const jni::Object& callback); private: mbgl::DefaultFileSource& fileSource; diff --git a/platform/android/src/offline/offline_region.cpp b/platform/android/src/offline/offline_region.cpp index 949377e221..1cd73a7c76 100644 --- a/platform/android/src/offline/offline_region.cpp +++ b/platform/android/src/offline/offline_region.cpp @@ -7,71 +7,62 @@ #include "offline_region_error.hpp" #include "offline_region_status.hpp" #include "../attach_env.hpp" -#include "../jni/generic_global_ref_deleter.hpp" namespace mbgl { namespace android { // OfflineRegion // -OfflineRegion::OfflineRegion(jni::JNIEnv& env, jni::jlong offlineRegionPtr, jni::Object jFileSource) +OfflineRegion::OfflineRegion(jni::JNIEnv& env, jni::jlong offlineRegionPtr, const jni::Object& jFileSource) : region(reinterpret_cast(offlineRegionPtr)), fileSource(mbgl::android::FileSource::getDefaultFileSource(env, jFileSource)) {} OfflineRegion::~OfflineRegion() {} -void OfflineRegion::setOfflineRegionObserver(jni::JNIEnv& env_, jni::Object callback) { +void OfflineRegion::setOfflineRegionObserver(jni::JNIEnv& env_, const jni::Object& callback) { // Define the observer class Observer : public mbgl::OfflineRegionObserver { public: - Observer(jni::Global>&& callback_) - //TODO add a generic deleter for jni::Object - : callback(callback_.release().Get()) { - } - - ~Observer() override { - android::UniqueEnv env = android::AttachEnv(); - env->DeleteGlobalRef(Unwrap(*callback)); + Observer(jni::Global, jni::EnvAttachingDeleter> callback_) + : callback(std::move(callback_)) { } void statusChanged(mbgl::OfflineRegionStatus status) override { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto method = javaClass.GetMethod)>(*env, "onStatusChanged"); - callback.Call(*env, method, - *jni::SeizeLocal(*env, OfflineRegionStatus::New(*env, status))); + callback.Call(*env, method, OfflineRegionStatus::New(*env, status)); } void responseError(mbgl::Response::Error error) override { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto method = javaClass.GetMethod)>(*env, "onError"); - callback.Call(*env, method, - *jni::SeizeLocal(*env, OfflineRegionError::New(*env, error))); + callback.Call(*env, method, OfflineRegionError::New(*env, error)); } void mapboxTileCountLimitExceeded(uint64_t limit) override { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto method = javaClass.GetMethod(*env, "mapboxTileCountLimitExceeded"); callback.Call(*env, method, jlong(limit)); } - jni::Object callback; + jni::Global, jni::EnvAttachingDeleter> callback; }; // Set the observer - fileSource.setOfflineRegionObserver(*region, std::make_unique(callback.NewGlobalRef(env_))); + fileSource.setOfflineRegionObserver(*region, std::make_unique(jni::NewGlobal(env_, callback))); } void OfflineRegion::setOfflineRegionDownloadState(jni::JNIEnv&, jni::jint jState) { @@ -92,85 +83,84 @@ void OfflineRegion::setOfflineRegionDownloadState(jni::JNIEnv&, jni::jint jState fileSource.setOfflineRegionDownloadState(*region, state); } -void OfflineRegion::getOfflineRegionStatus(jni::JNIEnv& env_, jni::Object callback_) { +void OfflineRegion::getOfflineRegionStatus(jni::JNIEnv& env_, const jni::Object& callback_) { + auto globalCallback = jni::NewGlobal(env_, callback_); fileSource.getOfflineRegionStatus(*region, [ //Ensure the object is not gc'd in the meanwhile - callback = std::shared_ptr(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) + callback = std::make_shared(std::move(globalCallback)) ](mbgl::expected status) mutable { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); if (status) { - OfflineRegionStatusCallback::onStatus(*env, jni::Object(*callback), std::move(*status)); + OfflineRegionStatusCallback::onStatus(*env, *callback, std::move(*status)); } else { - OfflineRegionStatusCallback::onError(*env, jni::Object(*callback), status.error()); + OfflineRegionStatusCallback::onError(*env, *callback, status.error()); } }); } -void OfflineRegion::deleteOfflineRegion(jni::JNIEnv& env_, jni::Object callback_) { - // Delete +void OfflineRegion::deleteOfflineRegion(jni::JNIEnv& env_, const jni::Object& callback_) { + auto globalCallback = jni::NewGlobal(env_, callback_); + fileSource.deleteOfflineRegion(std::move(*region), [ //Ensure the object is not gc'd in the meanwhile - callback = std::shared_ptr(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) + callback = std::make_shared(std::move(globalCallback)) ](std::exception_ptr error) mutable { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); if (error) { - OfflineRegionDeleteCallback::onError(*env, jni::Object(*callback), error); + OfflineRegionDeleteCallback::onError(*env, *callback, error); } else { - OfflineRegionDeleteCallback::onDelete(*env, jni::Object(*callback)); + OfflineRegionDeleteCallback::onDelete(*env, *callback); } }); } -void OfflineRegion::updateOfflineRegionMetadata(jni::JNIEnv& env_, jni::Array jMetadata, jni::Object callback_) { - - // Convert +void OfflineRegion::updateOfflineRegionMetadata(jni::JNIEnv& env_, const jni::Array& jMetadata, const jni::Object& callback_) { auto metadata = OfflineRegion::metadata(env_, jMetadata); + auto globalCallback = jni::NewGlobal(env_, callback_); fileSource.updateOfflineMetadata(region->getID(), metadata, [ //Ensure the object is not gc'd in the meanwhile - callback = std::shared_ptr(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) + callback = std::make_shared(std::move(globalCallback)) ](mbgl::expected data) mutable { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); if (data) { - OfflineRegionUpdateMetadataCallback::onUpdate(*env, jni::Object(*callback), std::move(*data)); + OfflineRegionUpdateMetadataCallback::onUpdate(*env, *callback, std::move(*data)); } else { - OfflineRegionUpdateMetadataCallback::onError(*env, jni::Object(*callback), data.error()); + OfflineRegionUpdateMetadataCallback::onError(*env, *callback, data.error()); } }); } -jni::Object OfflineRegion::New(jni::JNIEnv& env, jni::Object jFileSource, mbgl::OfflineRegion region) { +jni::Local> OfflineRegion::New(jni::JNIEnv& env, const jni::Object& jFileSource, mbgl::OfflineRegion region) { // Definition - auto definition = jni::SeizeLocal(env, region.getDefinition().match( + auto definition = region.getDefinition().match( [&](const mbgl::OfflineTilePyramidRegionDefinition def) { - return jni::Object( - *OfflineTilePyramidRegionDefinition::New(env, def)); + return OfflineTilePyramidRegionDefinition::New(env, def); }, [&](const mbgl::OfflineGeometryRegionDefinition def) { - return jni::Object( - *OfflineGeometryRegionDefinition::New(env, def)); - })); + return OfflineGeometryRegionDefinition::New(env, def); + }); // Create region java object - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor, jni::jlong, jni::Object, jni::Array>(env); return javaClass.New(env, constructor, reinterpret_cast(new mbgl::OfflineRegion(std::move(region))), //Copy a region to the heap jFileSource, jni::jlong(region.getID()), - *definition, - *jni::SeizeLocal(env, OfflineRegion::metadata(env, region.getMetadata()))); + definition, + OfflineRegion::metadata(env, region.getMetadata())); } -jni::Array OfflineRegion::metadata(jni::JNIEnv& env, mbgl::OfflineRegionMetadata metadata_) { +jni::Local> OfflineRegion::metadata(jni::JNIEnv& env, mbgl::OfflineRegionMetadata metadata_) { std::vector convertedMetadata(metadata_.begin(), metadata_.end()); std::size_t length = static_cast(convertedMetadata.size()); auto metadata = jni::Array::New(env, length); @@ -178,7 +168,7 @@ jni::Array OfflineRegion::metadata(jni::JNIEnv& env, mbgl::OfflineRe return metadata; } -mbgl::OfflineRegionMetadata OfflineRegion::metadata(jni::JNIEnv& env, jni::Array metadata_) { +mbgl::OfflineRegionMetadata OfflineRegion::metadata(jni::JNIEnv& env, const jni::Array& metadata_) { std::size_t length = metadata_.Length(env); auto metadata_tmp = std::vector(); metadata_tmp.resize(length); @@ -193,12 +183,12 @@ void OfflineRegion::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); jni::Class::Singleton(env); - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&OfflineRegion::setOfflineRegionObserver, "setOfflineRegionObserver"), @@ -214,40 +204,37 @@ void OfflineRegion::registerNative(jni::JNIEnv& env) { // OfflineRegionStatusCallback // void OfflineRegion::OfflineRegionStatusCallback::onError(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, std::exception_ptr error) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onError"); - callback.Call(env, method, - *jni::SeizeLocal(env, jni::Make(env, mbgl::util::toString(error)))); + callback.Call(env, method, jni::Make(env, mbgl::util::toString(error))); } void OfflineRegion::OfflineRegionStatusCallback::onStatus(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, mbgl::optional status) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod)>(env, "onStatus"); - callback.Call(env, method, - *jni::SeizeLocal(env, OfflineRegionStatus::New(env, std::move(*status)))); + callback.Call(env, method, OfflineRegionStatus::New(env, std::move(*status))); } // OfflineRegionDeleteCallback // void OfflineRegion::OfflineRegionDeleteCallback::onError(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, std::exception_ptr error) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onError"); - callback.Call(env, method, - *jni::SeizeLocal(env, jni::Make(env, mbgl::util::toString(error)))); + callback.Call(env, method, jni::Make(env, mbgl::util::toString(error))); } -void OfflineRegion::OfflineRegionDeleteCallback::onDelete(jni::JNIEnv& env, jni::Object callback) { +void OfflineRegion::OfflineRegionDeleteCallback::onDelete(jni::JNIEnv& env, const jni::Object& callback) { // Trigger callback - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onDelete"); callback.Call(env, method); @@ -256,23 +243,21 @@ void OfflineRegion::OfflineRegionDeleteCallback::onDelete(jni::JNIEnv& env, jni: // OfflineRegionUpdateMetadataCallback // void OfflineRegion::OfflineRegionUpdateMetadataCallback::onError(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, std::exception_ptr error) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "onError"); - callback.Call(env, method, - *jni::SeizeLocal(env, jni::Make(env, mbgl::util::toString(error)))); + callback.Call(env, method, jni::Make(env, mbgl::util::toString(error))); } void OfflineRegion::OfflineRegionUpdateMetadataCallback::onUpdate(jni::JNIEnv& env, - jni::Object callback, + const jni::Object& callback, mbgl::optional metadata) { - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod)>(env, "onUpdate"); - callback.Call(env, method, - *jni::SeizeLocal(env, OfflineRegion::metadata(env, std::move(*metadata)))); + callback.Call(env, method, OfflineRegion::metadata(env, std::move(*metadata))); } } // namespace android diff --git a/platform/android/src/offline/offline_region.hpp b/platform/android/src/offline/offline_region.hpp index 11aecb82a9..49fa0c8ff8 100644 --- a/platform/android/src/offline/offline_region.hpp +++ b/platform/android/src/offline/offline_region.hpp @@ -21,10 +21,10 @@ public: public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionStatusCallback"; }; - static void onError(jni::JNIEnv&, jni::Object, std::exception_ptr); + static void onError(jni::JNIEnv&, const jni::Object&, std::exception_ptr); static void onStatus(jni::JNIEnv&, - jni::Object, + const jni::Object&, mbgl::optional); }; @@ -32,43 +32,43 @@ public: public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionDeleteCallback"; }; - static void onError(jni::JNIEnv&, jni::Object, std::exception_ptr); + static void onError(jni::JNIEnv&, const jni::Object&, std::exception_ptr); - static void onDelete(jni::JNIEnv&, jni::Object); + static void onDelete(jni::JNIEnv&, const jni::Object&); }; class OfflineRegionUpdateMetadataCallback { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionUpdateMetadataCallback"; }; - static void onError(jni::JNIEnv&, jni::Object, std::exception_ptr); + static void onError(jni::JNIEnv&, const jni::Object&, std::exception_ptr); static void onUpdate(jni::JNIEnv&, - jni::Object, + const jni::Object&, mbgl::optional); }; static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegion"; }; - OfflineRegion(jni::JNIEnv&, jni::jlong, jni::Object); + OfflineRegion(jni::JNIEnv&, jni::jlong, const jni::Object&); ~OfflineRegion(); - void setOfflineRegionObserver(jni::JNIEnv&, jni::Object); + void setOfflineRegionObserver(jni::JNIEnv&, const jni::Object&); void setOfflineRegionDownloadState(jni::JNIEnv&, jni::jint); - void getOfflineRegionStatus(jni::JNIEnv&, jni::Object); + void getOfflineRegionStatus(jni::JNIEnv&, const jni::Object&); - void deleteOfflineRegion(jni::JNIEnv&, jni::Object); + void deleteOfflineRegion(jni::JNIEnv&, const jni::Object&); - void updateOfflineRegionMetadata(jni::JNIEnv&, jni::Array, jni::Object); + void updateOfflineRegionMetadata(jni::JNIEnv&, const jni::Array&, const jni::Object&); - static jni::Object New(jni::JNIEnv&, jni::Object, mbgl::OfflineRegion); + static jni::Local> New(jni::JNIEnv&, const jni::Object&, mbgl::OfflineRegion); - static jni::Array metadata(jni::JNIEnv&, mbgl::OfflineRegionMetadata); + static jni::Local> metadata(jni::JNIEnv&, mbgl::OfflineRegionMetadata); - static mbgl::OfflineRegionMetadata metadata(jni::JNIEnv&, jni::Array); + static mbgl::OfflineRegionMetadata metadata(jni::JNIEnv&, const jni::Array&); static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/offline/offline_region_definition.cpp b/platform/android/src/offline/offline_region_definition.cpp index 2a69181f5b..23e5b7466b 100644 --- a/platform/android/src/offline/offline_region_definition.cpp +++ b/platform/android/src/offline/offline_region_definition.cpp @@ -15,11 +15,11 @@ void OfflineRegionDefinition::registerNative(jni::JNIEnv& env) { } mbgl::OfflineRegionDefinition OfflineRegionDefinition::getDefinition(JNIEnv& env, - jni::Object jDefinition) { + const jni::Object& jDefinition) { if (jDefinition.IsInstanceOf(env, jni::Class::Singleton(env))) { - return OfflineTilePyramidRegionDefinition::getDefinition(env, jni::Object(*jDefinition)); + return OfflineTilePyramidRegionDefinition::getDefinition(env, jni::Cast(env, jni::Class::Singleton(env), jDefinition)); } else if (jDefinition.IsInstanceOf(env, jni::Class::Singleton(env))) { - return OfflineGeometryRegionDefinition::getDefinition(env, jni::Object(*jDefinition)); + return OfflineGeometryRegionDefinition::getDefinition(env, jni::Cast(env, jni::Class::Singleton(env), jDefinition)); } throw std::runtime_error("Unknown offline region definition java class"); @@ -27,21 +27,21 @@ mbgl::OfflineRegionDefinition OfflineRegionDefinition::getDefinition(JNIEnv& env // OfflineTilePyramidRegionDefinition // -jni::Object OfflineTilePyramidRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineTilePyramidRegionDefinition& definition) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> OfflineTilePyramidRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineTilePyramidRegionDefinition& definition) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor, jni::jdouble, jni::jdouble, jni::jfloat>(env); return javaClass.New(env, constructor, - *jni::SeizeLocal(env, jni::Make(env, definition.styleURL)), - *jni::SeizeLocal(env, LatLngBounds::New(env, definition.bounds)), + jni::Make(env, definition.styleURL), + LatLngBounds::New(env, definition.bounds), definition.minZoom, definition.maxZoom, definition.pixelRatio); } -mbgl::OfflineTilePyramidRegionDefinition OfflineTilePyramidRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object jDefinition) { +mbgl::OfflineTilePyramidRegionDefinition OfflineTilePyramidRegionDefinition::getDefinition(jni::JNIEnv& env, const jni::Object& jDefinition) { // Field references - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto styleURLF = javaClass.GetField(env, "styleURL"); static auto boundsF = javaClass.GetField>(env, "bounds"); static auto minZoomF = javaClass.GetField(env, "minZoom"); @@ -49,8 +49,8 @@ mbgl::OfflineTilePyramidRegionDefinition OfflineTilePyramidRegionDefinition::get static auto pixelRatioF = javaClass.GetField(env, "pixelRatio"); return mbgl::OfflineTilePyramidRegionDefinition( - jni::Make(env, *jni::SeizeLocal(env, jDefinition.Get(env, styleURLF))), - LatLngBounds::getLatLngBounds(env, *jni::SeizeLocal(env, jDefinition.Get(env, boundsF))), + jni::Make(env, jDefinition.Get(env, styleURLF)), + LatLngBounds::getLatLngBounds(env, jDefinition.Get(env, boundsF)), jDefinition.Get(env, minZoomF), jDefinition.Get(env, maxZoomF), jDefinition.Get(env, pixelRatioF) @@ -63,21 +63,21 @@ void OfflineTilePyramidRegionDefinition::registerNative(jni::JNIEnv& env) { // OfflineGeometryRegionDefinition // -jni::Object OfflineGeometryRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineGeometryRegionDefinition& definition) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> OfflineGeometryRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineGeometryRegionDefinition& definition) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor, jni::jdouble, jni::jdouble, jni::jfloat>(env); return javaClass.New(env, constructor, - *jni::SeizeLocal(env, jni::Make(env, definition.styleURL)), - *jni::SeizeLocal(env, geojson::Geometry::New(env, definition.geometry)), + jni::Make(env, definition.styleURL), + geojson::Geometry::New(env, definition.geometry), definition.minZoom, definition.maxZoom, definition.pixelRatio); } -mbgl::OfflineGeometryRegionDefinition OfflineGeometryRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object jDefinition) { +mbgl::OfflineGeometryRegionDefinition OfflineGeometryRegionDefinition::getDefinition(jni::JNIEnv& env, const jni::Object& jDefinition) { // Field references - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto styleURLF = javaClass.GetField(env, "styleURL"); static auto geometryF = javaClass.GetField>(env, "geometry"); static auto minZoomF = javaClass.GetField(env, "minZoom"); @@ -85,8 +85,8 @@ mbgl::OfflineGeometryRegionDefinition OfflineGeometryRegionDefinition::getDefini static auto pixelRatioF = javaClass.GetField(env, "pixelRatio"); return mbgl::OfflineGeometryRegionDefinition( - jni::Make(env, *jni::SeizeLocal(env, jDefinition.Get(env, styleURLF))), - geojson::Geometry::convert(env, *jni::SeizeLocal(env, jDefinition.Get(env, geometryF))), + jni::Make(env, jDefinition.Get(env, styleURLF)), + geojson::Geometry::convert(env, jDefinition.Get(env, geometryF)), jDefinition.Get(env, minZoomF), jDefinition.Get(env, maxZoomF), jDefinition.Get(env, pixelRatioF) diff --git a/platform/android/src/offline/offline_region_definition.hpp b/platform/android/src/offline/offline_region_definition.hpp index 853cc833bf..827fac0a80 100644 --- a/platform/android/src/offline/offline_region_definition.hpp +++ b/platform/android/src/offline/offline_region_definition.hpp @@ -12,27 +12,29 @@ public: static void registerNative(jni::JNIEnv&); - static mbgl::OfflineRegionDefinition getDefinition(JNIEnv& env, jni::Object jDefinition); + static mbgl::OfflineRegionDefinition getDefinition(JNIEnv& env, const jni::Object& jDefinition); }; -class OfflineTilePyramidRegionDefinition: public OfflineRegionDefinition { +class OfflineTilePyramidRegionDefinition { public: + using SuperTag = OfflineRegionDefinition; static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineTilePyramidRegionDefinition"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::OfflineTilePyramidRegionDefinition&); + static jni::Local> New(jni::JNIEnv&, const mbgl::OfflineTilePyramidRegionDefinition&); - static mbgl::OfflineTilePyramidRegionDefinition getDefinition(jni::JNIEnv&, jni::Object); + static mbgl::OfflineTilePyramidRegionDefinition getDefinition(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; -class OfflineGeometryRegionDefinition: public OfflineRegionDefinition { +class OfflineGeometryRegionDefinition { public: + using SuperTag = OfflineRegionDefinition; static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineGeometryRegionDefinition"; }; - static jni::Object New(jni::JNIEnv&, const mbgl::OfflineGeometryRegionDefinition&); + static jni::Local> New(jni::JNIEnv&, const mbgl::OfflineGeometryRegionDefinition&); - static mbgl::OfflineGeometryRegionDefinition getDefinition(jni::JNIEnv&, jni::Object); + static mbgl::OfflineGeometryRegionDefinition getDefinition(jni::JNIEnv&, const jni::Object&); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/offline/offline_region_error.cpp b/platform/android/src/offline/offline_region_error.cpp index 02432757d4..199bbafa6b 100644 --- a/platform/android/src/offline/offline_region_error.cpp +++ b/platform/android/src/offline/offline_region_error.cpp @@ -3,7 +3,7 @@ namespace mbgl { namespace android { -jni::Object OfflineRegionError::New(jni::JNIEnv& env, mbgl::Response::Error error) { +jni::Local> OfflineRegionError::New(jni::JNIEnv& env, mbgl::Response::Error error) { // Handle the value of reason independently of the underlying int value std::string reason; @@ -28,12 +28,12 @@ jni::Object OfflineRegionError::New(jni::JNIEnv& env, mbgl:: break; } - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, - *jni::SeizeLocal(env, jni::Make(env, reason)), - *jni::SeizeLocal(env, jni::Make(env, error.message))); + jni::Make(env, reason), + jni::Make(env, error.message)); } void OfflineRegionError::registerNative(jni::JNIEnv& env) { diff --git a/platform/android/src/offline/offline_region_error.hpp b/platform/android/src/offline/offline_region_error.hpp index c51f08a745..151e05ab19 100644 --- a/platform/android/src/offline/offline_region_error.hpp +++ b/platform/android/src/offline/offline_region_error.hpp @@ -10,7 +10,7 @@ class OfflineRegionError { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegionError"; }; - static jni::Object New(jni::JNIEnv&, mbgl::Response::Error); + static jni::Local> New(jni::JNIEnv&, mbgl::Response::Error); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/offline/offline_region_status.cpp b/platform/android/src/offline/offline_region_status.cpp index 0a415bdb5f..5dd9f20a7f 100644 --- a/platform/android/src/offline/offline_region_status.cpp +++ b/platform/android/src/offline/offline_region_status.cpp @@ -3,7 +3,7 @@ namespace mbgl { namespace android { -jni::Object OfflineRegionStatus::New(jni::JNIEnv& env, mbgl::OfflineRegionStatus status) { +jni::Local> OfflineRegionStatus::New(jni::JNIEnv& env, mbgl::OfflineRegionStatus status) { // Convert to jint jint downloadState; @@ -17,7 +17,7 @@ jni::Object OfflineRegionStatus::New(jni::JNIEnv& env, mbgl } // Create java object - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, downloadState, diff --git a/platform/android/src/offline/offline_region_status.hpp b/platform/android/src/offline/offline_region_status.hpp index 9f638e1093..9ef48ec357 100644 --- a/platform/android/src/offline/offline_region_status.hpp +++ b/platform/android/src/offline/offline_region_status.hpp @@ -10,7 +10,7 @@ class OfflineRegionStatus { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegionStatus"; }; - static jni::Object New(jni::JNIEnv&, mbgl::OfflineRegionStatus status); + static jni::Local> New(jni::JNIEnv&, mbgl::OfflineRegionStatus status); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/snapshotter/map_snapshot.cpp b/platform/android/src/snapshotter/map_snapshot.cpp index d626ae68b7..1650f72dc7 100644 --- a/platform/android/src/snapshotter/map_snapshot.cpp +++ b/platform/android/src/snapshotter/map_snapshot.cpp @@ -16,18 +16,18 @@ MapSnapshot::MapSnapshot(float pixelRatio_, MapSnapshot::PointForFn pointForFn_, MapSnapshot::~MapSnapshot() = default; -jni::Object MapSnapshot::pixelForLatLng(jni::JNIEnv& env, jni::Object jLatLng) { +jni::Local> MapSnapshot::pixelForLatLng(jni::JNIEnv& env, jni::Object& jLatLng) { ScreenCoordinate point = pointForFn(LatLng::getLatLng(env, jLatLng)); return PointF::New(env, point.x * pixelRatio, point.y * pixelRatio); } -jni::Object MapSnapshot::latLngForPixel(jni::JNIEnv& env, jni::ObjectjPoint) { +jni::Local> MapSnapshot::latLngForPixel(jni::JNIEnv& env, jni::Object& jPoint) { return LatLng::New(env, latLngForFn(PointF::getScreenCoordinate(env, jPoint))); } // Static methods // -jni::Object MapSnapshot::New(JNIEnv& env, +jni::Local> MapSnapshot::New(JNIEnv& env, PremultipliedImage&& image, float pixelRatio, std::vector attributions, @@ -38,7 +38,7 @@ jni::Object MapSnapshot::New(JNIEnv& env, auto bitmap = Bitmap::CreateBitmap(env, std::move(image)); // Create the Mapsnapshot peers - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor, jni::Array, jni::jboolean>(env); auto nativePeer = std::make_unique(pixelRatio, pointForFn, latLngForFn); return javaClass.New(env, constructor, reinterpret_cast(nativePeer.release()), bitmap, conversion::toArray(env, attributions), (jni::jboolean) showLogo); @@ -46,7 +46,7 @@ jni::Object MapSnapshot::New(JNIEnv& env, void MapSnapshot::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/snapshotter/map_snapshot.hpp b/platform/android/src/snapshotter/map_snapshot.hpp index 3cd293b621..6b82d02835 100644 --- a/platform/android/src/snapshotter/map_snapshot.hpp +++ b/platform/android/src/snapshotter/map_snapshot.hpp @@ -23,7 +23,7 @@ public: static void registerNative(jni::JNIEnv&); - static jni::Object New(JNIEnv& env, + static jni::Local> New(JNIEnv& env, PremultipliedImage&& image, float pixelRatio, std::vector attributions, @@ -35,8 +35,8 @@ public: MapSnapshot(float pixelRatio, PointForFn, LatLngForFn); ~MapSnapshot(); - jni::Object pixelForLatLng(jni::JNIEnv&, jni::Object); - jni::Object latLngForPixel(jni::JNIEnv&, jni::Object); + jni::Local> pixelForLatLng(jni::JNIEnv&, jni::Object&); + jni::Local> latLngForPixel(jni::JNIEnv&, jni::Object&); private: float pixelRatio; diff --git a/platform/android/src/snapshotter/map_snapshotter.cpp b/platform/android/src/snapshotter/map_snapshotter.cpp index 4df0749aa0..e2e01f4e38 100644 --- a/platform/android/src/snapshotter/map_snapshotter.cpp +++ b/platform/android/src/snapshotter/map_snapshotter.cpp @@ -14,18 +14,18 @@ namespace mbgl { namespace android { MapSnapshotter::MapSnapshotter(jni::JNIEnv& _env, - jni::Object _obj, - jni::Object _jFileSource, + const jni::Object& _obj, + const jni::Object& _jFileSource, jni::jfloat _pixelRatio, jni::jint width, jni::jint height, - jni::String styleURL, - jni::String styleJSON, - jni::Object region, - jni::Object position, + const jni::String& styleURL, + const jni::String& styleJSON, + const jni::Object& region, + const jni::Object& position, jni::jboolean _showLogo, - jni::String _programCacheDir) - : javaPeer(SeizeGenericWeak(_obj.NewWeakGlobalRef(_env).release())) + const jni::String& _programCacheDir) + : javaPeer(_env, _obj) , pixelRatio(_pixelRatio) , threadPool(sharedThreadPool()) { @@ -80,20 +80,19 @@ void MapSnapshotter::start(JNIEnv& env) { [this](std::exception_ptr err, PremultipliedImage image, std::vector attributions, mbgl::MapSnapshotter::PointForFn pointForFn, mbgl::MapSnapshotter::LatLngForFn latLngForFn) { MBGL_VERIFY_THREAD(tid); android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); if (err) { // error handler callback static auto onSnapshotFailed = javaClass.GetMethod(*_env, "onSnapshotFailed"); - javaPeer->Call(*_env, onSnapshotFailed, - *jni::SeizeLocal(*_env, jni::Make(*_env, util::toString(err)))); + javaPeer.get(*_env).Call(*_env, onSnapshotFailed, jni::Make(*_env, util::toString(err))); } else { // Create the wrapper auto mapSnapshot = android::MapSnapshot::New(*_env, std::move(image), pixelRatio, attributions, showLogo, pointForFn, latLngForFn); // invoke callback static auto onSnapshotReady = javaClass.GetMethod)>(*_env, "onSnapshotReady"); - javaPeer->Call(*_env, onSnapshotReady, mapSnapshot); + javaPeer.get(*_env).Call(*_env, onSnapshotReady, mapSnapshot); } deactivateFilesource(*_env); @@ -108,11 +107,11 @@ void MapSnapshotter::cancel(JNIEnv& env) { deactivateFilesource(env); } -void MapSnapshotter::setStyleUrl(JNIEnv& env, jni::String styleURL) { +void MapSnapshotter::setStyleUrl(JNIEnv& env, const jni::String& styleURL) { snapshotter->setStyleURL(jni::Make(env, styleURL)); } -void MapSnapshotter::setStyleJson(JNIEnv& env, jni::String styleJSON) { +void MapSnapshotter::setStyleJson(JNIEnv& env, const jni::String& styleJSON) { snapshotter->setStyleJSON(jni::Make(env, styleJSON)); } @@ -121,12 +120,12 @@ void MapSnapshotter::setSize(JNIEnv&, jni::jint width, jni::jint height) { snapshotter->setSize(size); } -void MapSnapshotter::setCameraPosition(JNIEnv& env, jni::Object position) { +void MapSnapshotter::setCameraPosition(JNIEnv& env, const jni::Object& position) { auto options = CameraPosition::getCameraOptions(env, position); snapshotter->setCameraOptions(options); } -void MapSnapshotter::setRegion(JNIEnv& env, jni::Object region) { +void MapSnapshotter::setRegion(JNIEnv& env, const jni::Object& region) { snapshotter->setRegion(LatLngBounds::getLatLngBounds(env, region)); } @@ -151,13 +150,13 @@ void MapSnapshotter::deactivateFilesource(JNIEnv& env) { void MapSnapshotter::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer(env, javaClass, "nativePtr", - std::make_unique, jni::Object, jni::jfloat, jni::jint, jni::jint, jni::String, jni::String, jni::Object, jni::Object, jni::jboolean, jni::String>, + jni::MakePeer&, const jni::Object&, jni::jfloat, jni::jint, jni::jint, const jni::String&, const jni::String&, const jni::Object&, const jni::Object&, jni::jboolean, const jni::String&>, "nativeInitialize", "finalize", METHOD(&MapSnapshotter::setStyleUrl, "setStyleUrl"), diff --git a/platform/android/src/snapshotter/map_snapshotter.hpp b/platform/android/src/snapshotter/map_snapshotter.hpp index 05a27256aa..e20acf4f1f 100644 --- a/platform/android/src/snapshotter/map_snapshotter.hpp +++ b/platform/android/src/snapshotter/map_snapshotter.hpp @@ -9,7 +9,6 @@ #include "../map/camera_position.hpp" #include -#include "../jni/generic_global_ref_deleter.hpp" #include @@ -26,29 +25,29 @@ public: static void registerNative(jni::JNIEnv&); MapSnapshotter(jni::JNIEnv&, - jni::Object, - jni::Object, + const jni::Object&, + const jni::Object&, jni::jfloat pixelRatio, jni::jint width, jni::jint height, - jni::String styleURL, - jni::String styleJSON, - jni::Object region, - jni::Object position, + const jni::String& styleURL, + const jni::String& styleJSON, + const jni::Object& region, + const jni::Object& position, jni::jboolean showLogo, - jni::String programCacheDir); + const jni::String& programCacheDir); ~MapSnapshotter(); - void setStyleUrl(JNIEnv&, jni::String styleURL); + void setStyleUrl(JNIEnv&, const jni::String& styleURL); - void setStyleJson(JNIEnv&, jni::String styleJSON); + void setStyleJson(JNIEnv&, const jni::String& styleJSON); void setSize(JNIEnv&, jni::jint width, jni::jint height); - void setCameraPosition(JNIEnv&, jni::Object position); + void setCameraPosition(JNIEnv&, const jni::Object& position); - void setRegion(JNIEnv&, jni::Object region); + void setRegion(JNIEnv&, const jni::Object& region); void start(JNIEnv&); @@ -58,7 +57,7 @@ private: MBGL_STORE_THREAD(tid); JavaVM *vm = nullptr; - GenericWeak> javaPeer; + jni::WeakReference, jni::EnvAttachingDeleter> javaPeer; float pixelRatio; bool showLogo; diff --git a/platform/android/src/style/conversion/filter.cpp b/platform/android/src/style/conversion/filter.cpp index 44b5a71aa3..d15e2747ac 100644 --- a/platform/android/src/style/conversion/filter.cpp +++ b/platform/android/src/style/conversion/filter.cpp @@ -8,11 +8,11 @@ namespace mbgl { namespace android { namespace conversion { -optional toFilter(jni::JNIEnv& env, jni::Local>> jfilter) { +optional toFilter(jni::JNIEnv& env, const jni::Array>& jfilter) { mbgl::optional filter; if (jfilter) { mbgl::style::conversion::Error error; - auto converted = mbgl::style::conversion::convert(Value(env, std::move(jfilter)), error); + auto converted = mbgl::style::conversion::convert(Value(env, jfilter), error); if (!converted) { mbgl::Log::Error(mbgl::Event::JNI, "Error converting filter: " + error.message); } diff --git a/platform/android/src/style/conversion/filter.hpp b/platform/android/src/style/conversion/filter.hpp index f638a853a1..920d336a1a 100644 --- a/platform/android/src/style/conversion/filter.hpp +++ b/platform/android/src/style/conversion/filter.hpp @@ -9,7 +9,7 @@ namespace mbgl { namespace android { namespace conversion { -optional toFilter(jni::JNIEnv&, jni::Local>>); +optional toFilter(jni::JNIEnv&, const jni::Array>&); } // namespace conversion } // namespace android diff --git a/platform/android/src/style/conversion/position.cpp b/platform/android/src/style/conversion/position.cpp index 9b3925914e..e3c334afd2 100644 --- a/platform/android/src/style/conversion/position.cpp +++ b/platform/android/src/style/conversion/position.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace android { namespace conversion { -Result> Converter, mbgl::style::Position>::operator()(jni::JNIEnv &env, const mbgl::style::Position &value) const { +Result>> Converter>, mbgl::style::Position>::operator()(jni::JNIEnv &env, const mbgl::style::Position &value) const { std::array cartPosition = value.getSpherical(); return Position::fromPosition(env, cartPosition[0], cartPosition[1], cartPosition[2]); } diff --git a/platform/android/src/style/conversion/position.hpp b/platform/android/src/style/conversion/position.hpp index 2ef4bf4395..90409d527d 100644 --- a/platform/android/src/style/conversion/position.hpp +++ b/platform/android/src/style/conversion/position.hpp @@ -11,8 +11,8 @@ namespace android { namespace conversion { template <> -struct Converter, mbgl::style::Position> { - Result> operator()(jni::JNIEnv &env, const mbgl::style::Position &value) const; +struct Converter>, mbgl::style::Position> { + Result>> operator()(jni::JNIEnv &env, const mbgl::style::Position &value) const; }; template <> diff --git a/platform/android/src/style/conversion/property_expression.hpp b/platform/android/src/style/conversion/property_expression.hpp index 08429960cb..4e26b11f96 100644 --- a/platform/android/src/style/conversion/property_expression.hpp +++ b/platform/android/src/style/conversion/property_expression.hpp @@ -12,8 +12,8 @@ namespace android { namespace conversion { template -struct Converter, mbgl::style::PropertyExpression> { - Result> operator()(jni::JNIEnv& env, const mbgl::style::PropertyExpression& value) const { +struct Converter>, mbgl::style::PropertyExpression> { + Result>> operator()(jni::JNIEnv& env, const mbgl::style::PropertyExpression& value) const { return gson::JsonElement::New(env, value.getExpression().serialize()); } }; diff --git a/platform/android/src/style/conversion/property_value.hpp b/platform/android/src/style/conversion/property_value.hpp index 8150285c85..317705a286 100644 --- a/platform/android/src/style/conversion/property_value.hpp +++ b/platform/android/src/style/conversion/property_value.hpp @@ -19,16 +19,16 @@ class PropertyValueEvaluator { public: PropertyValueEvaluator(jni::JNIEnv& _env) : env(_env) {} - jni::jobject* operator()(const mbgl::style::Undefined) const { - return nullptr; + jni::Local> operator()(const mbgl::style::Undefined) const { + return jni::Local>(env, nullptr); } - jni::jobject* operator()(const T& value) const { - return *convert(env, value); + jni::Local> operator()(const T& value) const { + return std::move(*convert>>(env, value)); } - jni::jobject* operator()(const mbgl::style::PropertyExpression& value) const { - return *convert>(env, value); + jni::Local> operator()(const mbgl::style::PropertyExpression& value) const { + return std::move(*convert>>(env, value)); } private: @@ -39,8 +39,8 @@ private: * Convert core property values to java */ template -struct Converter> { - Result operator()(jni::JNIEnv& env, const mbgl::style::PropertyValue& value) const { +struct Converter>, mbgl::style::PropertyValue> { + Result>> operator()(jni::JNIEnv& env, const mbgl::style::PropertyValue& value) const { PropertyValueEvaluator evaluator(env); return value.evaluate(evaluator); } @@ -50,10 +50,10 @@ struct Converter> { * Convert core heat map color property value to java */ template <> -struct Converter { - Result operator()(jni::JNIEnv& env, const mbgl::style::ColorRampPropertyValue& value) const { +struct Converter>, mbgl::style::ColorRampPropertyValue> { + Result>> operator()(jni::JNIEnv& env, const mbgl::style::ColorRampPropertyValue& value) const { PropertyValueEvaluator evaluator(env); - return *convert(env, value.evaluate(evaluator)); + return std::move(*convert>>(env, value.evaluate(evaluator))); } }; diff --git a/platform/android/src/style/conversion/transition_options.cpp b/platform/android/src/style/conversion/transition_options.cpp index 313333ad17..66ddc74145 100644 --- a/platform/android/src/style/conversion/transition_options.cpp +++ b/platform/android/src/style/conversion/transition_options.cpp @@ -4,7 +4,7 @@ namespace mbgl { namespace android { namespace conversion { -Result> Converter, mbgl::style::TransitionOptions>::operator()(jni::JNIEnv& env, const mbgl::style::TransitionOptions& value) const { +Result>> Converter>, mbgl::style::TransitionOptions>::operator()(jni::JNIEnv& env, const mbgl::style::TransitionOptions& value) const { return TransitionOptions::fromTransitionOptions(env, std::chrono::duration_cast(value.duration.value_or(mbgl::Duration::zero())).count(), std::chrono::duration_cast(value.delay.value_or(mbgl::Duration::zero())).count() diff --git a/platform/android/src/style/conversion/transition_options.hpp b/platform/android/src/style/conversion/transition_options.hpp index 6630456d37..06c042922e 100644 --- a/platform/android/src/style/conversion/transition_options.hpp +++ b/platform/android/src/style/conversion/transition_options.hpp @@ -12,8 +12,8 @@ namespace android { namespace conversion { template<> -struct Converter, mbgl::style::TransitionOptions> { - Result> operator()(jni::JNIEnv&, const mbgl::style::TransitionOptions&) const; +struct Converter>, mbgl::style::TransitionOptions> { + Result>> operator()(jni::JNIEnv&, const mbgl::style::TransitionOptions&) const; }; } diff --git a/platform/android/src/style/layers/background_layer.cpp b/platform/android/src/style/layers/background_layer.cpp index 00c348b232..c806e8471f 100644 --- a/platform/android/src/style/layers/background_layer.cpp +++ b/platform/android/src/style/layers/background_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - BackgroundLayer::BackgroundLayer(jni::JNIEnv& env, jni::String layerId) + BackgroundLayer::BackgroundLayer(jni::JNIEnv& env, jni::String& layerId) : Layer(env, std::make_unique(jni::Make(env, layerId))) { } @@ -35,16 +35,15 @@ namespace android { // Property getters - jni::Object BackgroundLayer::getBackgroundColor(jni::JNIEnv& env) { + jni::Local> BackgroundLayer::getBackgroundColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->BackgroundLayer::getBackgroundColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->BackgroundLayer::getBackgroundColor())); } - jni::Object BackgroundLayer::getBackgroundColorTransition(jni::JNIEnv& env) { + jni::Local> BackgroundLayer::getBackgroundColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->BackgroundLayer::getBackgroundColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void BackgroundLayer::setBackgroundColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -54,16 +53,15 @@ namespace android { layer.as()->BackgroundLayer::setBackgroundColorTransition(options); } - jni::Object BackgroundLayer::getBackgroundPattern(jni::JNIEnv& env) { + jni::Local> BackgroundLayer::getBackgroundPattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->BackgroundLayer::getBackgroundPattern()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->BackgroundLayer::getBackgroundPattern())); } - jni::Object BackgroundLayer::getBackgroundPatternTransition(jni::JNIEnv& env) { + jni::Local> BackgroundLayer::getBackgroundPatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->BackgroundLayer::getBackgroundPatternTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void BackgroundLayer::setBackgroundPatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -73,16 +71,15 @@ namespace android { layer.as()->BackgroundLayer::setBackgroundPatternTransition(options); } - jni::Object BackgroundLayer::getBackgroundOpacity(jni::JNIEnv& env) { + jni::Local> BackgroundLayer::getBackgroundOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->BackgroundLayer::getBackgroundOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->BackgroundLayer::getBackgroundOpacity())); } - jni::Object BackgroundLayer::getBackgroundOpacityTransition(jni::JNIEnv& env) { + jni::Local> BackgroundLayer::getBackgroundOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->BackgroundLayer::getBackgroundOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void BackgroundLayer::setBackgroundOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -93,22 +90,22 @@ namespace android { } - jni::jobject* BackgroundLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> BackgroundLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void BackgroundLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&BackgroundLayer::getBackgroundColorTransition, "nativeGetBackgroundColorTransition"), diff --git a/platform/android/src/style/layers/background_layer.hpp b/platform/android/src/style/layers/background_layer.hpp index 3b7f03ddb6..78cd5659fd 100644 --- a/platform/android/src/style/layers/background_layer.hpp +++ b/platform/android/src/style/layers/background_layer.hpp @@ -12,12 +12,12 @@ namespace android { class BackgroundLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/BackgroundLayer"; }; static void registerNative(jni::JNIEnv&); - BackgroundLayer(jni::JNIEnv&, jni::String); + BackgroundLayer(jni::JNIEnv&, jni::String&); BackgroundLayer(mbgl::Map&, mbgl::style::BackgroundLayer&); @@ -27,18 +27,18 @@ public: // Properties - jni::Object getBackgroundColor(jni::JNIEnv&); + jni::Local> getBackgroundColor(jni::JNIEnv&); void setBackgroundColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getBackgroundColorTransition(jni::JNIEnv&); + jni::Local> getBackgroundColorTransition(jni::JNIEnv&); - jni::Object getBackgroundPattern(jni::JNIEnv&); + jni::Local> getBackgroundPattern(jni::JNIEnv&); void setBackgroundPatternTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getBackgroundPatternTransition(jni::JNIEnv&); + jni::Local> getBackgroundPatternTransition(jni::JNIEnv&); - jni::Object getBackgroundOpacity(jni::JNIEnv&); + jni::Local> getBackgroundOpacity(jni::JNIEnv&); void setBackgroundOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getBackgroundOpacityTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getBackgroundOpacityTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class BackgroundLayer diff --git a/platform/android/src/style/layers/circle_layer.cpp b/platform/android/src/style/layers/circle_layer.cpp index 47a492dd43..9ec48d7b18 100644 --- a/platform/android/src/style/layers/circle_layer.cpp +++ b/platform/android/src/style/layers/circle_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - CircleLayer::CircleLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + CircleLayer::CircleLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,16 +35,15 @@ namespace android { // Property getters - jni::Object CircleLayer::getCircleRadius(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleRadius(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleRadius()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleRadius())); } - jni::Object CircleLayer::getCircleRadiusTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleRadiusTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleRadiusTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -54,16 +53,15 @@ namespace android { layer.as()->CircleLayer::setCircleRadiusTransition(options); } - jni::Object CircleLayer::getCircleColor(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleColor())); } - jni::Object CircleLayer::getCircleColorTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -73,16 +71,15 @@ namespace android { layer.as()->CircleLayer::setCircleColorTransition(options); } - jni::Object CircleLayer::getCircleBlur(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleBlur()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleBlur())); } - jni::Object CircleLayer::getCircleBlurTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleBlurTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -92,16 +89,15 @@ namespace android { layer.as()->CircleLayer::setCircleBlurTransition(options); } - jni::Object CircleLayer::getCircleOpacity(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleOpacity())); } - jni::Object CircleLayer::getCircleOpacityTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -111,16 +107,15 @@ namespace android { layer.as()->CircleLayer::setCircleOpacityTransition(options); } - jni::Object CircleLayer::getCircleTranslate(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleTranslate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleTranslate())); } - jni::Object CircleLayer::getCircleTranslateTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleTranslateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -130,34 +125,30 @@ namespace android { layer.as()->CircleLayer::setCircleTranslateTransition(options); } - jni::Object CircleLayer::getCircleTranslateAnchor(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleTranslateAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleTranslateAnchor())); } - jni::Object CircleLayer::getCirclePitchScale(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCirclePitchScale(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCirclePitchScale()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCirclePitchScale())); } - jni::Object CircleLayer::getCirclePitchAlignment(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCirclePitchAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCirclePitchAlignment()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCirclePitchAlignment())); } - jni::Object CircleLayer::getCircleStrokeWidth(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleStrokeWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleStrokeWidth()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleStrokeWidth())); } - jni::Object CircleLayer::getCircleStrokeWidthTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleStrokeWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleStrokeWidthTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleStrokeWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -167,16 +158,15 @@ namespace android { layer.as()->CircleLayer::setCircleStrokeWidthTransition(options); } - jni::Object CircleLayer::getCircleStrokeColor(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleStrokeColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleStrokeColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleStrokeColor())); } - jni::Object CircleLayer::getCircleStrokeColorTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleStrokeColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleStrokeColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleStrokeColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -186,16 +176,15 @@ namespace android { layer.as()->CircleLayer::setCircleStrokeColorTransition(options); } - jni::Object CircleLayer::getCircleStrokeOpacity(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleStrokeOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->CircleLayer::getCircleStrokeOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->CircleLayer::getCircleStrokeOpacity())); } - jni::Object CircleLayer::getCircleStrokeOpacityTransition(jni::JNIEnv& env) { + jni::Local> CircleLayer::getCircleStrokeOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->CircleLayer::getCircleStrokeOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void CircleLayer::setCircleStrokeOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -206,22 +195,22 @@ namespace android { } - jni::jobject* CircleLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> CircleLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void CircleLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&CircleLayer::getCircleRadiusTransition, "nativeGetCircleRadiusTransition"), diff --git a/platform/android/src/style/layers/circle_layer.hpp b/platform/android/src/style/layers/circle_layer.hpp index 03063b1fc1..0ff34094e1 100644 --- a/platform/android/src/style/layers/circle_layer.hpp +++ b/platform/android/src/style/layers/circle_layer.hpp @@ -12,12 +12,12 @@ namespace android { class CircleLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/CircleLayer"; }; static void registerNative(jni::JNIEnv&); - CircleLayer(jni::JNIEnv&, jni::String, jni::String); + CircleLayer(jni::JNIEnv&, jni::String&, jni::String&); CircleLayer(mbgl::Map&, mbgl::style::CircleLayer&); @@ -27,44 +27,44 @@ public: // Properties - jni::Object getCircleRadius(jni::JNIEnv&); + jni::Local> getCircleRadius(jni::JNIEnv&); void setCircleRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleRadiusTransition(jni::JNIEnv&); + jni::Local> getCircleRadiusTransition(jni::JNIEnv&); - jni::Object getCircleColor(jni::JNIEnv&); + jni::Local> getCircleColor(jni::JNIEnv&); void setCircleColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleColorTransition(jni::JNIEnv&); + jni::Local> getCircleColorTransition(jni::JNIEnv&); - jni::Object getCircleBlur(jni::JNIEnv&); + jni::Local> getCircleBlur(jni::JNIEnv&); void setCircleBlurTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleBlurTransition(jni::JNIEnv&); + jni::Local> getCircleBlurTransition(jni::JNIEnv&); - jni::Object getCircleOpacity(jni::JNIEnv&); + jni::Local> getCircleOpacity(jni::JNIEnv&); void setCircleOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleOpacityTransition(jni::JNIEnv&); + jni::Local> getCircleOpacityTransition(jni::JNIEnv&); - jni::Object getCircleTranslate(jni::JNIEnv&); + jni::Local> getCircleTranslate(jni::JNIEnv&); void setCircleTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleTranslateTransition(jni::JNIEnv&); + jni::Local> getCircleTranslateTransition(jni::JNIEnv&); - jni::Object getCircleTranslateAnchor(jni::JNIEnv&); + jni::Local> getCircleTranslateAnchor(jni::JNIEnv&); - jni::Object getCirclePitchScale(jni::JNIEnv&); + jni::Local> getCirclePitchScale(jni::JNIEnv&); - jni::Object getCirclePitchAlignment(jni::JNIEnv&); + jni::Local> getCirclePitchAlignment(jni::JNIEnv&); - jni::Object getCircleStrokeWidth(jni::JNIEnv&); + jni::Local> getCircleStrokeWidth(jni::JNIEnv&); void setCircleStrokeWidthTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleStrokeWidthTransition(jni::JNIEnv&); + jni::Local> getCircleStrokeWidthTransition(jni::JNIEnv&); - jni::Object getCircleStrokeColor(jni::JNIEnv&); + jni::Local> getCircleStrokeColor(jni::JNIEnv&); void setCircleStrokeColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleStrokeColorTransition(jni::JNIEnv&); + jni::Local> getCircleStrokeColorTransition(jni::JNIEnv&); - jni::Object getCircleStrokeOpacity(jni::JNIEnv&); + jni::Local> getCircleStrokeOpacity(jni::JNIEnv&); void setCircleStrokeOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getCircleStrokeOpacityTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getCircleStrokeOpacityTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class CircleLayer diff --git a/platform/android/src/style/layers/custom_layer.cpp b/platform/android/src/style/layers/custom_layer.cpp index c0dcc24f06..f6f3bb249c 100644 --- a/platform/android/src/style/layers/custom_layer.cpp +++ b/platform/android/src/style/layers/custom_layer.cpp @@ -7,7 +7,7 @@ namespace mbgl { namespace android { - CustomLayer::CustomLayer(jni::JNIEnv& env, jni::String layerId, jni::jlong host) + CustomLayer::CustomLayer(jni::JNIEnv& env, const jni::String& layerId, jni::jlong host) : Layer(env, std::make_unique( jni::Make(env, layerId), std::unique_ptr(reinterpret_cast(host))) @@ -33,22 +33,22 @@ namespace android { } } - jni::jobject* CustomLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> CustomLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void CustomLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&CustomLayer::update, "nativeUpdate")); diff --git a/platform/android/src/style/layers/custom_layer.hpp b/platform/android/src/style/layers/custom_layer.hpp index 75e1957717..950fcef9c1 100644 --- a/platform/android/src/style/layers/custom_layer.hpp +++ b/platform/android/src/style/layers/custom_layer.hpp @@ -9,18 +9,19 @@ namespace android { class CustomLayer : public Layer { public: + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/CustomLayer"; }; static void registerNative(jni::JNIEnv&); - CustomLayer(jni::JNIEnv&, jni::String, jni::jlong); + CustomLayer(jni::JNIEnv&, const jni::String&, jni::jlong); CustomLayer(mbgl::Map&, mbgl::style::CustomLayer&); CustomLayer(mbgl::Map&, std::unique_ptr); ~CustomLayer(); void update(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class CustomLayer diff --git a/platform/android/src/style/layers/fill_extrusion_layer.cpp b/platform/android/src/style/layers/fill_extrusion_layer.cpp index 6c6a0bef5a..cf53e774a5 100644 --- a/platform/android/src/style/layers/fill_extrusion_layer.cpp +++ b/platform/android/src/style/layers/fill_extrusion_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - FillExtrusionLayer::FillExtrusionLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + FillExtrusionLayer::FillExtrusionLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,16 +35,15 @@ namespace android { // Property getters - jni::Object FillExtrusionLayer::getFillExtrusionOpacity(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionOpacity())); } - jni::Object FillExtrusionLayer::getFillExtrusionOpacityTransition(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillExtrusionLayer::getFillExtrusionOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -54,16 +53,15 @@ namespace android { layer.as()->FillExtrusionLayer::setFillExtrusionOpacityTransition(options); } - jni::Object FillExtrusionLayer::getFillExtrusionColor(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionColor())); } - jni::Object FillExtrusionLayer::getFillExtrusionColorTransition(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillExtrusionLayer::getFillExtrusionColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -73,16 +71,15 @@ namespace android { layer.as()->FillExtrusionLayer::setFillExtrusionColorTransition(options); } - jni::Object FillExtrusionLayer::getFillExtrusionTranslate(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionTranslate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionTranslate())); } - jni::Object FillExtrusionLayer::getFillExtrusionTranslateTransition(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillExtrusionLayer::getFillExtrusionTranslateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -92,22 +89,20 @@ namespace android { layer.as()->FillExtrusionLayer::setFillExtrusionTranslateTransition(options); } - jni::Object FillExtrusionLayer::getFillExtrusionTranslateAnchor(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionTranslateAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionTranslateAnchor())); } - jni::Object FillExtrusionLayer::getFillExtrusionPattern(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionPattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionPattern()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionPattern())); } - jni::Object FillExtrusionLayer::getFillExtrusionPatternTransition(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionPatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillExtrusionLayer::getFillExtrusionPatternTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionPatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -117,16 +112,15 @@ namespace android { layer.as()->FillExtrusionLayer::setFillExtrusionPatternTransition(options); } - jni::Object FillExtrusionLayer::getFillExtrusionHeight(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionHeight(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionHeight()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionHeight())); } - jni::Object FillExtrusionLayer::getFillExtrusionHeightTransition(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionHeightTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillExtrusionLayer::getFillExtrusionHeightTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionHeightTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -136,16 +130,15 @@ namespace android { layer.as()->FillExtrusionLayer::setFillExtrusionHeightTransition(options); } - jni::Object FillExtrusionLayer::getFillExtrusionBase(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionBase(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillExtrusionLayer::getFillExtrusionBase()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillExtrusionLayer::getFillExtrusionBase())); } - jni::Object FillExtrusionLayer::getFillExtrusionBaseTransition(jni::JNIEnv& env) { + jni::Local> FillExtrusionLayer::getFillExtrusionBaseTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillExtrusionLayer::getFillExtrusionBaseTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillExtrusionLayer::setFillExtrusionBaseTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -156,22 +149,22 @@ namespace android { } - jni::jobject* FillExtrusionLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> FillExtrusionLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void FillExtrusionLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&FillExtrusionLayer::getFillExtrusionOpacityTransition, "nativeGetFillExtrusionOpacityTransition"), diff --git a/platform/android/src/style/layers/fill_extrusion_layer.hpp b/platform/android/src/style/layers/fill_extrusion_layer.hpp index 233c3cc334..abc30b5845 100644 --- a/platform/android/src/style/layers/fill_extrusion_layer.hpp +++ b/platform/android/src/style/layers/fill_extrusion_layer.hpp @@ -12,12 +12,12 @@ namespace android { class FillExtrusionLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/FillExtrusionLayer"; }; static void registerNative(jni::JNIEnv&); - FillExtrusionLayer(jni::JNIEnv&, jni::String, jni::String); + FillExtrusionLayer(jni::JNIEnv&, jni::String&, jni::String&); FillExtrusionLayer(mbgl::Map&, mbgl::style::FillExtrusionLayer&); @@ -27,32 +27,32 @@ public: // Properties - jni::Object getFillExtrusionOpacity(jni::JNIEnv&); + jni::Local> getFillExtrusionOpacity(jni::JNIEnv&); void setFillExtrusionOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillExtrusionOpacityTransition(jni::JNIEnv&); + jni::Local> getFillExtrusionOpacityTransition(jni::JNIEnv&); - jni::Object getFillExtrusionColor(jni::JNIEnv&); + jni::Local> getFillExtrusionColor(jni::JNIEnv&); void setFillExtrusionColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillExtrusionColorTransition(jni::JNIEnv&); + jni::Local> getFillExtrusionColorTransition(jni::JNIEnv&); - jni::Object getFillExtrusionTranslate(jni::JNIEnv&); + jni::Local> getFillExtrusionTranslate(jni::JNIEnv&); void setFillExtrusionTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillExtrusionTranslateTransition(jni::JNIEnv&); + jni::Local> getFillExtrusionTranslateTransition(jni::JNIEnv&); - jni::Object getFillExtrusionTranslateAnchor(jni::JNIEnv&); + jni::Local> getFillExtrusionTranslateAnchor(jni::JNIEnv&); - jni::Object getFillExtrusionPattern(jni::JNIEnv&); + jni::Local> getFillExtrusionPattern(jni::JNIEnv&); void setFillExtrusionPatternTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillExtrusionPatternTransition(jni::JNIEnv&); + jni::Local> getFillExtrusionPatternTransition(jni::JNIEnv&); - jni::Object getFillExtrusionHeight(jni::JNIEnv&); + jni::Local> getFillExtrusionHeight(jni::JNIEnv&); void setFillExtrusionHeightTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillExtrusionHeightTransition(jni::JNIEnv&); + jni::Local> getFillExtrusionHeightTransition(jni::JNIEnv&); - jni::Object getFillExtrusionBase(jni::JNIEnv&); + jni::Local> getFillExtrusionBase(jni::JNIEnv&); void setFillExtrusionBaseTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillExtrusionBaseTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getFillExtrusionBaseTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class FillExtrusionLayer diff --git a/platform/android/src/style/layers/fill_layer.cpp b/platform/android/src/style/layers/fill_layer.cpp index 5182c546c8..555f8eb3cd 100644 --- a/platform/android/src/style/layers/fill_layer.cpp +++ b/platform/android/src/style/layers/fill_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - FillLayer::FillLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + FillLayer::FillLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,22 +35,20 @@ namespace android { // Property getters - jni::Object FillLayer::getFillAntialias(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillAntialias(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillAntialias()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillAntialias())); } - jni::Object FillLayer::getFillOpacity(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillOpacity())); } - jni::Object FillLayer::getFillOpacityTransition(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillLayer::getFillOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillLayer::setFillOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -60,16 +58,15 @@ namespace android { layer.as()->FillLayer::setFillOpacityTransition(options); } - jni::Object FillLayer::getFillColor(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillColor())); } - jni::Object FillLayer::getFillColorTransition(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillLayer::getFillColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillLayer::setFillColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -79,16 +76,15 @@ namespace android { layer.as()->FillLayer::setFillColorTransition(options); } - jni::Object FillLayer::getFillOutlineColor(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillOutlineColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillOutlineColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillOutlineColor())); } - jni::Object FillLayer::getFillOutlineColorTransition(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillOutlineColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillLayer::getFillOutlineColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillLayer::setFillOutlineColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -98,16 +94,15 @@ namespace android { layer.as()->FillLayer::setFillOutlineColorTransition(options); } - jni::Object FillLayer::getFillTranslate(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillTranslate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillTranslate())); } - jni::Object FillLayer::getFillTranslateTransition(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillLayer::getFillTranslateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillLayer::setFillTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -117,22 +112,20 @@ namespace android { layer.as()->FillLayer::setFillTranslateTransition(options); } - jni::Object FillLayer::getFillTranslateAnchor(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillTranslateAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillTranslateAnchor())); } - jni::Object FillLayer::getFillPattern(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillPattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->FillLayer::getFillPattern()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->FillLayer::getFillPattern())); } - jni::Object FillLayer::getFillPatternTransition(jni::JNIEnv& env) { + jni::Local> FillLayer::getFillPatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->FillLayer::getFillPatternTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void FillLayer::setFillPatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -143,22 +136,22 @@ namespace android { } - jni::jobject* FillLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> FillLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void FillLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&FillLayer::getFillAntialias, "nativeGetFillAntialias"), diff --git a/platform/android/src/style/layers/fill_layer.hpp b/platform/android/src/style/layers/fill_layer.hpp index db1fee1667..ea96320570 100644 --- a/platform/android/src/style/layers/fill_layer.hpp +++ b/platform/android/src/style/layers/fill_layer.hpp @@ -12,12 +12,12 @@ namespace android { class FillLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/FillLayer"; }; static void registerNative(jni::JNIEnv&); - FillLayer(jni::JNIEnv&, jni::String, jni::String); + FillLayer(jni::JNIEnv&, jni::String&, jni::String&); FillLayer(mbgl::Map&, mbgl::style::FillLayer&); @@ -27,30 +27,30 @@ public: // Properties - jni::Object getFillAntialias(jni::JNIEnv&); + jni::Local> getFillAntialias(jni::JNIEnv&); - jni::Object getFillOpacity(jni::JNIEnv&); + jni::Local> getFillOpacity(jni::JNIEnv&); void setFillOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillOpacityTransition(jni::JNIEnv&); + jni::Local> getFillOpacityTransition(jni::JNIEnv&); - jni::Object getFillColor(jni::JNIEnv&); + jni::Local> getFillColor(jni::JNIEnv&); void setFillColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillColorTransition(jni::JNIEnv&); + jni::Local> getFillColorTransition(jni::JNIEnv&); - jni::Object getFillOutlineColor(jni::JNIEnv&); + jni::Local> getFillOutlineColor(jni::JNIEnv&); void setFillOutlineColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillOutlineColorTransition(jni::JNIEnv&); + jni::Local> getFillOutlineColorTransition(jni::JNIEnv&); - jni::Object getFillTranslate(jni::JNIEnv&); + jni::Local> getFillTranslate(jni::JNIEnv&); void setFillTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillTranslateTransition(jni::JNIEnv&); + jni::Local> getFillTranslateTransition(jni::JNIEnv&); - jni::Object getFillTranslateAnchor(jni::JNIEnv&); + jni::Local> getFillTranslateAnchor(jni::JNIEnv&); - jni::Object getFillPattern(jni::JNIEnv&); + jni::Local> getFillPattern(jni::JNIEnv&); void setFillPatternTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getFillPatternTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getFillPatternTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class FillLayer diff --git a/platform/android/src/style/layers/heatmap_layer.cpp b/platform/android/src/style/layers/heatmap_layer.cpp index e83d92873f..b72b372929 100644 --- a/platform/android/src/style/layers/heatmap_layer.cpp +++ b/platform/android/src/style/layers/heatmap_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - HeatmapLayer::HeatmapLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + HeatmapLayer::HeatmapLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,16 +35,15 @@ namespace android { // Property getters - jni::Object HeatmapLayer::getHeatmapRadius(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapRadius(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HeatmapLayer::getHeatmapRadius()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HeatmapLayer::getHeatmapRadius())); } - jni::Object HeatmapLayer::getHeatmapRadiusTransition(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapRadiusTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HeatmapLayer::getHeatmapRadiusTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HeatmapLayer::setHeatmapRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -54,22 +53,20 @@ namespace android { layer.as()->HeatmapLayer::setHeatmapRadiusTransition(options); } - jni::Object HeatmapLayer::getHeatmapWeight(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapWeight(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HeatmapLayer::getHeatmapWeight()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HeatmapLayer::getHeatmapWeight())); } - jni::Object HeatmapLayer::getHeatmapIntensity(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapIntensity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HeatmapLayer::getHeatmapIntensity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HeatmapLayer::getHeatmapIntensity())); } - jni::Object HeatmapLayer::getHeatmapIntensityTransition(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapIntensityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HeatmapLayer::getHeatmapIntensityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HeatmapLayer::setHeatmapIntensityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -79,26 +76,24 @@ namespace android { layer.as()->HeatmapLayer::setHeatmapIntensityTransition(options); } - jni::Object HeatmapLayer::getHeatmapColor(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; auto propertyValue = layer.as()->HeatmapLayer::getHeatmapColor(); if (propertyValue.isUndefined()) { propertyValue = layer.as()->HeatmapLayer::getDefaultHeatmapColor(); } - Result converted = convert(env, propertyValue); - return jni::Object(*converted); + return std::move(*convert>>(env, propertyValue)); } - jni::Object HeatmapLayer::getHeatmapOpacity(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HeatmapLayer::getHeatmapOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HeatmapLayer::getHeatmapOpacity())); } - jni::Object HeatmapLayer::getHeatmapOpacityTransition(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HeatmapLayer::getHeatmapOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HeatmapLayer::setHeatmapOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -109,22 +104,22 @@ namespace android { } - jni::jobject* HeatmapLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> HeatmapLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void HeatmapLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&HeatmapLayer::getHeatmapRadiusTransition, "nativeGetHeatmapRadiusTransition"), diff --git a/platform/android/src/style/layers/heatmap_layer.hpp b/platform/android/src/style/layers/heatmap_layer.hpp index 00ab27d854..2976e6c482 100644 --- a/platform/android/src/style/layers/heatmap_layer.hpp +++ b/platform/android/src/style/layers/heatmap_layer.hpp @@ -12,12 +12,12 @@ namespace android { class HeatmapLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/HeatmapLayer"; }; static void registerNative(jni::JNIEnv&); - HeatmapLayer(jni::JNIEnv&, jni::String, jni::String); + HeatmapLayer(jni::JNIEnv&, jni::String&, jni::String&); HeatmapLayer(mbgl::Map&, mbgl::style::HeatmapLayer&); @@ -27,22 +27,22 @@ public: // Properties - jni::Object getHeatmapRadius(jni::JNIEnv&); + jni::Local> getHeatmapRadius(jni::JNIEnv&); void setHeatmapRadiusTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHeatmapRadiusTransition(jni::JNIEnv&); + jni::Local> getHeatmapRadiusTransition(jni::JNIEnv&); - jni::Object getHeatmapWeight(jni::JNIEnv&); + jni::Local> getHeatmapWeight(jni::JNIEnv&); - jni::Object getHeatmapIntensity(jni::JNIEnv&); + jni::Local> getHeatmapIntensity(jni::JNIEnv&); void setHeatmapIntensityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHeatmapIntensityTransition(jni::JNIEnv&); + jni::Local> getHeatmapIntensityTransition(jni::JNIEnv&); - jni::Object getHeatmapColor(jni::JNIEnv&); + jni::Local> getHeatmapColor(jni::JNIEnv&); - jni::Object getHeatmapOpacity(jni::JNIEnv&); + jni::Local> getHeatmapOpacity(jni::JNIEnv&); void setHeatmapOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHeatmapOpacityTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getHeatmapOpacityTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class HeatmapLayer diff --git a/platform/android/src/style/layers/hillshade_layer.cpp b/platform/android/src/style/layers/hillshade_layer.cpp index b6409b3b3e..5cd6162575 100644 --- a/platform/android/src/style/layers/hillshade_layer.cpp +++ b/platform/android/src/style/layers/hillshade_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - HillshadeLayer::HillshadeLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + HillshadeLayer::HillshadeLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,28 +35,25 @@ namespace android { // Property getters - jni::Object HillshadeLayer::getHillshadeIlluminationDirection(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeIlluminationDirection(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HillshadeLayer::getHillshadeIlluminationDirection()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HillshadeLayer::getHillshadeIlluminationDirection())); } - jni::Object HillshadeLayer::getHillshadeIlluminationAnchor(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeIlluminationAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HillshadeLayer::getHillshadeIlluminationAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HillshadeLayer::getHillshadeIlluminationAnchor())); } - jni::Object HillshadeLayer::getHillshadeExaggeration(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeExaggeration(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HillshadeLayer::getHillshadeExaggeration()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HillshadeLayer::getHillshadeExaggeration())); } - jni::Object HillshadeLayer::getHillshadeExaggerationTransition(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeExaggerationTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HillshadeLayer::getHillshadeExaggerationTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeExaggerationTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -66,16 +63,15 @@ namespace android { layer.as()->HillshadeLayer::setHillshadeExaggerationTransition(options); } - jni::Object HillshadeLayer::getHillshadeShadowColor(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeShadowColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HillshadeLayer::getHillshadeShadowColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HillshadeLayer::getHillshadeShadowColor())); } - jni::Object HillshadeLayer::getHillshadeShadowColorTransition(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeShadowColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HillshadeLayer::getHillshadeShadowColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeShadowColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -85,16 +81,15 @@ namespace android { layer.as()->HillshadeLayer::setHillshadeShadowColorTransition(options); } - jni::Object HillshadeLayer::getHillshadeHighlightColor(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeHighlightColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HillshadeLayer::getHillshadeHighlightColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HillshadeLayer::getHillshadeHighlightColor())); } - jni::Object HillshadeLayer::getHillshadeHighlightColorTransition(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeHighlightColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HillshadeLayer::getHillshadeHighlightColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeHighlightColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -104,16 +99,15 @@ namespace android { layer.as()->HillshadeLayer::setHillshadeHighlightColorTransition(options); } - jni::Object HillshadeLayer::getHillshadeAccentColor(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeAccentColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->HillshadeLayer::getHillshadeAccentColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->HillshadeLayer::getHillshadeAccentColor())); } - jni::Object HillshadeLayer::getHillshadeAccentColorTransition(jni::JNIEnv& env) { + jni::Local> HillshadeLayer::getHillshadeAccentColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->HillshadeLayer::getHillshadeAccentColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void HillshadeLayer::setHillshadeAccentColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -124,22 +118,22 @@ namespace android { } - jni::jobject* HillshadeLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> HillshadeLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void HillshadeLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&HillshadeLayer::getHillshadeIlluminationDirection, "nativeGetHillshadeIlluminationDirection"), diff --git a/platform/android/src/style/layers/hillshade_layer.hpp b/platform/android/src/style/layers/hillshade_layer.hpp index f824698058..9ca0e33cfd 100644 --- a/platform/android/src/style/layers/hillshade_layer.hpp +++ b/platform/android/src/style/layers/hillshade_layer.hpp @@ -12,12 +12,12 @@ namespace android { class HillshadeLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/HillshadeLayer"; }; static void registerNative(jni::JNIEnv&); - HillshadeLayer(jni::JNIEnv&, jni::String, jni::String); + HillshadeLayer(jni::JNIEnv&, jni::String&, jni::String&); HillshadeLayer(mbgl::Map&, mbgl::style::HillshadeLayer&); @@ -27,26 +27,26 @@ public: // Properties - jni::Object getHillshadeIlluminationDirection(jni::JNIEnv&); + jni::Local> getHillshadeIlluminationDirection(jni::JNIEnv&); - jni::Object getHillshadeIlluminationAnchor(jni::JNIEnv&); + jni::Local> getHillshadeIlluminationAnchor(jni::JNIEnv&); - jni::Object getHillshadeExaggeration(jni::JNIEnv&); + jni::Local> getHillshadeExaggeration(jni::JNIEnv&); void setHillshadeExaggerationTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHillshadeExaggerationTransition(jni::JNIEnv&); + jni::Local> getHillshadeExaggerationTransition(jni::JNIEnv&); - jni::Object getHillshadeShadowColor(jni::JNIEnv&); + jni::Local> getHillshadeShadowColor(jni::JNIEnv&); void setHillshadeShadowColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHillshadeShadowColorTransition(jni::JNIEnv&); + jni::Local> getHillshadeShadowColorTransition(jni::JNIEnv&); - jni::Object getHillshadeHighlightColor(jni::JNIEnv&); + jni::Local> getHillshadeHighlightColor(jni::JNIEnv&); void setHillshadeHighlightColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHillshadeHighlightColorTransition(jni::JNIEnv&); + jni::Local> getHillshadeHighlightColorTransition(jni::JNIEnv&); - jni::Object getHillshadeAccentColor(jni::JNIEnv&); + jni::Local> getHillshadeAccentColor(jni::JNIEnv&); void setHillshadeAccentColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getHillshadeAccentColorTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getHillshadeAccentColorTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class HillshadeLayer diff --git a/platform/android/src/style/layers/layer.cpp b/platform/android/src/style/layers/layer.cpp index fe4fb9aeb6..5726873f40 100644 --- a/platform/android/src/style/layers/layer.cpp +++ b/platform/android/src/style/layers/layer.cpp @@ -83,7 +83,7 @@ namespace android { return std::move(ownedLayer); } - jni::String Layer::getId(jni::JNIEnv& env) { + jni::Local Layer::getId(jni::JNIEnv& env) { return jni::Make(env, layer.getID()); } @@ -91,18 +91,18 @@ namespace android { return layer; } - void Layer::setLayoutProperty(jni::JNIEnv& env, jni::String jname, jni::Object<> jvalue) { + void Layer::setLayoutProperty(jni::JNIEnv& env, const jni::String& jname, const jni::Object<>& jvalue) { // Convert and set property - optional error = layer.setLayoutProperty(jni::Make(env, jname), Value(env, jni::SeizeLocal(env, std::move(jvalue)))); + optional error = layer.setLayoutProperty(jni::Make(env, jname), Value(env, jvalue)); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); return; } } - void Layer::setPaintProperty(jni::JNIEnv& env, jni::String jname, jni::Object<> jvalue) { + void Layer::setPaintProperty(jni::JNIEnv& env, const jni::String& jname, const jni::Object<>& jvalue) { // Convert and set property - optional error = layer.setPaintProperty(jni::Make(env, jname), Value(env, jni::SeizeLocal(env, std::move(jvalue)))); + optional error = layer.setPaintProperty(jni::Make(env, jname), Value(env, jvalue)); if (error) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting property: " + jni::Make(env, jname) + " " + error->message); return; @@ -123,12 +123,12 @@ namespace android { } }; - void Layer::setFilter(jni::JNIEnv& env, jni::Array> jfilter) { + void Layer::setFilter(jni::JNIEnv& env, const jni::Array>& jfilter) { using namespace mbgl::style; using namespace mbgl::style::conversion; Error error; - optional converted = convert(Value(env, jni::SeizeLocal(env, std::move(jfilter))), error); + optional converted = convert(Value(env, jfilter), error); if (!converted) { mbgl::Log::Error(mbgl::Event::JNI, "Error setting filter: " + error.message); return; @@ -154,7 +154,7 @@ namespace android { } }; - jni::Object Layer::getFilter(jni::JNIEnv& env) { + jni::Local> Layer::getFilter(jni::JNIEnv& env) { using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -163,7 +163,7 @@ namespace android { mbgl::Value expressionValue = (*filter.expression)->serialize(); return gson::JsonElement::New(env, expressionValue); } else { - return jni::Object(); + return jni::Local>(env, nullptr); } } @@ -181,7 +181,7 @@ namespace android { } }; - void Layer::setSourceLayer(jni::JNIEnv& env, jni::String sourceLayer) { + void Layer::setSourceLayer(jni::JNIEnv& env, const jni::String& sourceLayer) { layer.accept(SetSourceLayerEvaluator {jni::Make(env, sourceLayer)}); } @@ -202,7 +202,7 @@ namespace android { } }; - jni::String Layer::getSourceLayer(jni::JNIEnv& env) { + jni::Local Layer::getSourceLayer(jni::JNIEnv& env) { return jni::Make(env, layer.accept(GetSourceLayerEvaluator())); } @@ -221,7 +221,7 @@ namespace android { } }; - jni::String Layer::getSourceId(jni::JNIEnv& env) { + jni::Local Layer::getSourceId(jni::JNIEnv& env) { return jni::Make(env, layer.accept(GetSourceIdEvaluator())); } @@ -241,14 +241,14 @@ namespace android { layer.setMaxZoom(zoom); } - jni::Object Layer::getVisibility(jni::JNIEnv& env) { + jni::Local> Layer::getVisibility(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - return jni::Object(*convert(env, layer.getVisibility())); + return std::move(*convert>>(env, layer.getVisibility())); } void Layer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/style/layers/layer.cpp.ejs b/platform/android/src/style/layers/layer.cpp.ejs index 7dbb031b25..875bc88bc0 100644 --- a/platform/android/src/style/layers/layer.cpp.ejs +++ b/platform/android/src/style/layers/layer.cpp.ejs @@ -18,13 +18,13 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(jni::JNIEnv& env, jni::String layerId) + <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(jni::JNIEnv& env, jni::String& layerId) : Layer(env, std::make_uniqueLayer>(jni::Make(env, layerId))) { <% } else { -%> /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + <%- camelize(type) %>Layer::<%- camelize(type) %>Layer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_uniqueLayer>(jni::Make(env, layerId), jni::Make(env, sourceId))) { <% } -%> } @@ -49,29 +49,27 @@ namespace android { <% for (const property of properties) { -%> <% if (property.name != 'heatmap-color') { -%> - jni::Object <%- camelize(type) %>Layer::get<%- camelize(property.name) %>(jni::JNIEnv& env) { + jni::Local> <%- camelize(type) %>Layer::get<%- camelize(property.name) %>(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.asLayer>()-><%- camelize(type) %>Layer::get<%- camelize(property.name) %>()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.asLayer>()-><%- camelize(type) %>Layer::get<%- camelize(property.name) %>())); } <% } else { -%> - jni::Object HeatmapLayer::getHeatmapColor(jni::JNIEnv& env) { + jni::Local> HeatmapLayer::getHeatmapColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; auto propertyValue = layer.as()->HeatmapLayer::getHeatmapColor(); if (propertyValue.isUndefined()) { propertyValue = layer.as()->HeatmapLayer::getDefaultHeatmapColor(); } - Result converted = convert(env, propertyValue); - return jni::Object(*converted); + return std::move(*convert>>(env, propertyValue)); } <% } -%> <% if (property.transition) { -%> - jni::Object <%- camelize(type) %>Layer::get<%- camelize(property.name) %>Transition(jni::JNIEnv& env) { + jni::Local> <%- camelize(type) %>Layer::get<%- camelize(property.name) %>Transition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.asLayer>()-><%- camelize(type) %>Layer::get<%- camelize(property.name) %>Transition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void <%- camelize(type) %>Layer::set<%- camelize(property.name) %>Transition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -84,15 +82,15 @@ namespace android { <% } -%> <% } -%> - jni::jobject* <%- camelize(type) %>Layer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class<<%- camelize(type) %>Layer>::Singleton(env); + jni::Local> <%- camelize(type) %>Layer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class<<%- camelize(type) %>Layer>::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void <%- camelize(type) %>Layer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class<<%- camelize(type) %>Layer>::Singleton(env); + static auto& javaClass = jni::Class<<%- camelize(type) %>Layer>::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) @@ -100,9 +98,9 @@ namespace android { jni::RegisterNativePeer<<%- camelize(type) %>Layer>( env, javaClass, "nativePtr", <% if (type === 'background') { -%> - std::make_unique<<%- camelize(type) %>Layer, JNIEnv&, jni::String>, + jni::MakePeer<<%- camelize(type) %>Layer, jni::String&>, <% } else { -%> - std::make_unique<<%- camelize(type) %>Layer, JNIEnv&, jni::String, jni::String>, + jni::MakePeer<<%- camelize(type) %>Layer, jni::String&, jni::String&>, <% } -%> "initialize", "finalize",<% for(var i = 0; i < properties.length; i++) {%> diff --git a/platform/android/src/style/layers/layer.hpp b/platform/android/src/style/layers/layer.hpp index 8112dd18d6..cee1b5a64e 100644 --- a/platform/android/src/style/layers/layer.hpp +++ b/platform/android/src/style/layers/layer.hpp @@ -36,7 +36,7 @@ public: virtual ~Layer(); - virtual jni::jobject* createJavaPeer(jni::JNIEnv&) = 0; + virtual jni::Local> createJavaPeer(jni::JNIEnv&) = 0; /** * Set core layer (ie return ownership after remove) @@ -45,15 +45,15 @@ public: void addToMap(mbgl::Map&, mbgl::optional); - jni::String getId(jni::JNIEnv&); + jni::Local getId(jni::JNIEnv&); - jni::String getSourceId(jni::JNIEnv&); + jni::Local getSourceId(jni::JNIEnv&); style::Layer& get(); - void setLayoutProperty(jni::JNIEnv&, jni::String, jni::Object<> value); + void setLayoutProperty(jni::JNIEnv&, const jni::String&, const jni::Object<>& value); - void setPaintProperty(jni::JNIEnv&, jni::String, jni::Object<> value); + void setPaintProperty(jni::JNIEnv&, const jni::String&, const jni::Object<>& value); // Zoom @@ -67,17 +67,17 @@ public: /* common properties, but not shared by all */ - void setFilter(jni::JNIEnv&, jni::Array>); + void setFilter(jni::JNIEnv&, const jni::Array>&); - jni::Object getFilter(jni::JNIEnv&); + jni::Local> getFilter(jni::JNIEnv&); - void setSourceLayer(jni::JNIEnv&, jni::String); + void setSourceLayer(jni::JNIEnv&, const jni::String&); - jni::String getSourceLayer(jni::JNIEnv&); + jni::Local getSourceLayer(jni::JNIEnv&); // Property getters - jni::Object getVisibility(jni::JNIEnv&); + jni::Local> getVisibility(jni::JNIEnv&); protected: // Release the owned view and return it diff --git a/platform/android/src/style/layers/layer.hpp.ejs b/platform/android/src/style/layers/layer.hpp.ejs index dd599d71df..5ceab0dcfa 100644 --- a/platform/android/src/style/layers/layer.hpp.ejs +++ b/platform/android/src/style/layers/layer.hpp.ejs @@ -16,15 +16,15 @@ namespace android { class <%- camelize(type) %>Layer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/<%- camelize(type) %>Layer"; }; static void registerNative(jni::JNIEnv&); <% if (type === 'background') { -%> - <%- camelize(type) %>Layer(jni::JNIEnv&, jni::String); + <%- camelize(type) %>Layer(jni::JNIEnv&, jni::String&); <% } else { -%> - <%- camelize(type) %>Layer(jni::JNIEnv&, jni::String, jni::String); + <%- camelize(type) %>Layer(jni::JNIEnv&, jni::String&, jni::String&); <% } -%> <%- camelize(type) %>Layer(mbgl::Map&, mbgl::style::<%- camelize(type) %>Layer&); @@ -36,13 +36,13 @@ public: // Properties <% for (const property of properties) { -%> - jni::Object get<%- camelize(property.name) %>(jni::JNIEnv&); + jni::Local> get<%- camelize(property.name) %>(jni::JNIEnv&); <% if (property.transition) { -%> void set<%- camelize(property.name) %>Transition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object get<%- camelize(property.name) %>Transition(jni::JNIEnv&); + jni::Local> get<%- camelize(property.name) %>Transition(jni::JNIEnv&); <% } -%> <% } -%> - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class <%- camelize(type) %>Layer diff --git a/platform/android/src/style/layers/layers.cpp b/platform/android/src/style/layers/layers.cpp index 5df689b45d..232e92a7c7 100644 --- a/platform/android/src/style/layers/layers.cpp +++ b/platform/android/src/style/layers/layers.cpp @@ -77,16 +77,16 @@ static Layer* initializeLayerPeer(Map& map, std::unique_ptr return layer ? layer : new UnknownLayer(map, std::move(coreLayer)); } -jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) { +jni::Local> createJavaLayerPeer(jni::JNIEnv& env, Map& map, style::Layer& coreLayer) { std::unique_ptr peerLayer = std::unique_ptr(initializeLayerPeer(map, coreLayer)); - jni::jobject* result = peerLayer->createJavaPeer(env); + jni::Local> result = peerLayer->createJavaPeer(env); peerLayer.release(); return result; } -jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr coreLayer) { +jni::Local> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr coreLayer) { std::unique_ptr peerLayer = std::unique_ptr(initializeLayerPeer(map, std::move(coreLayer))); - jni::jobject* result = peerLayer->createJavaPeer(env); + jni::Local> result = peerLayer->createJavaPeer(env); peerLayer.release(); return result; } diff --git a/platform/android/src/style/layers/layers.hpp b/platform/android/src/style/layers/layers.hpp index 75863a324a..c9a6ba2e66 100644 --- a/platform/android/src/style/layers/layers.hpp +++ b/platform/android/src/style/layers/layers.hpp @@ -13,12 +13,12 @@ namespace android { /** * Create a non-owning peer */ -jni::jobject* createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&); +jni::Local> createJavaLayerPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Layer&); /** * Create an owning peer */ -jni::jobject* createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr); +jni::Local> createJavaLayerPeer(jni::JNIEnv& env, mbgl::Map& map, std::unique_ptr); void registerNativeLayers(jni::JNIEnv&); diff --git a/platform/android/src/style/layers/line_layer.cpp b/platform/android/src/style/layers/line_layer.cpp index 2656bd9c09..376e4aafc0 100644 --- a/platform/android/src/style/layers/line_layer.cpp +++ b/platform/android/src/style/layers/line_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - LineLayer::LineLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + LineLayer::LineLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,40 +35,35 @@ namespace android { // Property getters - jni::Object LineLayer::getLineCap(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineCap(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineCap()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineCap())); } - jni::Object LineLayer::getLineJoin(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineJoin(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineJoin()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineJoin())); } - jni::Object LineLayer::getLineMiterLimit(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineMiterLimit(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineMiterLimit()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineMiterLimit())); } - jni::Object LineLayer::getLineRoundLimit(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineRoundLimit(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineRoundLimit()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineRoundLimit())); } - jni::Object LineLayer::getLineOpacity(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineOpacity())); } - jni::Object LineLayer::getLineOpacityTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -78,16 +73,15 @@ namespace android { layer.as()->LineLayer::setLineOpacityTransition(options); } - jni::Object LineLayer::getLineColor(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineColor())); } - jni::Object LineLayer::getLineColorTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -97,16 +91,15 @@ namespace android { layer.as()->LineLayer::setLineColorTransition(options); } - jni::Object LineLayer::getLineTranslate(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineTranslate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineTranslate())); } - jni::Object LineLayer::getLineTranslateTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineTranslateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -116,22 +109,20 @@ namespace android { layer.as()->LineLayer::setLineTranslateTransition(options); } - jni::Object LineLayer::getLineTranslateAnchor(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineTranslateAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineTranslateAnchor())); } - jni::Object LineLayer::getLineWidth(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineWidth()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineWidth())); } - jni::Object LineLayer::getLineWidthTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineWidthTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -141,16 +132,15 @@ namespace android { layer.as()->LineLayer::setLineWidthTransition(options); } - jni::Object LineLayer::getLineGapWidth(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineGapWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineGapWidth()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineGapWidth())); } - jni::Object LineLayer::getLineGapWidthTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineGapWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineGapWidthTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineGapWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -160,16 +150,15 @@ namespace android { layer.as()->LineLayer::setLineGapWidthTransition(options); } - jni::Object LineLayer::getLineOffset(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineOffset()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineOffset())); } - jni::Object LineLayer::getLineOffsetTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineOffsetTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineOffsetTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineOffsetTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -179,16 +168,15 @@ namespace android { layer.as()->LineLayer::setLineOffsetTransition(options); } - jni::Object LineLayer::getLineBlur(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineBlur()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineBlur())); } - jni::Object LineLayer::getLineBlurTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineBlurTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -198,16 +186,15 @@ namespace android { layer.as()->LineLayer::setLineBlurTransition(options); } - jni::Object LineLayer::getLineDasharray(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineDasharray(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineDasharray()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineDasharray())); } - jni::Object LineLayer::getLineDasharrayTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineDasharrayTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLineDasharrayTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLineDasharrayTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -217,16 +204,15 @@ namespace android { layer.as()->LineLayer::setLineDasharrayTransition(options); } - jni::Object LineLayer::getLinePattern(jni::JNIEnv& env) { + jni::Local> LineLayer::getLinePattern(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLinePattern()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLinePattern())); } - jni::Object LineLayer::getLinePatternTransition(jni::JNIEnv& env) { + jni::Local> LineLayer::getLinePatternTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->LineLayer::getLinePatternTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void LineLayer::setLinePatternTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -236,29 +222,28 @@ namespace android { layer.as()->LineLayer::setLinePatternTransition(options); } - jni::Object LineLayer::getLineGradient(jni::JNIEnv& env) { + jni::Local> LineLayer::getLineGradient(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->LineLayer::getLineGradient()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->LineLayer::getLineGradient())); } - jni::jobject* LineLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> LineLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void LineLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&LineLayer::getLineCap, "nativeGetLineCap"), diff --git a/platform/android/src/style/layers/line_layer.hpp b/platform/android/src/style/layers/line_layer.hpp index 4d1e759c1b..01be481958 100644 --- a/platform/android/src/style/layers/line_layer.hpp +++ b/platform/android/src/style/layers/line_layer.hpp @@ -12,12 +12,12 @@ namespace android { class LineLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/LineLayer"; }; static void registerNative(jni::JNIEnv&); - LineLayer(jni::JNIEnv&, jni::String, jni::String); + LineLayer(jni::JNIEnv&, jni::String&, jni::String&); LineLayer(mbgl::Map&, mbgl::style::LineLayer&); @@ -27,54 +27,54 @@ public: // Properties - jni::Object getLineCap(jni::JNIEnv&); + jni::Local> getLineCap(jni::JNIEnv&); - jni::Object getLineJoin(jni::JNIEnv&); + jni::Local> getLineJoin(jni::JNIEnv&); - jni::Object getLineMiterLimit(jni::JNIEnv&); + jni::Local> getLineMiterLimit(jni::JNIEnv&); - jni::Object getLineRoundLimit(jni::JNIEnv&); + jni::Local> getLineRoundLimit(jni::JNIEnv&); - jni::Object getLineOpacity(jni::JNIEnv&); + jni::Local> getLineOpacity(jni::JNIEnv&); void setLineOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineOpacityTransition(jni::JNIEnv&); + jni::Local> getLineOpacityTransition(jni::JNIEnv&); - jni::Object getLineColor(jni::JNIEnv&); + jni::Local> getLineColor(jni::JNIEnv&); void setLineColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineColorTransition(jni::JNIEnv&); + jni::Local> getLineColorTransition(jni::JNIEnv&); - jni::Object getLineTranslate(jni::JNIEnv&); + jni::Local> getLineTranslate(jni::JNIEnv&); void setLineTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineTranslateTransition(jni::JNIEnv&); + jni::Local> getLineTranslateTransition(jni::JNIEnv&); - jni::Object getLineTranslateAnchor(jni::JNIEnv&); + jni::Local> getLineTranslateAnchor(jni::JNIEnv&); - jni::Object getLineWidth(jni::JNIEnv&); + jni::Local> getLineWidth(jni::JNIEnv&); void setLineWidthTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineWidthTransition(jni::JNIEnv&); + jni::Local> getLineWidthTransition(jni::JNIEnv&); - jni::Object getLineGapWidth(jni::JNIEnv&); + jni::Local> getLineGapWidth(jni::JNIEnv&); void setLineGapWidthTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineGapWidthTransition(jni::JNIEnv&); + jni::Local> getLineGapWidthTransition(jni::JNIEnv&); - jni::Object getLineOffset(jni::JNIEnv&); + jni::Local> getLineOffset(jni::JNIEnv&); void setLineOffsetTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineOffsetTransition(jni::JNIEnv&); + jni::Local> getLineOffsetTransition(jni::JNIEnv&); - jni::Object getLineBlur(jni::JNIEnv&); + jni::Local> getLineBlur(jni::JNIEnv&); void setLineBlurTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineBlurTransition(jni::JNIEnv&); + jni::Local> getLineBlurTransition(jni::JNIEnv&); - jni::Object getLineDasharray(jni::JNIEnv&); + jni::Local> getLineDasharray(jni::JNIEnv&); void setLineDasharrayTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLineDasharrayTransition(jni::JNIEnv&); + jni::Local> getLineDasharrayTransition(jni::JNIEnv&); - jni::Object getLinePattern(jni::JNIEnv&); + jni::Local> getLinePattern(jni::JNIEnv&); void setLinePatternTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getLinePatternTransition(jni::JNIEnv&); + jni::Local> getLinePatternTransition(jni::JNIEnv&); - jni::Object getLineGradient(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getLineGradient(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class LineLayer diff --git a/platform/android/src/style/layers/raster_layer.cpp b/platform/android/src/style/layers/raster_layer.cpp index c52891b662..5a3579bc37 100644 --- a/platform/android/src/style/layers/raster_layer.cpp +++ b/platform/android/src/style/layers/raster_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - RasterLayer::RasterLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + RasterLayer::RasterLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,16 +35,15 @@ namespace android { // Property getters - jni::Object RasterLayer::getRasterOpacity(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterOpacity())); } - jni::Object RasterLayer::getRasterOpacityTransition(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->RasterLayer::getRasterOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void RasterLayer::setRasterOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -54,16 +53,15 @@ namespace android { layer.as()->RasterLayer::setRasterOpacityTransition(options); } - jni::Object RasterLayer::getRasterHueRotate(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterHueRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterHueRotate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterHueRotate())); } - jni::Object RasterLayer::getRasterHueRotateTransition(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterHueRotateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->RasterLayer::getRasterHueRotateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void RasterLayer::setRasterHueRotateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -73,16 +71,15 @@ namespace android { layer.as()->RasterLayer::setRasterHueRotateTransition(options); } - jni::Object RasterLayer::getRasterBrightnessMin(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterBrightnessMin(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterBrightnessMin()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterBrightnessMin())); } - jni::Object RasterLayer::getRasterBrightnessMinTransition(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterBrightnessMinTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->RasterLayer::getRasterBrightnessMinTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void RasterLayer::setRasterBrightnessMinTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -92,16 +89,15 @@ namespace android { layer.as()->RasterLayer::setRasterBrightnessMinTransition(options); } - jni::Object RasterLayer::getRasterBrightnessMax(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterBrightnessMax(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterBrightnessMax()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterBrightnessMax())); } - jni::Object RasterLayer::getRasterBrightnessMaxTransition(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterBrightnessMaxTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->RasterLayer::getRasterBrightnessMaxTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void RasterLayer::setRasterBrightnessMaxTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -111,16 +107,15 @@ namespace android { layer.as()->RasterLayer::setRasterBrightnessMaxTransition(options); } - jni::Object RasterLayer::getRasterSaturation(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterSaturation(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterSaturation()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterSaturation())); } - jni::Object RasterLayer::getRasterSaturationTransition(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterSaturationTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->RasterLayer::getRasterSaturationTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void RasterLayer::setRasterSaturationTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -130,16 +125,15 @@ namespace android { layer.as()->RasterLayer::setRasterSaturationTransition(options); } - jni::Object RasterLayer::getRasterContrast(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterContrast(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterContrast()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterContrast())); } - jni::Object RasterLayer::getRasterContrastTransition(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterContrastTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->RasterLayer::getRasterContrastTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void RasterLayer::setRasterContrastTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -149,35 +143,33 @@ namespace android { layer.as()->RasterLayer::setRasterContrastTransition(options); } - jni::Object RasterLayer::getRasterResampling(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterResampling(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterResampling()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterResampling())); } - jni::Object RasterLayer::getRasterFadeDuration(jni::JNIEnv& env) { + jni::Local> RasterLayer::getRasterFadeDuration(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->RasterLayer::getRasterFadeDuration()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->RasterLayer::getRasterFadeDuration())); } - jni::jobject* RasterLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> RasterLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void RasterLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&RasterLayer::getRasterOpacityTransition, "nativeGetRasterOpacityTransition"), diff --git a/platform/android/src/style/layers/raster_layer.hpp b/platform/android/src/style/layers/raster_layer.hpp index 4e268c36e5..40cc47634e 100644 --- a/platform/android/src/style/layers/raster_layer.hpp +++ b/platform/android/src/style/layers/raster_layer.hpp @@ -12,12 +12,12 @@ namespace android { class RasterLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/RasterLayer"; }; static void registerNative(jni::JNIEnv&); - RasterLayer(jni::JNIEnv&, jni::String, jni::String); + RasterLayer(jni::JNIEnv&, jni::String&, jni::String&); RasterLayer(mbgl::Map&, mbgl::style::RasterLayer&); @@ -27,34 +27,34 @@ public: // Properties - jni::Object getRasterOpacity(jni::JNIEnv&); + jni::Local> getRasterOpacity(jni::JNIEnv&); void setRasterOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getRasterOpacityTransition(jni::JNIEnv&); + jni::Local> getRasterOpacityTransition(jni::JNIEnv&); - jni::Object getRasterHueRotate(jni::JNIEnv&); + jni::Local> getRasterHueRotate(jni::JNIEnv&); void setRasterHueRotateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getRasterHueRotateTransition(jni::JNIEnv&); + jni::Local> getRasterHueRotateTransition(jni::JNIEnv&); - jni::Object getRasterBrightnessMin(jni::JNIEnv&); + jni::Local> getRasterBrightnessMin(jni::JNIEnv&); void setRasterBrightnessMinTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getRasterBrightnessMinTransition(jni::JNIEnv&); + jni::Local> getRasterBrightnessMinTransition(jni::JNIEnv&); - jni::Object getRasterBrightnessMax(jni::JNIEnv&); + jni::Local> getRasterBrightnessMax(jni::JNIEnv&); void setRasterBrightnessMaxTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getRasterBrightnessMaxTransition(jni::JNIEnv&); + jni::Local> getRasterBrightnessMaxTransition(jni::JNIEnv&); - jni::Object getRasterSaturation(jni::JNIEnv&); + jni::Local> getRasterSaturation(jni::JNIEnv&); void setRasterSaturationTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getRasterSaturationTransition(jni::JNIEnv&); + jni::Local> getRasterSaturationTransition(jni::JNIEnv&); - jni::Object getRasterContrast(jni::JNIEnv&); + jni::Local> getRasterContrast(jni::JNIEnv&); void setRasterContrastTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getRasterContrastTransition(jni::JNIEnv&); + jni::Local> getRasterContrastTransition(jni::JNIEnv&); - jni::Object getRasterResampling(jni::JNIEnv&); + jni::Local> getRasterResampling(jni::JNIEnv&); - jni::Object getRasterFadeDuration(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getRasterFadeDuration(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class RasterLayer diff --git a/platform/android/src/style/layers/symbol_layer.cpp b/platform/android/src/style/layers/symbol_layer.cpp index 953c73e221..a0f37c91d2 100644 --- a/platform/android/src/style/layers/symbol_layer.cpp +++ b/platform/android/src/style/layers/symbol_layer.cpp @@ -13,7 +13,7 @@ namespace android { /** * Creates an owning peer object (for layers not attached to the map) from the JVM side */ - SymbolLayer::SymbolLayer(jni::JNIEnv& env, jni::String layerId, jni::String sourceId) + SymbolLayer::SymbolLayer(jni::JNIEnv& env, jni::String& layerId, jni::String& sourceId) : Layer(env, std::make_unique(jni::Make(env, layerId), jni::Make(env, sourceId))) { } @@ -35,232 +35,195 @@ namespace android { // Property getters - jni::Object SymbolLayer::getSymbolPlacement(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getSymbolPlacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getSymbolPlacement()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getSymbolPlacement())); } - jni::Object SymbolLayer::getSymbolSpacing(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getSymbolSpacing(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getSymbolSpacing()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getSymbolSpacing())); } - jni::Object SymbolLayer::getSymbolAvoidEdges(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getSymbolAvoidEdges(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getSymbolAvoidEdges()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getSymbolAvoidEdges())); } - jni::Object SymbolLayer::getIconAllowOverlap(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconAllowOverlap(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconAllowOverlap()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconAllowOverlap())); } - jni::Object SymbolLayer::getIconIgnorePlacement(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconIgnorePlacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconIgnorePlacement()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconIgnorePlacement())); } - jni::Object SymbolLayer::getIconOptional(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconOptional(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconOptional()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconOptional())); } - jni::Object SymbolLayer::getIconRotationAlignment(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconRotationAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconRotationAlignment()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconRotationAlignment())); } - jni::Object SymbolLayer::getIconSize(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconSize()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconSize())); } - jni::Object SymbolLayer::getIconTextFit(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconTextFit(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconTextFit()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconTextFit())); } - jni::Object SymbolLayer::getIconTextFitPadding(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconTextFitPadding(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconTextFitPadding()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconTextFitPadding())); } - jni::Object SymbolLayer::getIconImage(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconImage(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconImage()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconImage())); } - jni::Object SymbolLayer::getIconRotate(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconRotate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconRotate())); } - jni::Object SymbolLayer::getIconPadding(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconPadding(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconPadding()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconPadding())); } - jni::Object SymbolLayer::getIconKeepUpright(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconKeepUpright(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconKeepUpright()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconKeepUpright())); } - jni::Object SymbolLayer::getIconOffset(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconOffset()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconOffset())); } - jni::Object SymbolLayer::getIconAnchor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconAnchor())); } - jni::Object SymbolLayer::getIconPitchAlignment(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconPitchAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconPitchAlignment()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconPitchAlignment())); } - jni::Object SymbolLayer::getTextPitchAlignment(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextPitchAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextPitchAlignment()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextPitchAlignment())); } - jni::Object SymbolLayer::getTextRotationAlignment(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextRotationAlignment(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextRotationAlignment()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextRotationAlignment())); } - jni::Object SymbolLayer::getTextField(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextField(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextField()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextField())); } - jni::Object SymbolLayer::getTextFont(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextFont(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextFont()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextFont())); } - jni::Object SymbolLayer::getTextSize(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextSize(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextSize()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextSize())); } - jni::Object SymbolLayer::getTextMaxWidth(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextMaxWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextMaxWidth()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextMaxWidth())); } - jni::Object SymbolLayer::getTextLineHeight(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextLineHeight(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextLineHeight()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextLineHeight())); } - jni::Object SymbolLayer::getTextLetterSpacing(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextLetterSpacing(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextLetterSpacing()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextLetterSpacing())); } - jni::Object SymbolLayer::getTextJustify(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextJustify(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextJustify()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextJustify())); } - jni::Object SymbolLayer::getTextAnchor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextAnchor())); } - jni::Object SymbolLayer::getTextMaxAngle(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextMaxAngle(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextMaxAngle()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextMaxAngle())); } - jni::Object SymbolLayer::getTextRotate(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextRotate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextRotate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextRotate())); } - jni::Object SymbolLayer::getTextPadding(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextPadding(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextPadding()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextPadding())); } - jni::Object SymbolLayer::getTextKeepUpright(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextKeepUpright(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextKeepUpright()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextKeepUpright())); } - jni::Object SymbolLayer::getTextTransform(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextTransform(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextTransform()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextTransform())); } - jni::Object SymbolLayer::getTextOffset(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextOffset(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextOffset()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextOffset())); } - jni::Object SymbolLayer::getTextAllowOverlap(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextAllowOverlap(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextAllowOverlap()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextAllowOverlap())); } - jni::Object SymbolLayer::getTextIgnorePlacement(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextIgnorePlacement(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextIgnorePlacement()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextIgnorePlacement())); } - jni::Object SymbolLayer::getTextOptional(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextOptional(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextOptional()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextOptional())); } - jni::Object SymbolLayer::getIconOpacity(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconOpacity())); } - jni::Object SymbolLayer::getIconOpacityTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getIconOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setIconOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -270,16 +233,15 @@ namespace android { layer.as()->SymbolLayer::setIconOpacityTransition(options); } - jni::Object SymbolLayer::getIconColor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconColor())); } - jni::Object SymbolLayer::getIconColorTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getIconColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setIconColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -289,16 +251,15 @@ namespace android { layer.as()->SymbolLayer::setIconColorTransition(options); } - jni::Object SymbolLayer::getIconHaloColor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconHaloColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconHaloColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconHaloColor())); } - jni::Object SymbolLayer::getIconHaloColorTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconHaloColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getIconHaloColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setIconHaloColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -308,16 +269,15 @@ namespace android { layer.as()->SymbolLayer::setIconHaloColorTransition(options); } - jni::Object SymbolLayer::getIconHaloWidth(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconHaloWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconHaloWidth()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconHaloWidth())); } - jni::Object SymbolLayer::getIconHaloWidthTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconHaloWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getIconHaloWidthTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setIconHaloWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -327,16 +287,15 @@ namespace android { layer.as()->SymbolLayer::setIconHaloWidthTransition(options); } - jni::Object SymbolLayer::getIconHaloBlur(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconHaloBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconHaloBlur()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconHaloBlur())); } - jni::Object SymbolLayer::getIconHaloBlurTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconHaloBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getIconHaloBlurTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setIconHaloBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -346,16 +305,15 @@ namespace android { layer.as()->SymbolLayer::setIconHaloBlurTransition(options); } - jni::Object SymbolLayer::getIconTranslate(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconTranslate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconTranslate())); } - jni::Object SymbolLayer::getIconTranslateTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getIconTranslateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setIconTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -365,22 +323,20 @@ namespace android { layer.as()->SymbolLayer::setIconTranslateTransition(options); } - jni::Object SymbolLayer::getIconTranslateAnchor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getIconTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getIconTranslateAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getIconTranslateAnchor())); } - jni::Object SymbolLayer::getTextOpacity(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextOpacity(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextOpacity()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextOpacity())); } - jni::Object SymbolLayer::getTextOpacityTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextOpacityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getTextOpacityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setTextOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -390,16 +346,15 @@ namespace android { layer.as()->SymbolLayer::setTextOpacityTransition(options); } - jni::Object SymbolLayer::getTextColor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextColor())); } - jni::Object SymbolLayer::getTextColorTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getTextColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setTextColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -409,16 +364,15 @@ namespace android { layer.as()->SymbolLayer::setTextColorTransition(options); } - jni::Object SymbolLayer::getTextHaloColor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextHaloColor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextHaloColor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextHaloColor())); } - jni::Object SymbolLayer::getTextHaloColorTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextHaloColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getTextHaloColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setTextHaloColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -428,16 +382,15 @@ namespace android { layer.as()->SymbolLayer::setTextHaloColorTransition(options); } - jni::Object SymbolLayer::getTextHaloWidth(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextHaloWidth(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextHaloWidth()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextHaloWidth())); } - jni::Object SymbolLayer::getTextHaloWidthTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextHaloWidthTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getTextHaloWidthTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setTextHaloWidthTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -447,16 +400,15 @@ namespace android { layer.as()->SymbolLayer::setTextHaloWidthTransition(options); } - jni::Object SymbolLayer::getTextHaloBlur(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextHaloBlur(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextHaloBlur()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextHaloBlur())); } - jni::Object SymbolLayer::getTextHaloBlurTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextHaloBlurTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getTextHaloBlurTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setTextHaloBlurTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -466,16 +418,15 @@ namespace android { layer.as()->SymbolLayer::setTextHaloBlurTransition(options); } - jni::Object SymbolLayer::getTextTranslate(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextTranslate(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextTranslate()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextTranslate())); } - jni::Object SymbolLayer::getTextTranslateTransition(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextTranslateTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = layer.as()->SymbolLayer::getTextTranslateTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void SymbolLayer::setTextTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -485,29 +436,28 @@ namespace android { layer.as()->SymbolLayer::setTextTranslateTransition(options); } - jni::Object SymbolLayer::getTextTranslateAnchor(jni::JNIEnv& env) { + jni::Local> SymbolLayer::getTextTranslateAnchor(jni::JNIEnv& env) { using namespace mbgl::android::conversion; - Result converted = convert(env, layer.as()->SymbolLayer::getTextTranslateAnchor()); - return jni::Object(*converted); + return std::move(*convert>>(env, layer.as()->SymbolLayer::getTextTranslateAnchor())); } - jni::jobject* SymbolLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> SymbolLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void SymbolLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, + jni::MakePeer, "initialize", "finalize", METHOD(&SymbolLayer::getSymbolPlacement, "nativeGetSymbolPlacement"), diff --git a/platform/android/src/style/layers/symbol_layer.hpp b/platform/android/src/style/layers/symbol_layer.hpp index 3835e01bf1..206a6546c3 100644 --- a/platform/android/src/style/layers/symbol_layer.hpp +++ b/platform/android/src/style/layers/symbol_layer.hpp @@ -12,12 +12,12 @@ namespace android { class SymbolLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/SymbolLayer"; }; static void registerNative(jni::JNIEnv&); - SymbolLayer(jni::JNIEnv&, jni::String, jni::String); + SymbolLayer(jni::JNIEnv&, jni::String&, jni::String&); SymbolLayer(mbgl::Map&, mbgl::style::SymbolLayer&); @@ -27,130 +27,130 @@ public: // Properties - jni::Object getSymbolPlacement(jni::JNIEnv&); + jni::Local> getSymbolPlacement(jni::JNIEnv&); - jni::Object getSymbolSpacing(jni::JNIEnv&); + jni::Local> getSymbolSpacing(jni::JNIEnv&); - jni::Object getSymbolAvoidEdges(jni::JNIEnv&); + jni::Local> getSymbolAvoidEdges(jni::JNIEnv&); - jni::Object getIconAllowOverlap(jni::JNIEnv&); + jni::Local> getIconAllowOverlap(jni::JNIEnv&); - jni::Object getIconIgnorePlacement(jni::JNIEnv&); + jni::Local> getIconIgnorePlacement(jni::JNIEnv&); - jni::Object getIconOptional(jni::JNIEnv&); + jni::Local> getIconOptional(jni::JNIEnv&); - jni::Object getIconRotationAlignment(jni::JNIEnv&); + jni::Local> getIconRotationAlignment(jni::JNIEnv&); - jni::Object getIconSize(jni::JNIEnv&); + jni::Local> getIconSize(jni::JNIEnv&); - jni::Object getIconTextFit(jni::JNIEnv&); + jni::Local> getIconTextFit(jni::JNIEnv&); - jni::Object getIconTextFitPadding(jni::JNIEnv&); + jni::Local> getIconTextFitPadding(jni::JNIEnv&); - jni::Object getIconImage(jni::JNIEnv&); + jni::Local> getIconImage(jni::JNIEnv&); - jni::Object getIconRotate(jni::JNIEnv&); + jni::Local> getIconRotate(jni::JNIEnv&); - jni::Object getIconPadding(jni::JNIEnv&); + jni::Local> getIconPadding(jni::JNIEnv&); - jni::Object getIconKeepUpright(jni::JNIEnv&); + jni::Local> getIconKeepUpright(jni::JNIEnv&); - jni::Object getIconOffset(jni::JNIEnv&); + jni::Local> getIconOffset(jni::JNIEnv&); - jni::Object getIconAnchor(jni::JNIEnv&); + jni::Local> getIconAnchor(jni::JNIEnv&); - jni::Object getIconPitchAlignment(jni::JNIEnv&); + jni::Local> getIconPitchAlignment(jni::JNIEnv&); - jni::Object getTextPitchAlignment(jni::JNIEnv&); + jni::Local> getTextPitchAlignment(jni::JNIEnv&); - jni::Object getTextRotationAlignment(jni::JNIEnv&); + jni::Local> getTextRotationAlignment(jni::JNIEnv&); - jni::Object getTextField(jni::JNIEnv&); + jni::Local> getTextField(jni::JNIEnv&); - jni::Object getTextFont(jni::JNIEnv&); + jni::Local> getTextFont(jni::JNIEnv&); - jni::Object getTextSize(jni::JNIEnv&); + jni::Local> getTextSize(jni::JNIEnv&); - jni::Object getTextMaxWidth(jni::JNIEnv&); + jni::Local> getTextMaxWidth(jni::JNIEnv&); - jni::Object getTextLineHeight(jni::JNIEnv&); + jni::Local> getTextLineHeight(jni::JNIEnv&); - jni::Object getTextLetterSpacing(jni::JNIEnv&); + jni::Local> getTextLetterSpacing(jni::JNIEnv&); - jni::Object getTextJustify(jni::JNIEnv&); + jni::Local> getTextJustify(jni::JNIEnv&); - jni::Object getTextAnchor(jni::JNIEnv&); + jni::Local> getTextAnchor(jni::JNIEnv&); - jni::Object getTextMaxAngle(jni::JNIEnv&); + jni::Local> getTextMaxAngle(jni::JNIEnv&); - jni::Object getTextRotate(jni::JNIEnv&); + jni::Local> getTextRotate(jni::JNIEnv&); - jni::Object getTextPadding(jni::JNIEnv&); + jni::Local> getTextPadding(jni::JNIEnv&); - jni::Object getTextKeepUpright(jni::JNIEnv&); + jni::Local> getTextKeepUpright(jni::JNIEnv&); - jni::Object getTextTransform(jni::JNIEnv&); + jni::Local> getTextTransform(jni::JNIEnv&); - jni::Object getTextOffset(jni::JNIEnv&); + jni::Local> getTextOffset(jni::JNIEnv&); - jni::Object getTextAllowOverlap(jni::JNIEnv&); + jni::Local> getTextAllowOverlap(jni::JNIEnv&); - jni::Object getTextIgnorePlacement(jni::JNIEnv&); + jni::Local> getTextIgnorePlacement(jni::JNIEnv&); - jni::Object getTextOptional(jni::JNIEnv&); + jni::Local> getTextOptional(jni::JNIEnv&); - jni::Object getIconOpacity(jni::JNIEnv&); + jni::Local> getIconOpacity(jni::JNIEnv&); void setIconOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIconOpacityTransition(jni::JNIEnv&); + jni::Local> getIconOpacityTransition(jni::JNIEnv&); - jni::Object getIconColor(jni::JNIEnv&); + jni::Local> getIconColor(jni::JNIEnv&); void setIconColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIconColorTransition(jni::JNIEnv&); + jni::Local> getIconColorTransition(jni::JNIEnv&); - jni::Object getIconHaloColor(jni::JNIEnv&); + jni::Local> getIconHaloColor(jni::JNIEnv&); void setIconHaloColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIconHaloColorTransition(jni::JNIEnv&); + jni::Local> getIconHaloColorTransition(jni::JNIEnv&); - jni::Object getIconHaloWidth(jni::JNIEnv&); + jni::Local> getIconHaloWidth(jni::JNIEnv&); void setIconHaloWidthTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIconHaloWidthTransition(jni::JNIEnv&); + jni::Local> getIconHaloWidthTransition(jni::JNIEnv&); - jni::Object getIconHaloBlur(jni::JNIEnv&); + jni::Local> getIconHaloBlur(jni::JNIEnv&); void setIconHaloBlurTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIconHaloBlurTransition(jni::JNIEnv&); + jni::Local> getIconHaloBlurTransition(jni::JNIEnv&); - jni::Object getIconTranslate(jni::JNIEnv&); + jni::Local> getIconTranslate(jni::JNIEnv&); void setIconTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIconTranslateTransition(jni::JNIEnv&); + jni::Local> getIconTranslateTransition(jni::JNIEnv&); - jni::Object getIconTranslateAnchor(jni::JNIEnv&); + jni::Local> getIconTranslateAnchor(jni::JNIEnv&); - jni::Object getTextOpacity(jni::JNIEnv&); + jni::Local> getTextOpacity(jni::JNIEnv&); void setTextOpacityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getTextOpacityTransition(jni::JNIEnv&); + jni::Local> getTextOpacityTransition(jni::JNIEnv&); - jni::Object getTextColor(jni::JNIEnv&); + jni::Local> getTextColor(jni::JNIEnv&); void setTextColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getTextColorTransition(jni::JNIEnv&); + jni::Local> getTextColorTransition(jni::JNIEnv&); - jni::Object getTextHaloColor(jni::JNIEnv&); + jni::Local> getTextHaloColor(jni::JNIEnv&); void setTextHaloColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getTextHaloColorTransition(jni::JNIEnv&); + jni::Local> getTextHaloColorTransition(jni::JNIEnv&); - jni::Object getTextHaloWidth(jni::JNIEnv&); + jni::Local> getTextHaloWidth(jni::JNIEnv&); void setTextHaloWidthTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getTextHaloWidthTransition(jni::JNIEnv&); + jni::Local> getTextHaloWidthTransition(jni::JNIEnv&); - jni::Object getTextHaloBlur(jni::JNIEnv&); + jni::Local> getTextHaloBlur(jni::JNIEnv&); void setTextHaloBlurTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getTextHaloBlurTransition(jni::JNIEnv&); + jni::Local> getTextHaloBlurTransition(jni::JNIEnv&); - jni::Object getTextTranslate(jni::JNIEnv&); + jni::Local> getTextTranslate(jni::JNIEnv&); void setTextTranslateTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getTextTranslateTransition(jni::JNIEnv&); + jni::Local> getTextTranslateTransition(jni::JNIEnv&); - jni::Object getTextTranslateAnchor(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getTextTranslateAnchor(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class SymbolLayer diff --git a/platform/android/src/style/layers/unknown_layer.cpp b/platform/android/src/style/layers/unknown_layer.cpp index 9f877e4896..5c770012bd 100644 --- a/platform/android/src/style/layers/unknown_layer.cpp +++ b/platform/android/src/style/layers/unknown_layer.cpp @@ -22,15 +22,15 @@ namespace android { : Layer(map, std::move(coreLayer)) { } - jni::jobject* UnknownLayer::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> UnknownLayer::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } void UnknownLayer::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/style/layers/unknown_layer.hpp b/platform/android/src/style/layers/unknown_layer.hpp index 0610c843f1..692e2f5db4 100644 --- a/platform/android/src/style/layers/unknown_layer.hpp +++ b/platform/android/src/style/layers/unknown_layer.hpp @@ -9,7 +9,7 @@ namespace android { class UnknownLayer : public Layer { public: - + using SuperTag = Layer; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/UnknownLayer"; }; static void registerNative(jni::JNIEnv&); @@ -20,7 +20,7 @@ public: ~UnknownLayer() = default; - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class UnknownLayer diff --git a/platform/android/src/style/light.cpp b/platform/android/src/style/light.cpp index 64afb89204..d8ed4d9d96 100644 --- a/platform/android/src/style/light.cpp +++ b/platform/android/src/style/light.cpp @@ -1,5 +1,3 @@ -// This file is generated. Edit android/platform/scripts/generate-style-code.js, then run `make android-style-code`. - #include #include "light.hpp" #include "conversion/transition_options.hpp" @@ -16,20 +14,20 @@ static Light* initializeLightPeer(mbgl::Map& map, mbgl::style::Light& coreLight) return new Light(map, coreLight); } -jni::jobject* Light::createJavaLightPeer(jni::JNIEnv& env, Map& map, mbgl::style::Light& coreLight) { +jni::Local> Light::createJavaLightPeer(jni::JNIEnv& env, Map& map, mbgl::style::Light& coreLight) { std::unique_ptr peerLight = std::unique_ptr(initializeLightPeer(map, coreLight)); - jni::jobject* result = peerLight->createJavaPeer(env); + auto result = peerLight->createJavaPeer(env); peerLight.release(); return result; } -jni::jobject* Light::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Light::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, reinterpret_cast(this)); } -void Light::setAnchor(jni::JNIEnv& env, jni::String property) { +void Light::setAnchor(jni::JNIEnv& env, const jni::String& property) { std::string anchorStr = jni::Make(env, property); if (anchorStr.compare("map") == 0) { light.setAnchor(LightAnchorType::Map); @@ -38,7 +36,7 @@ void Light::setAnchor(jni::JNIEnv& env, jni::String property) { } } -jni::String Light::getAnchor(jni::JNIEnv& env) { +jni::Local Light::getAnchor(jni::JNIEnv& env) { auto anchorType = light.getAnchor(); if (anchorType == LightAnchorType::Map) { return jni::Make(env, "map"); @@ -47,22 +45,22 @@ jni::String Light::getAnchor(jni::JNIEnv& env) { } } -void Light::setPosition(jni::JNIEnv& env, jni::Object jposition) { +void Light::setPosition(jni::JNIEnv& env, const jni::Object& jposition) { using namespace mbgl::android::conversion; auto position = *convert(env, jposition); light.setPosition(position); } -jni::Object Light::getPosition(jni::JNIEnv& env) { +jni::Local> Light::getPosition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::Position position = light.getPosition().asConstant(); - return *convert>(env, position); + return std::move(*convert>>(env, position)); } -jni::Object Light::getPositionTransition(jni::JNIEnv& env) { +jni::Local> Light::getPositionTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = light.getPositionTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void Light::setPositionTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -72,22 +70,22 @@ void Light::setPositionTransition(jni::JNIEnv&, jlong duration, jlong delay) { light.setPositionTransition(options); } -void Light::setColor(jni::JNIEnv& env, jni::String property) { +void Light::setColor(jni::JNIEnv& env, const jni::String& property) { auto color = Color::parse(jni::Make(env, property)); if (color) { light.setColor(color.value()); } } -jni::String Light::getColor(jni::JNIEnv &env) { +jni::Local Light::getColor(jni::JNIEnv &env) { auto color = light.getColor().asConstant(); return jni::Make(env, color.stringify()); } -jni::Object Light::getColorTransition(jni::JNIEnv& env) { +jni::Local> Light::getColorTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = light.getColorTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void Light::setColorTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -105,10 +103,10 @@ jni::jfloat Light::getIntensity(jni::JNIEnv&) { return light.getIntensity().asConstant(); } -jni::Object Light::getIntensityTransition(jni::JNIEnv& env) { +jni::Local> Light::getIntensityTransition(jni::JNIEnv& env) { using namespace mbgl::android::conversion; mbgl::style::TransitionOptions options = light.getIntensityTransition(); - return *convert>(env, options); + return std::move(*convert>>(env, options)); } void Light::setIntensityTransition(jni::JNIEnv&, jlong duration, jlong delay) { @@ -120,7 +118,7 @@ void Light::setIntensityTransition(jni::JNIEnv&, jlong duration, jlong delay) { void Light::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer diff --git a/platform/android/src/style/light.cpp.ejs b/platform/android/src/style/light.cpp.ejs deleted file mode 100644 index f18dc57a4f..0000000000 --- a/platform/android/src/style/light.cpp.ejs +++ /dev/null @@ -1,122 +0,0 @@ -<% - const properties = locals.properties; --%> -// This file is generated. Edit android/platform/scripts/generate-style-code.js, then run `make android-style-code`. - -#include -#include "light.hpp" -#include "conversion/transition_options.hpp" -#include "conversion/position.hpp" - -namespace mbgl { -namespace android { - -Light::Light(mbgl::Map& coreMap, mbgl::style::Light& coreLight) - : light(coreLight) , map(&coreMap) { -} - -static Light* initializeLightPeer(mbgl::Map& map, mbgl::style::Light& coreLight) { - return new Light(map, coreLight); -} - -jni::jobject* Light::createJavaLightPeer(jni::JNIEnv& env, Map& map, mbgl::style::Light& coreLight) { - std::unique_ptr peerLight = std::unique_ptr(initializeLightPeer(map, coreLight)); - jni::jobject* result = peerLight->createJavaPeer(env); - peerLight.release(); - return result; -} - -jni::jobject* Light::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); - static auto constructor = javaClass.GetConstructor(env); - return javaClass.New(env, constructor, reinterpret_cast(this)); -} - -<% for (const property of properties) { -%> -<% if (property.name == "position") { -%> -void Light::set<%- camelize(property.name) %>(jni::JNIEnv& env, jni::Object<<%- camelize(property.name) %>> j<%- property.name %>) { - using namespace mbgl::android::conversion; - auto position = *convert>(env, jposition); - light.set<%- camelize(property.name) %>(<%- property.name %>); -} - -jni::Object Light::get<%- camelize(property.name) %>(jni::JNIEnv& env) { - using namespace mbgl::android::conversion; - mbgl::style::<%- camelize(property.name) %> <%- property.name %> = light.get<%- camelize(property.name) %>().asConstant(); - return *convert>>(env, <%- property.name %>); -} -<% } else { -%> -<% if(property.name == "color") {-%> -void Light::set<%- camelize(property.name) %>(jni::JNIEnv& env, jni::<%- propertyJNIType(property) %> property) { - auto color = Color::parse(jni::Make(env, property)); - if (color) { - light.set<%- camelize(property.name) %>(color.value()); - } -} - -jni::String Light::get<%- camelize(property.name) %>(jni::JNIEnv &env) { - auto color = light.get<%- camelize(property.name) %>().asConstant(); - return jni::Make(env, color.stringify()); -} -<% } else if(property.name == "anchor"){ -%> -void Light::set<%- camelize(property.name) %>(jni::JNIEnv& env, jni::<%- propertyJNIType(property) %> property) { - std::string anchorStr = jni::Make(env, property); - if (anchorStr.compare("map") == 0) { - light.setAnchor(LightAnchorType::Map); - } else if (anchorStr.compare("viewport") == 0) { - light.setAnchor(LightAnchorType::Viewport); - } -} - -jni::String Light::getAnchor(jni::JNIEnv& env) { - auto anchorType = light.getAnchor(); - if (anchorType == LightAnchorType::Map) { - return jni::Make(env, "map"); - } else { - return jni::Make(env, "viewport"); - } -} -<% } else { -%> -void Light::set<%- camelize(property.name) %>(jni::JNIEnv&, jni::<%- propertyJNIType(property) %> property) { - light.set<%- camelize(property.name) %>(property); -} - -jni::<%- propertyJNIType(property) %> Light::get<%- camelize(property.name) %>(jni::JNIEnv&) { - return light.get<%- camelize(property.name) %>().asConstant(); -} -<% } -%> -<% } -%> - -<% if (property.transition) { -%> -jni::Object Light::get<%- camelize(property.name) %>Transition(jni::JNIEnv& env) { - using namespace mbgl::android::conversion; - mbgl::style::TransitionOptions options = light.get<%- camelize(property.name) %>Transition(); - return *convert>(env, options); -} - -void Light::set<%- camelize(property.name) %>Transition(jni::JNIEnv&, jlong duration, jlong delay) { - mbgl::style::TransitionOptions options; - options.duration.emplace(mbgl::Milliseconds(duration)); - options.delay.emplace(mbgl::Milliseconds(delay)); - light.set<%- camelize(property.name) %>Transition(options); -} - -<% } -%> -<% } -%> -void Light::registerNative(jni::JNIEnv& env) { - // Lookup the class - static auto javaClass = jni::Class::Singleton(env); - -#define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) - // Register the peer - jni::RegisterNativePeer(env, javaClass, "nativePtr",<% for(var i = 0; i < properties.length; i++) {%> -<% if (properties[i].transition) { -%> - METHOD(&Light::get<%- camelize(properties[i].name) %>Transition, "nativeGet<%- camelize(properties[i].name) %>Transition"), - METHOD(&Light::set<%- camelize(properties[i].name) %>Transition, "nativeSet<%- camelize(properties[i].name) %>Transition"), -<% } -%> - METHOD(&Light::get<%- camelize(properties[i].name) %>, "nativeGet<%- camelize(properties[i].name) %>"), - METHOD(&Light::set<%- camelize(properties[i].name) %>, "nativeSet<%- camelize(properties[i].name) %>")<% if(i != (properties.length -1)) {-%>,<% } -%><% } -%>); -} - -} // namespace android -} // namespace mb diff --git a/platform/android/src/style/light.hpp b/platform/android/src/style/light.hpp index 2c314067be..97767c4f76 100644 --- a/platform/android/src/style/light.hpp +++ b/platform/android/src/style/light.hpp @@ -1,5 +1,3 @@ -// This file is generated. Edit android/platform/scripts/generate-style-code.js, then run `make android-style-code`. - #pragma once #include @@ -21,29 +19,27 @@ public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/light/Light"; }; - static jni::Class javaClass; - static void registerNative(jni::JNIEnv&); - static jni::jobject* createJavaLightPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Light&); + static jni::Local> createJavaLightPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Light&); Light(mbgl::Map&, mbgl::style::Light&); - void setAnchor(jni::JNIEnv&, jni::String); - jni::String getAnchor(jni::JNIEnv&); - void setPosition(jni::JNIEnv&, jni::Object); - jni::Object getPosition(jni::JNIEnv&); + void setAnchor(jni::JNIEnv&, const jni::String&); + jni::Local getAnchor(jni::JNIEnv&); + void setPosition(jni::JNIEnv&, const jni::Object&); + jni::Local> getPosition(jni::JNIEnv&); void setPositionTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getPositionTransition(jni::JNIEnv&); - void setColor(jni::JNIEnv&, jni::String); - jni::String getColor(jni::JNIEnv&); + jni::Local> getPositionTransition(jni::JNIEnv&); + void setColor(jni::JNIEnv&, const jni::String&); + jni::Local getColor(jni::JNIEnv&); void setColorTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getColorTransition(jni::JNIEnv&); + jni::Local> getColorTransition(jni::JNIEnv&); void setIntensity(jni::JNIEnv&, jni::jfloat); jni::jfloat getIntensity(jni::JNIEnv&); void setIntensityTransition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object getIntensityTransition(jni::JNIEnv&); - jni::jobject* createJavaPeer(jni::JNIEnv&); + jni::Local> getIntensityTransition(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); protected: diff --git a/platform/android/src/style/light.hpp.ejs b/platform/android/src/style/light.hpp.ejs deleted file mode 100644 index 18f961b9e0..0000000000 --- a/platform/android/src/style/light.hpp.ejs +++ /dev/null @@ -1,59 +0,0 @@ -<% - const properties = locals.properties; --%> -// This file is generated. Edit android/platform/scripts/generate-style-code.js, then run `make android-style-code`. - -#pragma once - -#include - -#include -#include -#include "transition_options.hpp" -#include "position.hpp" -#include -#include - -namespace mbgl { -namespace android { - -using namespace style; - -class Light : private mbgl::util::noncopyable { -public: - - static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/light/Light"; }; - - static jni::Class javaClass; - - static void registerNative(jni::JNIEnv&); - - static jni::jobject* createJavaLightPeer(jni::JNIEnv&, mbgl::Map&, mbgl::style::Light&); - - Light(mbgl::Map&, mbgl::style::Light&); - -<% for (const property of properties) { -%> -<% if (property.name=="position") {-%> - void set<%- camelize(property.name) %>(jni::JNIEnv&, jni::Object); - jni::Object<<%- camelize(property.name) %>> get<%- camelize(property.name) %>(jni::JNIEnv&); -<% } else { -%> - void set<%- camelize(property.name) %>(jni::JNIEnv&, jni::<%- propertyJNIType(property) %>); - jni::<%- propertyJNIType(property) %> get<%- camelize(property.name) %>(jni::JNIEnv&); -<% } -%> -<% if (property.transition) { -%> - void set<%- camelize(property.name) %>Transition(jni::JNIEnv&, jlong duration, jlong delay); - jni::Object get<%- camelize(property.name) %>Transition(jni::JNIEnv&); -<% } -%> -<% } -%> - jni::jobject* createJavaPeer(jni::JNIEnv&); - -protected: - - // Raw reference to the light - mbgl::style::Light& light; - - // Map is set when the light is retrieved - mbgl::Map* map; -}; -} // namespace android -} // namespace mbgl \ No newline at end of file diff --git a/platform/android/src/style/position.cpp b/platform/android/src/style/position.cpp index c6918a2e9a..20a0c47dff 100644 --- a/platform/android/src/style/position.cpp +++ b/platform/android/src/style/position.cpp @@ -3,8 +3,8 @@ namespace mbgl { namespace android { -jni::Object Position::fromPosition(jni::JNIEnv& env, jfloat radialCoordinate, jfloat azimuthalAngle, jfloat polarAngle) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Position::fromPosition(jni::JNIEnv& env, jfloat radialCoordinate, jfloat azimuthalAngle, jfloat polarAngle) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jfloat, jfloat, jfloat)>(env, "fromPosition"); return javaClass.Call(env, method, radialCoordinate, azimuthalAngle, polarAngle); } @@ -13,20 +13,20 @@ void Position::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } -float Position::getRadialCoordinate(jni::JNIEnv& env, jni::Object position){ - static auto javaClass = jni::Class::Singleton(env); +float Position::getRadialCoordinate(jni::JNIEnv& env, const jni::Object& position) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "radialCoordinate"); return position.Get(env, field); } -float Position::getAzimuthalAngle(jni::JNIEnv& env, jni::Object position){ - static auto javaClass = jni::Class::Singleton(env); +float Position::getAzimuthalAngle(jni::JNIEnv& env, const jni::Object& position) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "azimuthalAngle"); return position.Get(env, field); } -float Position::getPolarAngle(jni::JNIEnv& env, jni::Object position){ - static auto javaClass = jni::Class::Singleton(env); +float Position::getPolarAngle(jni::JNIEnv& env, const jni::Object& position) { + static auto& javaClass = jni::Class::Singleton(env); static auto field = javaClass.GetField(env, "polarAngle"); return position.Get(env, field); } diff --git a/platform/android/src/style/position.hpp b/platform/android/src/style/position.hpp index 4f3738da9f..eb4f5ac674 100644 --- a/platform/android/src/style/position.hpp +++ b/platform/android/src/style/position.hpp @@ -11,13 +11,13 @@ class Position : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/light/Position"; }; - static jni::Object fromPosition(jni::JNIEnv&, jfloat, jfloat, jfloat); + static jni::Local> fromPosition(jni::JNIEnv&, jfloat, jfloat, jfloat); static void registerNative(jni::JNIEnv&); - static float getRadialCoordinate(jni::JNIEnv&, jni::Object); - static float getAzimuthalAngle(jni::JNIEnv&, jni::Object); - static float getPolarAngle(jni::JNIEnv&, jni::Object); + static float getRadialCoordinate(jni::JNIEnv&, const jni::Object&); + static float getAzimuthalAngle(jni::JNIEnv&, const jni::Object&); + static float getPolarAngle(jni::JNIEnv&, const jni::Object&); }; } // namespace android diff --git a/platform/android/src/style/sources/custom_geometry_source.cpp b/platform/android/src/style/sources/custom_geometry_source.cpp index 9012948b0b..057f5c99ba 100644 --- a/platform/android/src/style/sources/custom_geometry_source.cpp +++ b/platform/android/src/style/sources/custom_geometry_source.cpp @@ -1,4 +1,5 @@ #include "custom_geometry_source.hpp" +#include "../../attach_env.hpp" #include @@ -21,7 +22,7 @@ namespace android { // the value was originally a CustomGeometrySourceOptions object on the Java side. If it fails // to convert, it's a bug in our serialization or Java-side static typing. static style::CustomGeometrySource::Options convertCustomGeometrySourceOptions(jni::JNIEnv& env, - jni::Local> options, + const jni::Object<>& options, style::TileFunction fetchFn, style::TileFunction cancelFn) { using namespace mbgl::style::conversion; @@ -29,7 +30,7 @@ namespace android { return style::CustomGeometrySource::Options(); } Error error; - optional result = convert(Value(env, std::move(options)), error); + optional result = convert(Value(env, options), error); if (!result) { throw std::logic_error(error.message); } @@ -39,11 +40,11 @@ namespace android { } CustomGeometrySource::CustomGeometrySource(jni::JNIEnv& env, - jni::String sourceId, - jni::Object<> options) + const jni::String& sourceId, + const jni::Object<>& options) : Source(env, std::make_unique( jni::Make(env, sourceId), - convertCustomGeometrySourceOptions(env, jni::SeizeLocal(env, std::move(options)), + convertCustomGeometrySourceOptions(env, options, std::bind(&CustomGeometrySource::fetchTile, this, std::placeholders::_1), std::bind(&CustomGeometrySource::cancelTile, this, std::placeholders::_1)))) { } @@ -61,48 +62,48 @@ namespace android { void CustomGeometrySource::fetchTile (const mbgl::CanonicalTileID& tileID) { android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto fetchTile = javaClass.GetMethod(*_env, "fetchTile"); assert(javaPeer); - auto peer = jni::Cast(*_env, javaClass, *javaPeer); + auto peer = jni::Cast(*_env, javaClass, javaPeer); peer.Call(*_env, fetchTile, (int)tileID.z, (int)tileID.x, (int)tileID.y); }; void CustomGeometrySource::cancelTile(const mbgl::CanonicalTileID& tileID) { android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto cancelTile = javaClass.GetMethod(*_env, "cancelTile"); assert(javaPeer); - auto peer = jni::Cast(*_env, javaClass, *javaPeer); + auto peer = jni::Cast(*_env, javaClass, javaPeer); peer.Call(*_env, cancelTile, (int)tileID.z, (int)tileID.x, (int)tileID.y); }; void CustomGeometrySource::startThreads() { android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto startThreads = javaClass.GetMethod(*_env, "startThreads"); assert(javaPeer); - auto peer = jni::Cast(*_env, javaClass, *javaPeer); + auto peer = jni::Cast(*_env, javaClass, javaPeer); peer.Call(*_env, startThreads); } void CustomGeometrySource::releaseThreads() { android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto releaseThreads = javaClass.GetMethod(*_env, "releaseThreads"); assert(javaPeer); - auto peer = jni::Cast(*_env, javaClass, *javaPeer); + auto peer = jni::Cast(*_env, javaClass, javaPeer); peer.Call(*_env, releaseThreads); }; @@ -111,12 +112,12 @@ namespace android { jni::jint y) { android::UniqueEnv _env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*_env); + static auto& javaClass = jni::Class::Singleton(*_env); static auto isCancelled = javaClass.GetMethod(*_env, "isCancelled"); assert(javaPeer); - auto peer = jni::Cast(*_env, javaClass, *javaPeer); + auto peer = jni::Cast(*_env, javaClass, javaPeer); return peer.Call(*_env, isCancelled, z, x, y); }; @@ -124,7 +125,7 @@ namespace android { jni::jint z, jni::jint x, jni::jint y, - jni::Object jFeatures) { + const jni::Object& jFeatures) { using namespace mbgl::android::geojson; // Convert the jni object @@ -140,36 +141,35 @@ namespace android { source.as()->CustomGeometrySource::invalidateTile(CanonicalTileID(z, x, y)); } - void CustomGeometrySource::invalidateBounds(jni::JNIEnv& env, jni::Object jBounds) { + void CustomGeometrySource::invalidateBounds(jni::JNIEnv& env, const jni::Object& jBounds) { auto bounds = LatLngBounds::getLatLngBounds(env, jBounds); source.as()->CustomGeometrySource::invalidateRegion(bounds); } - jni::Array> CustomGeometrySource::querySourceFeatures(jni::JNIEnv& env, - jni::Array> jfilter) { + jni::Local>> CustomGeometrySource::querySourceFeatures(jni::JNIEnv& env, + const jni::Array>& jfilter) { using namespace mbgl::android::conversion; using namespace mbgl::android::geojson; std::vector features; if (rendererFrontend) { - features = rendererFrontend->querySourceFeatures(source.getID(), - { {}, toFilter(env, jni::SeizeLocal(env, std::move(jfilter))) }); + features = rendererFrontend->querySourceFeatures(source.getID(), { {}, toFilter(env, jfilter) }); } return Feature::convert(env, features); } - jni::Object CustomGeometrySource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> CustomGeometrySource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } - void CustomGeometrySource::addToMap(JNIEnv& env, jni::Object obj, mbgl::Map& map, AndroidRendererFrontend& frontend) { + void CustomGeometrySource::addToMap(JNIEnv& env, const jni::Object& obj, mbgl::Map& map, AndroidRendererFrontend& frontend) { Source::addToMap(env, obj, map, frontend); startThreads(); } - bool CustomGeometrySource::removeFromMap(JNIEnv& env, jni::Object source, mbgl::Map& map) { + bool CustomGeometrySource::removeFromMap(JNIEnv& env, const jni::Object& source, mbgl::Map& map) { bool successfullyRemoved = Source::removeFromMap(env, source, map); if (successfullyRemoved) { releaseThreads(); @@ -179,14 +179,14 @@ namespace android { void CustomGeometrySource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&CustomGeometrySource::querySourceFeatures, "querySourceFeatures"), diff --git a/platform/android/src/style/sources/custom_geometry_source.hpp b/platform/android/src/style/sources/custom_geometry_source.hpp index ecfadd659c..52e4027dd8 100644 --- a/platform/android/src/style/sources/custom_geometry_source.hpp +++ b/platform/android/src/style/sources/custom_geometry_source.hpp @@ -15,17 +15,17 @@ namespace android { class CustomGeometrySource : public Source { public: - + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/CustomGeometrySource"; }; static void registerNative(jni::JNIEnv&); - CustomGeometrySource(jni::JNIEnv&, jni::String, jni::Object<>); + CustomGeometrySource(jni::JNIEnv&, const jni::String&, const jni::Object<>&); CustomGeometrySource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); ~CustomGeometrySource(); - bool removeFromMap(JNIEnv&, jni::Object, mbgl::Map&) override; - void addToMap(JNIEnv&, jni::Object, mbgl::Map&, AndroidRendererFrontend&) override; + bool removeFromMap(JNIEnv&, const jni::Object&, mbgl::Map&) override; + void addToMap(JNIEnv&, const jni::Object&, mbgl::Map&, AndroidRendererFrontend&) override; void fetchTile(const mbgl::CanonicalTileID& tileID); void cancelTile(const mbgl::CanonicalTileID& tileID); @@ -34,15 +34,15 @@ public: void releaseThreads(); private: - void setTileData(jni::JNIEnv& env, jni::jint z, jni::jint x, jni::jint y, jni::Object jf); + void setTileData(jni::JNIEnv& env, jni::jint z, jni::jint x, jni::jint y, const jni::Object& jf); void invalidateTile(jni::JNIEnv& env, jni::jint z, jni::jint x, jni::jint y); - void invalidateBounds(jni::JNIEnv& env, jni::Object bounds); + void invalidateBounds(jni::JNIEnv& env, const jni::Object& bounds); - jni::Array> querySourceFeatures(jni::JNIEnv&, - jni::Array> ); + jni::Local>> querySourceFeatures(jni::JNIEnv&, + const jni::Array>& ); - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class CustomGeometrySource diff --git a/platform/android/src/style/sources/geojson_source.cpp b/platform/android/src/style/sources/geojson_source.cpp index 943cc48386..d0ad5fb699 100644 --- a/platform/android/src/style/sources/geojson_source.cpp +++ b/platform/android/src/style/sources/geojson_source.cpp @@ -1,4 +1,5 @@ #include "geojson_source.hpp" +#include "../../attach_env.hpp" #include @@ -29,24 +30,24 @@ namespace android { // This conversion is expected not to fail because it's used only in contexts where // the value was originally a GeoJsonOptions object on the Java side. If it fails // to convert, it's a bug in our serialization or Java-side static typing. - static style::GeoJSONOptions convertGeoJSONOptions(jni::JNIEnv& env, jni::Local> options) { + static style::GeoJSONOptions convertGeoJSONOptions(jni::JNIEnv& env, const jni::Object<>& options) { using namespace mbgl::style::conversion; if (!options) { return style::GeoJSONOptions(); } Error error; optional result = convert( - mbgl::android::Value(env, std::move(options)), error); + mbgl::android::Value(env, options), error); if (!result) { throw std::logic_error(error.message); } return *result; } - GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, jni::String sourceId, jni::Object<> options) + GeoJSONSource::GeoJSONSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& options) : Source(env, std::make_unique( jni::Make(env, sourceId), - convertGeoJSONOptions(env, jni::SeizeLocal(env, std::move(options))))) + convertGeoJSONOptions(env, options))) , threadPool(sharedThreadPool()) , converter(std::make_unique>(*threadPool)) { } @@ -61,7 +62,7 @@ namespace android { GeoJSONSource::~GeoJSONSource() = default; - void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, jni::String jString) { + void GeoJSONSource::setGeoJSONString(jni::JNIEnv& env, const jni::String& jString) { std::shared_ptr json = std::make_shared(jni::Make(env, jString)); @@ -72,54 +73,54 @@ namespace android { setAsync(converterFn); } - void GeoJSONSource::setFeatureCollection(jni::JNIEnv& env, jni::Object jFeatures) { + void GeoJSONSource::setFeatureCollection(jni::JNIEnv& env, const jni::Object& jFeatures) { setCollectionAsync(env, jFeatures); } - void GeoJSONSource::setFeature(jni::JNIEnv& env, jni::Object jFeature) { + void GeoJSONSource::setFeature(jni::JNIEnv& env, const jni::Object& jFeature) { setCollectionAsync(env, jFeature); } - void GeoJSONSource::setGeometry(jni::JNIEnv& env, jni::Object jGeometry) { + void GeoJSONSource::setGeometry(jni::JNIEnv& env, const jni::Object& jGeometry) { setCollectionAsync(env, jGeometry); } - void GeoJSONSource::setURL(jni::JNIEnv& env, jni::String url) { + void GeoJSONSource::setURL(jni::JNIEnv& env, const jni::String& url) { // Update the core source source.as()->GeoJSONSource::setURL(jni::Make(env, url)); } - jni::String GeoJSONSource::getURL(jni::JNIEnv& env) { + jni::Local GeoJSONSource::getURL(jni::JNIEnv& env) { optional url = source.as()->GeoJSONSource::getURL(); - return url ? jni::Make(env, *url) : jni::String(); + return url ? jni::Make(env, *url) : jni::Local(); } - jni::Array> GeoJSONSource::querySourceFeatures(jni::JNIEnv& env, - jni::Array> jfilter) { + jni::Local>> GeoJSONSource::querySourceFeatures(jni::JNIEnv& env, + const jni::Array>& jfilter) { using namespace mbgl::android::conversion; using namespace mbgl::android::geojson; std::vector features; if (rendererFrontend) { features = rendererFrontend->querySourceFeatures(source.getID(), - { {}, toFilter(env, jni::SeizeLocal(env, std::move(jfilter))) }); + { {}, toFilter(env, jfilter) }); } return Feature::convert(env, features); } - jni::Object GeoJSONSource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> GeoJSONSource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } template - void GeoJSONSource::setCollectionAsync(jni::JNIEnv& env, jni::Object jObject) { - - std::shared_ptr object = std::shared_ptr(jObject.NewGlobalRef(env).release().Get(), GenericGlobalRefDeleter()); + void GeoJSONSource::setCollectionAsync(jni::JNIEnv& env, const jni::Object& jObject) { + auto global = jni::NewGlobal(env, jObject); + auto object = std::make_shared(std::move(global)); Update::Converter converterFn = [this, object](ActorRef _callback) { - converter->self().invoke(&FeatureConverter::convertObject, jni::Object(*object), _callback); + converter->self().invoke(&FeatureConverter::convertObject, object, _callback); }; setAsync(converterFn); @@ -159,14 +160,14 @@ namespace android { void GeoJSONSource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&GeoJSONSource::setGeoJSONString, "nativeSetGeoJsonString"), @@ -196,13 +197,13 @@ namespace android { callback.invoke(&Callback::operator(), *converted); } - template - void FeatureConverter::convertObject(jni::Object jObject, ActorRef callback) { + template + void FeatureConverter::convertObject(std::shared_ptr, jni::EnvAttachingDeleter>> jObject, ActorRef callback) { using namespace mbgl::android::geojson; android::UniqueEnv _env = android::AttachEnv(); // Convert the jni object - auto geometry = JNIType::convert(*_env, jObject); + auto geometry = JNIType::convert(*_env, *jObject); callback.invoke(&Callback::operator(), GeoJSON(geometry)); } diff --git a/platform/android/src/style/sources/geojson_source.hpp b/platform/android/src/style/sources/geojson_source.hpp index eb28e2470b..20e8b6873b 100644 --- a/platform/android/src/style/sources/geojson_source.hpp +++ b/platform/android/src/style/sources/geojson_source.hpp @@ -16,7 +16,7 @@ struct FeatureConverter { void convertJson(std::shared_ptr, ActorRef); template - void convertObject(jni::Object, ActorRef); + void convertObject(std::shared_ptr, jni::EnvAttachingDeleter>>, ActorRef); }; struct Update { @@ -30,34 +30,35 @@ struct Update { class GeoJSONSource : public Source { public: + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/GeoJsonSource"; }; static void registerNative(jni::JNIEnv&); - GeoJSONSource(jni::JNIEnv&, jni::String, jni::Object<>); + GeoJSONSource(jni::JNIEnv&, const jni::String&, const jni::Object<>&); GeoJSONSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); ~GeoJSONSource(); private: - void setGeoJSONString(jni::JNIEnv&, jni::String); - void setFeatureCollection(jni::JNIEnv&, jni::Object); - void setFeature(jni::JNIEnv&, jni::Object); - void setGeometry(jni::JNIEnv&, jni::Object); - void setURL(jni::JNIEnv&, jni::String); + void setGeoJSONString(jni::JNIEnv&, const jni::String&); + void setFeatureCollection(jni::JNIEnv&, const jni::Object&); + void setFeature(jni::JNIEnv&, const jni::Object&); + void setGeometry(jni::JNIEnv&, const jni::Object&); + void setURL(jni::JNIEnv&, const jni::String&); - jni::Array> querySourceFeatures(jni::JNIEnv&, - jni::Array>); + jni::Local>> querySourceFeatures(jni::JNIEnv&, + const jni::Array>&); - jni::String getURL(jni::JNIEnv&); + jni::Local getURL(jni::JNIEnv&); - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); std::unique_ptr awaitingUpdate; std::unique_ptr update; std::shared_ptr threadPool; std::unique_ptr> converter; template - void setCollectionAsync(jni::JNIEnv&, jni::Object); + void setCollectionAsync(jni::JNIEnv&, const jni::Object&); void setAsync(Update::Converter); diff --git a/platform/android/src/style/sources/image_source.cpp b/platform/android/src/style/sources/image_source.cpp index 343b7439c8..b42e0e5a51 100644 --- a/platform/android/src/style/sources/image_source.cpp +++ b/platform/android/src/style/sources/image_source.cpp @@ -15,7 +15,7 @@ namespace mbgl { namespace android { - ImageSource::ImageSource(jni::JNIEnv& env, jni::String sourceId, jni::Object coordinatesObject) + ImageSource::ImageSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object& coordinatesObject) : Source(env, std::make_unique( jni::Make(env, sourceId), LatLngQuad::getLatLngArray(env, coordinatesObject) @@ -31,41 +31,41 @@ namespace android { ImageSource::~ImageSource() = default; - void ImageSource::setURL(jni::JNIEnv& env, jni::String url) { + void ImageSource::setURL(jni::JNIEnv& env, const jni::String& url) { // Update the core source source.as()->ImageSource::setURL(jni::Make(env, url)); } - jni::String ImageSource::getURL(jni::JNIEnv& env) { + jni::Local ImageSource::getURL(jni::JNIEnv& env) { optional url = source.as()->ImageSource::getURL(); - return url ? jni::Make(env, *url) : jni::String(); + return url ? jni::Make(env, *url) : jni::Local(); } - void ImageSource::setImage(jni::JNIEnv& env, jni::Object bitmap) { + void ImageSource::setImage(jni::JNIEnv& env, const jni::Object& bitmap) { source.as()->setImage(Bitmap::GetImage(env, bitmap)); } - void ImageSource::setCoordinates(jni::JNIEnv& env, jni::Object coordinatesObject) { + void ImageSource::setCoordinates(jni::JNIEnv& env, const jni::Object& coordinatesObject) { source.as()->setCoordinates( LatLngQuad::getLatLngArray(env, coordinatesObject)); } - jni::Object ImageSource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> ImageSource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } void ImageSource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&ImageSource::setURL, "nativeSetUrl"), diff --git a/platform/android/src/style/sources/image_source.hpp b/platform/android/src/style/sources/image_source.hpp index b09d4f8c95..6c359bf0ee 100644 --- a/platform/android/src/style/sources/image_source.hpp +++ b/platform/android/src/style/sources/image_source.hpp @@ -12,26 +12,26 @@ class Bitmap; class ImageSource : public Source { public: - + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/ImageSource"; }; static void registerNative(jni::JNIEnv&); - ImageSource(jni::JNIEnv&, jni::String, jni::Object); + ImageSource(jni::JNIEnv&, const jni::String&, const jni::Object&); ImageSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); ~ImageSource(); - void setURL(jni::JNIEnv&, jni::String); - jni::String getURL(jni::JNIEnv&); + void setURL(jni::JNIEnv&, const jni::String&); + jni::Local getURL(jni::JNIEnv&); - void setImage(jni::JNIEnv&, jni::Object); + void setImage(jni::JNIEnv&, const jni::Object&); - void setCoordinates(jni::JNIEnv&, jni::Object); + void setCoordinates(jni::JNIEnv&, const jni::Object&); private: - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class ImageSource diff --git a/platform/android/src/style/sources/raster_dem_source.cpp b/platform/android/src/style/sources/raster_dem_source.cpp index 73d04f27c1..f60526a9b7 100644 --- a/platform/android/src/style/sources/raster_dem_source.cpp +++ b/platform/android/src/style/sources/raster_dem_source.cpp @@ -12,12 +12,12 @@ namespace mbgl { namespace android { - RasterDEMSource::RasterDEMSource(jni::JNIEnv& env, jni::String sourceId, jni::Object<> urlOrTileSet, jni::jint tileSize) + RasterDEMSource::RasterDEMSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& urlOrTileSet, jni::jint tileSize) : Source( env, std::make_unique( jni::Make(env, sourceId), - convertURLOrTileset(Value(env, jni::SeizeLocal(env, std::move(urlOrTileSet)))), + convertURLOrTileset(Value(env, urlOrTileSet)), tileSize ) ) { @@ -31,27 +31,27 @@ namespace android { RasterDEMSource::~RasterDEMSource() = default; - jni::String RasterDEMSource::getURL(jni::JNIEnv& env) { + jni::Local RasterDEMSource::getURL(jni::JNIEnv& env) { optional url = source.as()->RasterDEMSource::getURL(); - return url ? jni::Make(env, *url) : jni::String(); + return url ? jni::Make(env, *url) : jni::Local(); } - jni::Object RasterDEMSource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> RasterDEMSource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } void RasterDEMSource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, jni::jint>, + jni::MakePeer&, jni::jint>, "initialize", "finalize", METHOD(&RasterDEMSource::getURL, "nativeGetUrl") diff --git a/platform/android/src/style/sources/raster_dem_source.hpp b/platform/android/src/style/sources/raster_dem_source.hpp index 25d9fe90cd..0b31c4ecd3 100644 --- a/platform/android/src/style/sources/raster_dem_source.hpp +++ b/platform/android/src/style/sources/raster_dem_source.hpp @@ -9,18 +9,19 @@ namespace android { class RasterDEMSource : public Source { public: + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/RasterDemSource"; }; static void registerNative(jni::JNIEnv&); - RasterDEMSource(jni::JNIEnv&, jni::String, jni::Object<>, jni::jint); + RasterDEMSource(jni::JNIEnv&, const jni::String&, const jni::Object<>&, jni::jint); RasterDEMSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); ~RasterDEMSource(); - jni::String getURL(jni::JNIEnv&); + jni::Local getURL(jni::JNIEnv&); private: - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class RasterDEMSource diff --git a/platform/android/src/style/sources/raster_source.cpp b/platform/android/src/style/sources/raster_source.cpp index 4eef41c8b1..535f899c99 100644 --- a/platform/android/src/style/sources/raster_source.cpp +++ b/platform/android/src/style/sources/raster_source.cpp @@ -11,12 +11,12 @@ namespace mbgl { namespace android { - RasterSource::RasterSource(jni::JNIEnv& env, jni::String sourceId, jni::Object<> urlOrTileSet, jni::jint tileSize) + RasterSource::RasterSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& urlOrTileSet, jni::jint tileSize) : Source( env, std::make_unique( jni::Make(env, sourceId), - convertURLOrTileset(Value(env, jni::SeizeLocal(env, std::move(urlOrTileSet)))), + convertURLOrTileset(Value(env, urlOrTileSet)), tileSize ) ) { @@ -30,27 +30,27 @@ namespace android { RasterSource::~RasterSource() = default; - jni::String RasterSource::getURL(jni::JNIEnv& env) { + jni::Local RasterSource::getURL(jni::JNIEnv& env) { optional url = source.as()->RasterSource::getURL(); - return url ? jni::Make(env, *url) : jni::String(); + return url ? jni::Make(env, *url) : jni::Local(); } - jni::Object RasterSource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> RasterSource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } void RasterSource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique, jni::jint>, + jni::MakePeer&, jni::jint>, "initialize", "finalize", METHOD(&RasterSource::getURL, "nativeGetUrl") diff --git a/platform/android/src/style/sources/raster_source.hpp b/platform/android/src/style/sources/raster_source.hpp index 888d9f601d..08648f79aa 100644 --- a/platform/android/src/style/sources/raster_source.hpp +++ b/platform/android/src/style/sources/raster_source.hpp @@ -9,18 +9,19 @@ namespace android { class RasterSource : public Source { public: + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/RasterSource"; }; static void registerNative(jni::JNIEnv&); - RasterSource(jni::JNIEnv&, jni::String, jni::Object<>, jni::jint); + RasterSource(jni::JNIEnv&, const jni::String&, const jni::Object<>&, jni::jint); RasterSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); ~RasterSource(); - jni::String getURL(jni::JNIEnv&); + jni::Local getURL(jni::JNIEnv&); private: - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class RasterSource diff --git a/platform/android/src/style/sources/source.cpp b/platform/android/src/style/sources/source.cpp index c7968786ec..e13f55aff1 100644 --- a/platform/android/src/style/sources/source.cpp +++ b/platform/android/src/style/sources/source.cpp @@ -1,5 +1,6 @@ #include "source.hpp" #include "../android_conversion.hpp" +#include "../../attach_env.hpp" #include @@ -47,16 +48,16 @@ namespace android { } } - jni::Object Source::peerForCoreSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend& frontend) { + const jni::Object& Source::peerForCoreSource(jni::JNIEnv& env, mbgl::style::Source& coreSource, AndroidRendererFrontend& frontend) { if (!coreSource.peer.has_value()) { coreSource.peer = createSourcePeer(env, coreSource, frontend); } - return *coreSource.peer.get>()->javaPeer; + return coreSource.peer.get>()->javaPeer; } - Source::Source(jni::JNIEnv& env, mbgl::style::Source& coreSource, jni::Object obj, AndroidRendererFrontend& frontend) + Source::Source(jni::JNIEnv& env, mbgl::style::Source& coreSource, const jni::Object& obj, AndroidRendererFrontend& frontend) : source(coreSource) - , javaPeer(obj.NewGlobalRef(env)) + , javaPeer(jni::NewGlobal(env, obj)) , rendererFrontend(&frontend) { } @@ -76,23 +77,23 @@ namespace android { if (ownedSource.get() == nullptr && javaPeer.get() != nullptr) { // Manually clear the java peer android::UniqueEnv env = android::AttachEnv(); - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto nativePtrField = javaClass.GetField(*env, "nativePtr"); - javaPeer->Set(*env, nativePtrField, (jlong) 0); + javaPeer.Set(*env, nativePtrField, (jlong) 0); javaPeer.reset(); } } - jni::String Source::getId(jni::JNIEnv& env) { + jni::Local Source::getId(jni::JNIEnv& env) { return jni::Make(env, source.getID()); } - jni::String Source::getAttribution(jni::JNIEnv& env) { + jni::Local Source::getAttribution(jni::JNIEnv& env) { auto attribution = source.getAttribution(); return attribution ? jni::Make(env, attribution.value()) : jni::Make(env,""); } - void Source::addToMap(JNIEnv& env, jni::Object obj, mbgl::Map& map, AndroidRendererFrontend& frontend) { + void Source::addToMap(JNIEnv& env, const jni::Object& obj, mbgl::Map& map, AndroidRendererFrontend& frontend) { // Check to see if we own the source first if (!ownedSource) { throw std::runtime_error("Cannot add source twice"); @@ -105,12 +106,12 @@ namespace android { source.peer = std::unique_ptr(this); // Add strong reference to java source - javaPeer = obj.NewGlobalRef(env); + javaPeer = jni::NewGlobal(env, obj); rendererFrontend = &frontend; } - bool Source::removeFromMap(JNIEnv&, jni::Object, mbgl::Map& map) { + bool Source::removeFromMap(JNIEnv&, const jni::Object&, mbgl::Map& map) { // Cannot remove if not attached yet if (ownedSource) { throw std::runtime_error("Cannot remove detached source"); @@ -143,7 +144,7 @@ namespace android { void Source::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/style/sources/source.hpp b/platform/android/src/style/sources/source.hpp index 492be8dfec..93b706425a 100644 --- a/platform/android/src/style/sources/source.hpp +++ b/platform/android/src/style/sources/source.hpp @@ -19,12 +19,12 @@ public: static void registerNative(jni::JNIEnv&); - static jni::Object peerForCoreSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); + static const jni::Object& peerForCoreSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); /* * Called when a Java object is created for a core source that belongs to a map. */ - Source(jni::JNIEnv&, mbgl::style::Source&, jni::Object, AndroidRendererFrontend&); + Source(jni::JNIEnv&, mbgl::style::Source&, const jni::Object&, AndroidRendererFrontend&); /* * Called when a Java object is created for a new core source that does not belong to a map. @@ -33,15 +33,15 @@ public: virtual ~Source(); - virtual void addToMap(JNIEnv&, jni::Object, mbgl::Map&, AndroidRendererFrontend&); + virtual void addToMap(JNIEnv&, const jni::Object&, mbgl::Map&, AndroidRendererFrontend&); - virtual bool removeFromMap(JNIEnv&, jni::Object, mbgl::Map&); + virtual bool removeFromMap(JNIEnv&, const jni::Object&, mbgl::Map&); void releaseJavaPeer(); - jni::String getId(jni::JNIEnv&); + jni::Local getId(jni::JNIEnv&); - jni::String getAttribution(jni::JNIEnv&); + jni::Local getAttribution(jni::JNIEnv&); protected: // Set on newly created sources until added to the map. diff --git a/platform/android/src/style/sources/unknown_source.cpp b/platform/android/src/style/sources/unknown_source.cpp index 8e91798392..b5285a5f9f 100644 --- a/platform/android/src/style/sources/unknown_source.cpp +++ b/platform/android/src/style/sources/unknown_source.cpp @@ -18,15 +18,15 @@ namespace android { : Source(env, coreSource, createJavaPeer(env), frontend) { } - jni::Object UnknownSource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> UnknownSource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } void UnknownSource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) diff --git a/platform/android/src/style/sources/unknown_source.hpp b/platform/android/src/style/sources/unknown_source.hpp index 855aea7c63..f042e2042c 100644 --- a/platform/android/src/style/sources/unknown_source.hpp +++ b/platform/android/src/style/sources/unknown_source.hpp @@ -9,7 +9,7 @@ namespace android { class UnknownSource : public Source { public: - + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/UnknownSource"; }; static void registerNative(jni::JNIEnv&); @@ -19,7 +19,7 @@ public: ~UnknownSource() = default; private: - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class UnknownSource diff --git a/platform/android/src/style/sources/vector_source.cpp b/platform/android/src/style/sources/vector_source.cpp index 48eb4ca51c..e46fc1a94e 100644 --- a/platform/android/src/style/sources/vector_source.cpp +++ b/platform/android/src/style/sources/vector_source.cpp @@ -20,12 +20,12 @@ namespace mbgl { namespace android { - VectorSource::VectorSource(jni::JNIEnv& env, jni::String sourceId, jni::Object<> urlOrTileSet) + VectorSource::VectorSource(jni::JNIEnv& env, const jni::String& sourceId, const jni::Object<>& urlOrTileSet) : Source( env, std::make_unique( jni::Make(env, sourceId), - convertURLOrTileset(Value(env, jni::SeizeLocal(env, std::move(urlOrTileSet)))) + convertURLOrTileset(Value(env, urlOrTileSet)) ) ) { } @@ -38,41 +38,41 @@ namespace android { VectorSource::~VectorSource() = default; - jni::String VectorSource::getURL(jni::JNIEnv& env) { + jni::Local VectorSource::getURL(jni::JNIEnv& env) { optional url = source.as()->VectorSource::getURL(); - return url ? jni::Make(env, *url) : jni::String(); + return url ? jni::Make(env, *url) : jni::Local(); } - jni::Array> VectorSource::querySourceFeatures(jni::JNIEnv& env, - jni::Array jSourceLayerIds, - jni::Array> jfilter) { + jni::Local>> VectorSource::querySourceFeatures(jni::JNIEnv& env, + const jni::Array& jSourceLayerIds, + const jni::Array>& jfilter) { using namespace mbgl::android::conversion; using namespace mbgl::android::geojson; std::vector features; if (rendererFrontend) { features = rendererFrontend->querySourceFeatures(source.getID(), - { toVector(env, jSourceLayerIds), toFilter(env, jni::SeizeLocal(env, std::move(jfilter))) }); + { toVector(env, jSourceLayerIds), toFilter(env, jfilter) }); } return Feature::convert(env, features); } - jni::Object VectorSource::createJavaPeer(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); + jni::Local> VectorSource::createJavaPeer(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); - return jni::Object(javaClass.New(env, constructor, reinterpret_cast(this)).Get()); + return javaClass.New(env, constructor, reinterpret_cast(this)); } void VectorSource::registerNative(jni::JNIEnv& env) { // Lookup the class - static auto javaClass = jni::Class::Singleton(env); + static auto& javaClass = jni::Class::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod(name) // Register the peer jni::RegisterNativePeer( env, javaClass, "nativePtr", - std::make_unique>, + jni::MakePeer&>, "initialize", "finalize", METHOD(&VectorSource::querySourceFeatures, "querySourceFeatures"), diff --git a/platform/android/src/style/sources/vector_source.hpp b/platform/android/src/style/sources/vector_source.hpp index 587a4be208..4cb46c6c62 100644 --- a/platform/android/src/style/sources/vector_source.hpp +++ b/platform/android/src/style/sources/vector_source.hpp @@ -10,21 +10,22 @@ namespace android { class VectorSource : public Source { public: + using SuperTag = Source; static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/sources/VectorSource"; }; static void registerNative(jni::JNIEnv&); - VectorSource(jni::JNIEnv&, jni::String, jni::Object<>); + VectorSource(jni::JNIEnv&, const jni::String&, const jni::Object<>&); VectorSource(jni::JNIEnv&, mbgl::style::Source&, AndroidRendererFrontend&); ~VectorSource(); private: - jni::Array> querySourceFeatures(jni::JNIEnv&, jni::Array, - jni::Array> jfilter); + jni::Local>> querySourceFeatures(jni::JNIEnv&, const jni::Array&, + const jni::Array>& jfilter); - jni::String getURL(jni::JNIEnv&); + jni::Local getURL(jni::JNIEnv&); - jni::Object createJavaPeer(jni::JNIEnv&); + jni::Local> createJavaPeer(jni::JNIEnv&); }; // class VectorSource diff --git a/platform/android/src/style/transition_options.cpp b/platform/android/src/style/transition_options.cpp index 84bd909125..b908c37089 100644 --- a/platform/android/src/style/transition_options.cpp +++ b/platform/android/src/style/transition_options.cpp @@ -3,8 +3,8 @@ namespace mbgl { namespace android { -jni::Object TransitionOptions::fromTransitionOptions(jni::JNIEnv& env, jlong duration, jlong delay) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> TransitionOptions::fromTransitionOptions(jni::JNIEnv& env, jlong duration, jlong delay) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jlong, jlong)>(env, "fromTransitionOptions"); return javaClass.Call(env, method, duration, delay); } diff --git a/platform/android/src/style/transition_options.hpp b/platform/android/src/style/transition_options.hpp index 83276ca1d8..0bac43fa16 100644 --- a/platform/android/src/style/transition_options.hpp +++ b/platform/android/src/style/transition_options.hpp @@ -11,7 +11,7 @@ class TransitionOptions : private mbgl::util::noncopyable { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/style/layers/TransitionOptions"; }; - static jni::Object fromTransitionOptions(jni::JNIEnv&, jlong duration, jlong offset); + static jni::Local> fromTransitionOptions(jni::JNIEnv&, jlong duration, jlong offset); static void registerNative(jni::JNIEnv&); }; diff --git a/platform/android/src/style/value.cpp b/platform/android/src/style/value.cpp index 6cdf134931..f916909687 100644 --- a/platform/android/src/style/value.cpp +++ b/platform/android/src/style/value.cpp @@ -10,64 +10,67 @@ namespace android { : env(_env), value(std::move(_value)) {} + Value::Value(jni::JNIEnv& _env, const jni::Object<>& _value) + : env(_env), + value(jni::NewLocal(_env, _value)) {} + bool Value::isNull() const { return !value; } bool Value::isArray() const { - return jni::IsInstanceOf(env, value->Get(), *java::ObjectArray::jclass); + return jni::IsInstanceOf(env, value.get(), *java::ObjectArray::jclass); } bool Value::isObject() const { - return jni::IsInstanceOf(env, value->Get(), *java::Map::jclass); + return jni::IsInstanceOf(env, value.get(), *java::Map::jclass); } bool Value::isString() const { - return jni::IsInstanceOf(env, value->Get(), *java::String::jclass); + return jni::IsInstanceOf(env, value.get(), *java::String::jclass); } bool Value::isBool() const { - return jni::IsInstanceOf(env, value->Get(), *java::Boolean::jclass); + return jni::IsInstanceOf(env, value.get(), *java::Boolean::jclass); } bool Value::isNumber() const { - return jni::IsInstanceOf(env, value->Get(), *java::Number::jclass); + return jni::IsInstanceOf(env, value.get(), *java::Number::jclass); } std::string Value::toString() const { - jni::jstring* string = reinterpret_cast(value->Get()); - return jni::Make(env, jni::String(string)); + return jni::Make(env, jni::Cast(env, jni::Class::Singleton(env), value)); } float Value::toFloat() const { - return jni::CallMethod(env, value->Get(), *java::Number::floatValueMethodId); + return jni::CallMethod(env, value.get(), *java::Number::floatValueMethodId); } double Value::toDouble() const { - return jni::CallMethod(env, value->Get(), *java::Number::doubleValueMethodId); + return jni::CallMethod(env, value.get(), *java::Number::doubleValueMethodId); } long Value::toLong() const { - return jni::CallMethod(env, value->Get(), *java::Number::longValueMethodId); + return jni::CallMethod(env, value.get(), *java::Number::longValueMethodId); } bool Value::toBool() const { - return jni::CallMethod(env, value->Get(), *java::Boolean::booleanValueMethodId); + return jni::CallMethod(env, value.get(), *java::Boolean::booleanValueMethodId); } Value Value::get(const char* key) const { - jni::jobject* member = jni::CallMethod(env, value->Get(), *java::Map::getMethodId, jni::Make(env, std::string(key)).Get()); - return Value(env, jni::SeizeLocal(env, jni::Object<>(member))); + jni::jobject* member = jni::CallMethod(env, value.get(), *java::Map::getMethodId, jni::Make(env, std::string(key)).get()); + return Value(env, jni::Local>(env, member)); } int Value::getLength() const { - auto array = (jni::jarray*) value->Get(); + auto array = (jni::jarray*) value.get(); return jni::GetArrayLength(env, *array); } Value Value::get(const int index) const { - auto array = (jni::jarray*) value->Get(); - return Value(env, jni::SeizeLocal(env, jni::Object<>(jni::GetObjectArrayElement(env, *array, index)))); + auto array = (jni::jarray*) value.get(); + return Value(env, jni::Local>(env, jni::GetObjectArrayElement(env, *array, index))); } } } diff --git a/platform/android/src/style/value.hpp b/platform/android/src/style/value.hpp index bd1c552be0..b3e665e57b 100644 --- a/platform/android/src/style/value.hpp +++ b/platform/android/src/style/value.hpp @@ -10,6 +10,7 @@ namespace android { class Value { public: Value(jni::JNIEnv&, jni::Local>); + Value(jni::JNIEnv&, const jni::Object<>&); Value(Value&&) = default; Value& operator=(Value&&) = default; diff --git a/platform/android/src/test/main.jni.cpp b/platform/android/src/test/main.jni.cpp index f96dd6aa5e..1cd0d26d2c 100644 --- a/platform/android/src/test/main.jni.cpp +++ b/platform/android/src/test/main.jni.cpp @@ -18,7 +18,7 @@ struct Main { /** * JNI Bound to Main#runAllTests() */ - static void runAllTests(jni::JNIEnv& env, jni::Object
, jni::Array args) { + static void runAllTests(jni::JNIEnv& env, const jni::Object
&, const jni::Array& args) { mbgl::Log::Warning(mbgl::Event::JNI, "Starting tests"); // We need to create a copy of the argv data since Java-internals are stored in UTF-16. @@ -69,7 +69,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *) { // Load the test library jni bindings mbgl::Log::Info(mbgl::Event::JNI, "Registering test JNI Methods"); - jni::RegisterNatives(env, jni::Class
::Find(env), + jni::RegisterNatives(env, *jni::Class
::Find(env), jni::MakeNativeMethod("runAllTests")); return JNI_VERSION_1_6; diff --git a/platform/android/src/text/collator.cpp b/platform/android/src/text/collator.cpp index 86e72a1dac..04da53832a 100644 --- a/platform/android/src/text/collator.cpp +++ b/platform/android/src/text/collator.cpp @@ -16,20 +16,20 @@ void Collator::registerNative(jni::JNIEnv& env) { jni::Class::Singleton(env); } -jni::Object Collator::getInstance(jni::JNIEnv& env, jni::Object locale) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Collator::getInstance(jni::JNIEnv& env, const jni::Object& locale) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod (jni::Object)>(env, "getInstance"); return javaClass.Call(env, method, locale); } -void Collator::setStrength(jni::JNIEnv& env, jni::Object collator, jni::jint strength) { - static auto javaClass = jni::Class::Singleton(env); +void Collator::setStrength(jni::JNIEnv& env, const jni::Object& collator, jni::jint strength) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "setStrength"); collator.Call(env, method, strength); } -jni::jint Collator::compare(jni::JNIEnv& env, jni::Object collator, jni::String lhs, jni::String rhs) { - static auto javaClass = jni::Class::Singleton(env); +jni::jint Collator::compare(jni::JNIEnv& env, const jni::Object& collator, const jni::String& lhs, const jni::String& rhs) { + static auto& javaClass = jni::Class::Singleton(env); auto static method = javaClass.GetMethod(env, "compare"); return collator.Call(env, method, lhs, rhs); } @@ -54,32 +54,32 @@ jni::String Locale::toLanguageTag(jni::JNIEnv& env, jni::Object locale) } */ -jni::String Locale::getLanguage(jni::JNIEnv& env, jni::Object locale) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local Locale::getLanguage(jni::JNIEnv& env, const jni::Object& locale) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "getLanguage"); return locale.Call(env, method); } -jni::String Locale::getCountry(jni::JNIEnv& env, jni::Object locale) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local Locale::getCountry(jni::JNIEnv& env, const jni::Object& locale) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetMethod(env, "getCountry"); return locale.Call(env, method); } -jni::Object Locale::getDefault(jni::JNIEnv& env) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Locale::getDefault(jni::JNIEnv& env) { + static auto& javaClass = jni::Class::Singleton(env); static auto method = javaClass.GetStaticMethod ()>(env, "getDefault"); return javaClass.Call(env, method); } -jni::Object Locale::New(jni::JNIEnv& env, jni::String language) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Locale::New(jni::JNIEnv& env, const jni::String& language) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, language); } -jni::Object Locale::New(jni::JNIEnv& env, jni::String language, jni::String region) { - static auto javaClass = jni::Class::Singleton(env); +jni::Local> Locale::New(jni::JNIEnv& env, const jni::String& language, const jni::String& region) { + static auto& javaClass = jni::Class::Singleton(env); static auto constructor = javaClass.GetConstructor(env); return javaClass.New(env, constructor, language, region); } @@ -98,26 +98,25 @@ public: { LanguageTag languageTag = locale_ ? LanguageTag::fromBCP47(*locale_) : LanguageTag(); if (!languageTag.language) { - locale = android::Locale::getDefault(*env).NewGlobalRef(*env); + locale = jni::NewGlobal(*env, + android::Locale::getDefault(*env)); } else if (!languageTag.region) { - locale = android::Locale::New(*env, - jni::Make(*env, *(languageTag.language))) - .NewGlobalRef(*env); + locale = jni::NewGlobal(*env, + android::Locale::New(*env, jni::Make(*env, *languageTag.language))); } else { - locale = android::Locale::New(*env, - jni::Make(*env, *(languageTag.language)), - jni::Make(*env, *(languageTag.region))) - .NewGlobalRef(*env); + locale = jni::NewGlobal(*env, + android::Locale::New(*env, jni::Make(*env, *languageTag.language), + jni::Make(*env, *languageTag.region))); } - collator = android::Collator::getInstance(*env, *locale).NewGlobalRef(*env);; + collator = jni::NewGlobal(*env, android::Collator::getInstance(*env, locale)); if (!diacriticSensitive && !caseSensitive) { - android::Collator::setStrength(*env, *collator, 0 /*PRIMARY*/); + android::Collator::setStrength(*env, collator, 0 /*PRIMARY*/); } else if (diacriticSensitive && !caseSensitive) { - android::Collator::setStrength(*env, *collator, 1 /*SECONDARY*/); + android::Collator::setStrength(*env, collator, 1 /*SECONDARY*/); } else if (caseSensitive) { // If we're case-sensitive and diacritic-sensitive, we use a case-sensitive collator // and a fallback implementation of diacritic-insensitivity. - android::Collator::setStrength(*env, *collator, 2 /*TERTIARY*/); + android::Collator::setStrength(*env, collator, 2 /*TERTIARY*/); } } @@ -135,23 +134,21 @@ public: // Because of the difference in locale-awareness, this means turning on case-sensitivity // can _potentially_ change compare results for strings that don't actually have any case // differences. - jni::Local jlhs = jni::SeizeLocal(*env, jni::Make(*env, useUnaccent ? + jni::Local jlhs = jni::Make(*env, useUnaccent ? platform::unaccent(lhs) : - lhs)); - jni::Local jrhs = jni::SeizeLocal(*env, jni::Make(*env, useUnaccent ? + lhs); + jni::Local jrhs = jni::Make(*env, useUnaccent ? platform::unaccent(rhs) : - rhs)); + rhs); - jni::jint result = android::Collator::compare(*env, *collator, *jlhs, *jrhs); + jni::jint result = android::Collator::compare(*env, collator, jlhs, jrhs); return result; } std::string resolvedLocale() const { - std::string language = jni::Make(*env, - *jni::SeizeLocal(*env, android::Locale::getLanguage(*env, *locale))); - std::string region = jni::Make(*env, - *jni::SeizeLocal(*env, android::Locale::getCountry(*env, *locale))); + std::string language = jni::Make(*env, android::Locale::getLanguage(*env, locale)); + std::string region = jni::Make(*env, android::Locale::getCountry(*env, locale)); optional resultLanguage; if (!language.empty()) resultLanguage = language; diff --git a/platform/android/src/text/collator_jni.hpp b/platform/android/src/text/collator_jni.hpp index 30fb6a4369..e5e82c34fd 100644 --- a/platform/android/src/text/collator_jni.hpp +++ b/platform/android/src/text/collator_jni.hpp @@ -24,12 +24,12 @@ public: static jni::Object forLanguageTag(jni::JNIEnv&, jni::String); static jni::String toLanguageTag(jni::JNIEnv&, jni::Object); */ - static jni::Object getDefault(jni::JNIEnv&); - static jni::String getLanguage(jni::JNIEnv&, jni::Object); - static jni::String getCountry(jni::JNIEnv&, jni::Object); + static jni::Local> getDefault(jni::JNIEnv&); + static jni::Local getLanguage(jni::JNIEnv&, const jni::Object&); + static jni::Local getCountry(jni::JNIEnv&, const jni::Object&); - static jni::Object New(jni::JNIEnv&, jni::String); - static jni::Object New(jni::JNIEnv&, jni::String, jni::String); + static jni::Local> New(jni::JNIEnv&, const jni::String&); + static jni::Local> New(jni::JNIEnv&, const jni::String&, const jni::String&); static void registerNative(jni::JNIEnv&); @@ -39,11 +39,11 @@ class Collator { public: static constexpr auto Name() { return "java/text/Collator"; }; - static jni::Object getInstance(jni::JNIEnv&, jni::Object); + static jni::Local> getInstance(jni::JNIEnv&, const jni::Object&); - static void setStrength(jni::JNIEnv&, jni::Object, jni::jint); + static void setStrength(jni::JNIEnv&, const jni::Object&, jni::jint); - static jni::jint compare(jni::JNIEnv&, jni::Object, jni::String, jni::String); + static jni::jint compare(jni::JNIEnv&, const jni::Object&, const jni::String&, const jni::String&); static void registerNative(jni::JNIEnv&); diff --git a/platform/android/src/text/local_glyph_rasterizer.cpp b/platform/android/src/text/local_glyph_rasterizer.cpp index adfa0559f3..8892ee3f37 100644 --- a/platform/android/src/text/local_glyph_rasterizer.cpp +++ b/platform/android/src/text/local_glyph_rasterizer.cpp @@ -36,25 +36,24 @@ namespace android { LocalGlyphRasterizer::LocalGlyphRasterizer() { UniqueEnv env { AttachEnv() }; - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto constructor = javaClass.GetConstructor(*env); - javaObject = javaClass.New(*env, constructor).NewGlobalRef(*env); + javaObject = jni::NewGlobal(*env, javaClass.New(*env, constructor)); } PremultipliedImage LocalGlyphRasterizer::drawGlyphBitmap(const std::string& fontFamily, const bool bold, const GlyphID glyphID) { UniqueEnv env { AttachEnv() }; - static auto javaClass = jni::Class::Singleton(*env); + static auto& javaClass = jni::Class::Singleton(*env); static auto drawGlyphBitmap = javaClass.GetMethod (jni::String, jni::jboolean, jni::jchar)>(*env, "drawGlyphBitmap"); - auto javaBitmap = jni::SeizeLocal(*env, - javaObject->Call(*env, drawGlyphBitmap, - *jni::SeizeLocal(*env, jni::Make(*env, fontFamily)), - static_cast(bold), - static_cast(glyphID))); - - return Bitmap::GetImage(*env, *javaBitmap); + return Bitmap::GetImage(*env, + javaObject.Call(*env, + drawGlyphBitmap, + jni::Make(*env, fontFamily), + static_cast(bold), + static_cast(glyphID))); } void LocalGlyphRasterizer::registerNative(jni::JNIEnv& env) { -- cgit v1.2.1