diff options
Diffstat (limited to 'platform/android/src/offline')
10 files changed, 114 insertions, 259 deletions
diff --git a/platform/android/src/offline/offline_manager.cpp b/platform/android/src/offline/offline_manager.cpp index e96ed7e4d2..263f7b9d8b 100644 --- a/platform/android/src/offline/offline_manager.cpp +++ b/platform/android/src/offline/offline_manager.cpp @@ -24,8 +24,8 @@ void OfflineManager::listOfflineRegions(jni::JNIEnv& env_, jni::Object<FileSourc // list regions 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<jni::jobject>(callback_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()), - jFileSource = std::shared_ptr<jni::jobject>(jFileSource_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()) + callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()), + jFileSource = std::shared_ptr<jni::jobject>(jFileSource_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) ](mbgl::expected<mbgl::OfflineRegions, std::exception_ptr> regions) mutable { // Reattach, the callback comes from a different thread @@ -58,8 +58,8 @@ void OfflineManager::createOfflineRegion(jni::JNIEnv& env_, // 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<jni::jobject>(callback_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()), - jFileSource = std::shared_ptr<jni::jobject>(jFileSource_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()) + callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()), + jFileSource = std::shared_ptr<jni::jobject>(jFileSource_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) ](mbgl::expected<mbgl::OfflineRegion, std::exception_ptr> region) mutable { // Reattach, the callback comes from a different thread @@ -77,13 +77,11 @@ void OfflineManager::createOfflineRegion(jni::JNIEnv& env_, }); } -jni::Class<OfflineManager> OfflineManager::javaClass; - void OfflineManager::registerNative(jni::JNIEnv& env) { - OfflineManager::ListOfflineRegionsCallback::registerNative(env); - OfflineManager::CreateOfflineRegionCallback::registerNative(env); + jni::Class<ListOfflineRegionsCallback>::Singleton(env); + jni::Class<CreateOfflineRegionCallback>::Singleton(env); - javaClass = *jni::Class<OfflineManager>::Find(env).NewGlobalRef(env).release(); + static auto javaClass = jni::Class<OfflineManager>::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod<decltype(MethodPtr), (MethodPtr)>(name) @@ -101,37 +99,28 @@ void OfflineManager::registerNative(jni::JNIEnv& env) { void OfflineManager::ListOfflineRegionsCallback::onError(jni::JNIEnv& env, jni::Object<OfflineManager::ListOfflineRegionsCallback> callback, std::exception_ptr error) { + static auto javaClass = jni::Class<OfflineManager::ListOfflineRegionsCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::String)>(env, "onError"); - std::string message = mbgl::util::toString(error); - auto jmessage = jni::Make<jni::String>(env, message); - callback.Call(env, method, jmessage); - jni::DeleteLocalRef(env, jmessage); + + callback.Call(env, method, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, mbgl::util::toString(error)))); } void OfflineManager::ListOfflineRegionsCallback::onList(jni::JNIEnv& env, jni::Object<FileSource> jFileSource, jni::Object<OfflineManager::ListOfflineRegionsCallback> callback, mbgl::optional<std::vector<mbgl::OfflineRegion>> regions) { - //Convert the regions to java peer objects + static auto javaClass = jni::Class<OfflineManager::ListOfflineRegionsCallback>::Singleton(env); + static auto method = javaClass.GetMethod<void (jni::Array<jni::Object<OfflineRegion>>)>(env, "onList"); + std::size_t index = 0; - auto jregions = jni::Array<jni::Object<OfflineRegion>>::New(env, regions->size(), OfflineRegion::javaClass); + auto jregions = jni::SeizeLocal(env, jni::Array<jni::Object<OfflineRegion>>::New(env, regions->size())); for (auto& region : *regions) { - auto jregion = OfflineRegion::New(env, jFileSource, std::move(region)); - jregions.Set(env, index, jregion); - jni::DeleteLocalRef(env, jregion); + jregions->Set(env, index, *jni::SeizeLocal(env, OfflineRegion::New(env, jFileSource, std::move(region)))); index++; } - // Trigger callback - static auto method = javaClass.GetMethod<void (jni::Array<jni::Object<OfflineRegion>>)>(env, "onList"); - callback.Call(env, method, jregions); - jni::DeleteLocalRef(env, jregions); -} - -jni::Class<OfflineManager::ListOfflineRegionsCallback> OfflineManager::ListOfflineRegionsCallback::javaClass; - -void OfflineManager::ListOfflineRegionsCallback::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineManager::ListOfflineRegionsCallback>::Find(env).NewGlobalRef(env).release(); + callback.Call(env, method, *jregions); } // OfflineManager::CreateOfflineRegionCallback // @@ -139,30 +128,22 @@ void OfflineManager::ListOfflineRegionsCallback::registerNative(jni::JNIEnv& env void OfflineManager::CreateOfflineRegionCallback::onError(jni::JNIEnv& env, jni::Object<OfflineManager::CreateOfflineRegionCallback> callback, std::exception_ptr error) { + static auto javaClass = jni::Class<OfflineManager::CreateOfflineRegionCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::String)>(env, "onError"); - std::string message = mbgl::util::toString(error); - auto jmessage = jni::Make<jni::String>(env, message); - callback.Call(env, method, jmessage); - jni::DeleteLocalRef(env, jmessage); + + callback.Call(env, method, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, mbgl::util::toString(error)))); } void OfflineManager::CreateOfflineRegionCallback::onCreate(jni::JNIEnv& env, jni::Object<FileSource> jFileSource, jni::Object<OfflineManager::CreateOfflineRegionCallback> callback, mbgl::optional<mbgl::OfflineRegion> region) { - // Convert the region to java peer object - auto jregion = OfflineRegion::New(env, jFileSource, std::move(*region)); - - // Trigger callback + static auto javaClass = jni::Class<OfflineManager::CreateOfflineRegionCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::Object<OfflineRegion>)>(env, "onCreate"); - callback.Call(env, method, jregion); - jni::DeleteLocalRef(env, jregion); -} - -jni::Class<OfflineManager::CreateOfflineRegionCallback> OfflineManager::CreateOfflineRegionCallback::javaClass; -void OfflineManager::CreateOfflineRegionCallback::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineManager::CreateOfflineRegionCallback>::Find(env).NewGlobalRef(env).release(); + callback.Call(env, method, + *jni::SeizeLocal(env, 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 9ae2714ca2..43f5045c71 100644 --- a/platform/android/src/offline/offline_manager.hpp +++ b/platform/android/src/offline/offline_manager.hpp @@ -26,10 +26,6 @@ public: jni::Object<FileSource>, jni::Object<OfflineManager::ListOfflineRegionsCallback>, mbgl::optional<std::vector<mbgl::OfflineRegion>>); - - static jni::Class<OfflineManager::ListOfflineRegionsCallback> javaClass; - - static void registerNative(jni::JNIEnv&); }; class CreateOfflineRegionCallback { @@ -42,16 +38,10 @@ public: jni::Object<FileSource>, jni::Object<OfflineManager::CreateOfflineRegionCallback>, mbgl::optional<mbgl::OfflineRegion>); - - static jni::Class<OfflineManager::CreateOfflineRegionCallback> javaClass; - - static void registerNative(jni::JNIEnv&); }; static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineManager"; }; - static jni::Class<OfflineManager> javaClass; - static void registerNative(jni::JNIEnv&); OfflineManager(jni::JNIEnv&, jni::Object<FileSource>); diff --git a/platform/android/src/offline/offline_region.cpp b/platform/android/src/offline/offline_region.cpp index 5ed37eda73..949377e221 100644 --- a/platform/android/src/offline/offline_region.cpp +++ b/platform/android/src/offline/offline_region.cpp @@ -25,9 +25,9 @@ void OfflineRegion::setOfflineRegionObserver(jni::JNIEnv& env_, jni::Object<Offl // Define the observer class Observer : public mbgl::OfflineRegionObserver { public: - Observer(jni::UniqueObject<OfflineRegion::OfflineRegionObserver>&& callback_) + Observer(jni::Global<jni::Object<OfflineRegion::OfflineRegionObserver>>&& callback_) //TODO add a generic deleter for jni::Object - : callback(callback_.release()->Get()) { + : callback(callback_.release().Get()) { } ~Observer() override { @@ -39,41 +39,31 @@ void OfflineRegion::setOfflineRegionObserver(jni::JNIEnv& env_, jni::Object<Offl // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); - // Status object - auto jStatus = OfflineRegionStatus::New(*env, status); + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionObserver>::Singleton(*env); + static auto method = javaClass.GetMethod<void (jni::Object<OfflineRegionStatus>)>(*env, "onStatusChanged"); - // Call - static auto method = OfflineRegion::OfflineRegionObserver::javaClass - .GetMethod<void (jni::Object<OfflineRegionStatus>)>(*env, "onStatusChanged"); - callback.Call(*env, method, jStatus); - - // Delete references - jni::DeleteLocalRef(*env, jStatus); + callback.Call(*env, method, + *jni::SeizeLocal(*env, OfflineRegionStatus::New(*env, status))); } void responseError(mbgl::Response::Error error) override { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); - // Error object - auto jError = OfflineRegionError::New(*env, error); - - // Call - static auto method = OfflineRegion::OfflineRegionObserver::javaClass - .GetMethod<void (jni::Object<mbgl::android::OfflineRegionError>)>(*env, "onError"); - callback.Call(*env, method, jError); + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionObserver>::Singleton(*env); + static auto method = javaClass.GetMethod<void (jni::Object<mbgl::android::OfflineRegionError>)>(*env, "onError"); - // Delete references - jni::DeleteLocalRef(*env, jError); + callback.Call(*env, method, + *jni::SeizeLocal(*env, OfflineRegionError::New(*env, error))); } void mapboxTileCountLimitExceeded(uint64_t limit) override { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); - // Send limit - static auto method = OfflineRegion::OfflineRegionObserver::javaClass - .GetMethod<void (jni::jlong)>(*env, "mapboxTileCountLimitExceeded"); + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionObserver>::Singleton(*env); + static auto method = javaClass.GetMethod<void (jni::jlong)>(*env, "mapboxTileCountLimitExceeded"); + callback.Call(*env, method, jlong(limit)); } @@ -106,7 +96,7 @@ void OfflineRegion::getOfflineRegionStatus(jni::JNIEnv& env_, jni::Object<Offlin fileSource.getOfflineRegionStatus(*region, [ //Ensure the object is not gc'd in the meanwhile - callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()) + callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) ](mbgl::expected<mbgl::OfflineRegionStatus, std::exception_ptr> status) mutable { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); @@ -123,7 +113,7 @@ void OfflineRegion::deleteOfflineRegion(jni::JNIEnv& env_, jni::Object<OfflineRe // Delete fileSource.deleteOfflineRegion(std::move(*region), [ //Ensure the object is not gc'd in the meanwhile - callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()) + callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) ](std::exception_ptr error) mutable { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); @@ -143,7 +133,7 @@ void OfflineRegion::updateOfflineRegionMetadata(jni::JNIEnv& env_, jni::Array<jn fileSource.updateOfflineMetadata(region->getID(), metadata, [ //Ensure the object is not gc'd in the meanwhile - callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release()->Get(), GenericGlobalRefDeleter()) + callback = std::shared_ptr<jni::jobject>(callback_.NewGlobalRef(env_).release().Get(), GenericGlobalRefDeleter()) ](mbgl::expected<mbgl::OfflineRegionMetadata, std::exception_ptr> data) mutable { // Reattach, the callback comes from a different thread android::UniqueEnv env = android::AttachEnv(); @@ -159,29 +149,25 @@ void OfflineRegion::updateOfflineRegionMetadata(jni::JNIEnv& env_, jni::Array<jn jni::Object<OfflineRegion> OfflineRegion::New(jni::JNIEnv& env, jni::Object<FileSource> jFileSource, mbgl::OfflineRegion region) { // Definition - auto definition = region.getDefinition().match( + auto definition = jni::SeizeLocal(env, region.getDefinition().match( [&](const mbgl::OfflineTilePyramidRegionDefinition def) { return jni::Object<OfflineRegionDefinition>( *OfflineTilePyramidRegionDefinition::New(env, def)); }, [&](const mbgl::OfflineGeometryRegionDefinition def) { return jni::Object<OfflineRegionDefinition>( *OfflineGeometryRegionDefinition::New(env, def)); - }); - - // Metadata - auto metadata = OfflineRegion::metadata(env, region.getMetadata()); + })); // Create region java object - static auto constructor = OfflineRegion::javaClass.GetConstructor<jni::jlong, jni::Object<FileSource>, jni::jlong, jni::Object<OfflineRegionDefinition>, jni::Array<jni::jbyte>>(env); - auto jregion = OfflineRegion::javaClass.New(env, constructor, - reinterpret_cast<jni::jlong>(new mbgl::OfflineRegion(std::move(region))), //Copy a region to the heap - jFileSource, jni::jlong(region.getID()), definition, metadata); - - //Delete references - jni::DeleteLocalRef(env, definition); - jni::DeleteLocalRef(env, metadata); + static auto javaClass = jni::Class<OfflineRegion>::Singleton(env); + static auto constructor = javaClass.GetConstructor<jni::jlong, jni::Object<FileSource>, jni::jlong, jni::Object<OfflineRegionDefinition>, jni::Array<jni::jbyte>>(env); - return jregion; + return javaClass.New(env, constructor, + reinterpret_cast<jni::jlong>(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()))); } jni::Array<jni::jbyte> OfflineRegion::metadata(jni::JNIEnv& env, mbgl::OfflineRegionMetadata metadata_) { @@ -201,15 +187,13 @@ mbgl::OfflineRegionMetadata OfflineRegion::metadata(jni::JNIEnv& env, jni::Array return metadata; } -jni::Class<OfflineRegion> OfflineRegion::javaClass; - void OfflineRegion::registerNative(jni::JNIEnv& env) { - OfflineRegion::OfflineRegionObserver::registerNative(env); - OfflineRegion::OfflineRegionStatusCallback::registerNative(env); - OfflineRegion::OfflineRegionDeleteCallback::registerNative(env); - OfflineRegion::OfflineRegionUpdateMetadataCallback::registerNative(env); + jni::Class<OfflineRegionObserver>::Singleton(env); + jni::Class<OfflineRegionStatusCallback>::Singleton(env); + jni::Class<OfflineRegionDeleteCallback>::Singleton(env); + jni::Class<OfflineRegionUpdateMetadataCallback>::Singleton(env); - javaClass = *jni::Class<OfflineRegion>::Find(env).NewGlobalRef(env).release(); + static auto javaClass = jni::Class<OfflineRegion>::Singleton(env); #define METHOD(MethodPtr, name) jni::MakeNativePeerMethod<decltype(MethodPtr), (MethodPtr)>(name) @@ -227,94 +211,68 @@ void OfflineRegion::registerNative(jni::JNIEnv& env) { // OfflineRegionObserver // -jni::Class<OfflineRegion::OfflineRegionObserver> OfflineRegion::OfflineRegionObserver::javaClass; - -void OfflineRegion::OfflineRegionObserver::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegion::OfflineRegionObserver>::Find(env).NewGlobalRef(env).release(); -} - // OfflineRegionStatusCallback // -jni::Class<OfflineRegion::OfflineRegionStatusCallback> OfflineRegion::OfflineRegionStatusCallback::javaClass; - -void OfflineRegion::OfflineRegionStatusCallback::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegionStatusCallback>::Find(env).NewGlobalRef(env).release(); -} - void OfflineRegion::OfflineRegionStatusCallback::onError(jni::JNIEnv& env, jni::Object<OfflineRegion::OfflineRegionStatusCallback> callback, std::exception_ptr error) { + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionStatusCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::String)>(env, "onError"); - std::string message = mbgl::util::toString(error); - auto jmessage = jni::Make<jni::String>(env, message); - callback.Call(env, method, jmessage); - jni::DeleteLocalRef(env, jmessage); + + callback.Call(env, method, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, mbgl::util::toString(error)))); } void OfflineRegion::OfflineRegionStatusCallback::onStatus(jni::JNIEnv& env, jni::Object<OfflineRegion::OfflineRegionStatusCallback> callback, mbgl::optional<mbgl::OfflineRegionStatus> status) { - //Convert to java peer object - auto jStatus = OfflineRegionStatus::New(env, std::move(*status)); - - // Trigger callback + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionStatusCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::Object<OfflineRegionStatus>)>(env, "onStatus"); - callback.Call(env, method, jStatus); - jni::DeleteLocalRef(env, jStatus); + + callback.Call(env, method, + *jni::SeizeLocal(env, OfflineRegionStatus::New(env, std::move(*status)))); } // OfflineRegionDeleteCallback // -jni::Class<OfflineRegion::OfflineRegionDeleteCallback> OfflineRegion::OfflineRegionDeleteCallback::javaClass; - -void OfflineRegion::OfflineRegionDeleteCallback::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegionDeleteCallback>::Find(env).NewGlobalRef(env).release(); -} - void OfflineRegion::OfflineRegionDeleteCallback::onError(jni::JNIEnv& env, jni::Object<OfflineRegion::OfflineRegionDeleteCallback> callback, std::exception_ptr error) { + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionDeleteCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::String)>(env, "onError"); - std::string message = mbgl::util::toString(error); - auto jmessage = jni::Make<jni::String>(env, message); - callback.Call(env, method, jmessage); - jni::DeleteLocalRef(env, jmessage); + + callback.Call(env, method, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, mbgl::util::toString(error)))); } void OfflineRegion::OfflineRegionDeleteCallback::onDelete(jni::JNIEnv& env, jni::Object<OfflineRegion::OfflineRegionDeleteCallback> callback) { // Trigger callback + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionDeleteCallback>::Singleton(env); static auto method = javaClass.GetMethod<void ()>(env, "onDelete"); + callback.Call(env, method); } // OfflineRegionUpdateMetadataCallback // -jni::Class<OfflineRegion::OfflineRegionUpdateMetadataCallback> OfflineRegion::OfflineRegionUpdateMetadataCallback::javaClass; - -void OfflineRegion::OfflineRegionUpdateMetadataCallback::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegionUpdateMetadataCallback>::Find(env).NewGlobalRef(env).release(); -} - void OfflineRegion::OfflineRegionUpdateMetadataCallback::onError(jni::JNIEnv& env, jni::Object<OfflineRegion::OfflineRegionUpdateMetadataCallback> callback, std::exception_ptr error) { + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionUpdateMetadataCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::String)>(env, "onError"); - std::string message = mbgl::util::toString(error); - auto jmessage = jni::Make<jni::String>(env, message); - callback.Call(env, method, jmessage); - jni::DeleteLocalRef(env, jmessage); + + callback.Call(env, method, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, mbgl::util::toString(error)))); } void OfflineRegion::OfflineRegionUpdateMetadataCallback::onUpdate(jni::JNIEnv& env, jni::Object<OfflineRegion::OfflineRegionUpdateMetadataCallback> callback, mbgl::optional<mbgl::OfflineRegionMetadata> metadata) { - //Convert to java peer object - auto jMetadata = OfflineRegion::metadata(env, std::move(*metadata)); - - // Trigger callback + static auto javaClass = jni::Class<OfflineRegion::OfflineRegionUpdateMetadataCallback>::Singleton(env); static auto method = javaClass.GetMethod<void (jni::Array<jni::jbyte>)>(env, "onUpdate"); - callback.Call(env, method, jMetadata); - jni::DeleteLocalRef(env, jMetadata); + + callback.Call(env, method, + *jni::SeizeLocal(env, 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 c05383a91a..11aecb82a9 100644 --- a/platform/android/src/offline/offline_region.hpp +++ b/platform/android/src/offline/offline_region.hpp @@ -15,10 +15,6 @@ public: class OfflineRegionObserver { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegion$OfflineRegionObserver"; }; - - static jni::Class<OfflineRegionObserver> javaClass; - - static void registerNative(jni::JNIEnv&); }; class OfflineRegionStatusCallback { @@ -30,10 +26,6 @@ public: static void onStatus(jni::JNIEnv&, jni::Object<OfflineRegionStatusCallback>, mbgl::optional<mbgl::OfflineRegionStatus>); - - static jni::Class<OfflineRegionStatusCallback> javaClass; - - static void registerNative(jni::JNIEnv&); }; class OfflineRegionDeleteCallback { @@ -43,10 +35,6 @@ public: static void onError(jni::JNIEnv&, jni::Object<OfflineRegionDeleteCallback>, std::exception_ptr); static void onDelete(jni::JNIEnv&, jni::Object<OfflineRegionDeleteCallback>); - - static jni::Class<OfflineRegionDeleteCallback> javaClass; - - static void registerNative(jni::JNIEnv&); }; class OfflineRegionUpdateMetadataCallback { @@ -58,10 +46,6 @@ public: static void onUpdate(jni::JNIEnv&, jni::Object<OfflineRegionUpdateMetadataCallback>, mbgl::optional<mbgl::OfflineRegionMetadata>); - - static jni::Class<OfflineRegionUpdateMetadataCallback> javaClass; - - static void registerNative(jni::JNIEnv&); }; static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegion"; }; @@ -86,8 +70,6 @@ public: static mbgl::OfflineRegionMetadata metadata(jni::JNIEnv&, jni::Array<jni::jbyte>); - static jni::Class<OfflineRegion> javaClass; - static void registerNative(jni::JNIEnv&); private: diff --git a/platform/android/src/offline/offline_region_definition.cpp b/platform/android/src/offline/offline_region_definition.cpp index a856672902..2a69181f5b 100644 --- a/platform/android/src/offline/offline_region_definition.cpp +++ b/platform/android/src/offline/offline_region_definition.cpp @@ -10,18 +10,15 @@ namespace android { // OfflineRegionDefinition // -jni::Class<OfflineRegionDefinition> OfflineRegionDefinition::javaClass; - void OfflineRegionDefinition::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegionDefinition>::Find(env).NewGlobalRef(env).release(); + jni::Class<OfflineRegionDefinition>::Singleton(env); } mbgl::OfflineRegionDefinition OfflineRegionDefinition::getDefinition(JNIEnv& env, jni::Object<OfflineRegionDefinition> jDefinition) { - - if (jDefinition.IsInstanceOf(env, OfflineTilePyramidRegionDefinition::javaClass)) { + if (jDefinition.IsInstanceOf(env, jni::Class<OfflineTilePyramidRegionDefinition>::Singleton(env))) { return OfflineTilePyramidRegionDefinition::getDefinition(env, jni::Object<OfflineTilePyramidRegionDefinition>(*jDefinition)); - } else if (jDefinition.IsInstanceOf(env, OfflineGeometryRegionDefinition::javaClass)) { + } else if (jDefinition.IsInstanceOf(env, jni::Class<OfflineGeometryRegionDefinition>::Singleton(env))) { return OfflineGeometryRegionDefinition::getDefinition(env, jni::Object<OfflineGeometryRegionDefinition>(*jDefinition)); } @@ -31,104 +28,73 @@ mbgl::OfflineRegionDefinition OfflineRegionDefinition::getDefinition(JNIEnv& env // OfflineTilePyramidRegionDefinition // jni::Object<OfflineTilePyramidRegionDefinition> OfflineTilePyramidRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineTilePyramidRegionDefinition& definition) { - - //Convert objects - auto styleURL = jni::Make<jni::String>(env, definition.styleURL); - auto bounds = LatLngBounds::New(env, definition.bounds); - + static auto javaClass = jni::Class<OfflineTilePyramidRegionDefinition>::Singleton(env); static auto constructor = javaClass.GetConstructor<jni::String, jni::Object<LatLngBounds>, jni::jdouble, jni::jdouble, jni::jfloat>(env); - auto jdefinition = javaClass.New(env, constructor, styleURL, bounds, definition.minZoom, definition.maxZoom, definition.pixelRatio); - - //Delete References - jni::DeleteLocalRef(env, styleURL); - jni::DeleteLocalRef(env, bounds); - return jdefinition; + return javaClass.New(env, constructor, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, definition.styleURL)), + *jni::SeizeLocal(env, LatLngBounds::New(env, definition.bounds)), + definition.minZoom, + definition.maxZoom, + definition.pixelRatio); } mbgl::OfflineTilePyramidRegionDefinition OfflineTilePyramidRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object<OfflineTilePyramidRegionDefinition> jDefinition) { // Field references + static auto javaClass = jni::Class<OfflineTilePyramidRegionDefinition>::Singleton(env); static auto styleURLF = javaClass.GetField<jni::String>(env, "styleURL"); static auto boundsF = javaClass.GetField<jni::Object<LatLngBounds>>(env, "bounds"); static auto minZoomF = javaClass.GetField<jni::jdouble>(env, "minZoom"); static auto maxZoomF = javaClass.GetField<jni::jdouble>(env, "maxZoom"); static auto pixelRatioF = javaClass.GetField<jni::jfloat>(env, "pixelRatio"); - // Get objects - auto jStyleURL = jDefinition.Get(env, styleURLF); - auto jBounds = jDefinition.Get(env, boundsF); - - // Create definition - mbgl::OfflineTilePyramidRegionDefinition definition( - jni::Make<std::string>(env, jStyleURL), - LatLngBounds::getLatLngBounds(env, jBounds), + return mbgl::OfflineTilePyramidRegionDefinition( + jni::Make<std::string>(env, *jni::SeizeLocal(env, jDefinition.Get(env, styleURLF))), + LatLngBounds::getLatLngBounds(env, *jni::SeizeLocal(env, jDefinition.Get(env, boundsF))), jDefinition.Get(env, minZoomF), jDefinition.Get(env, maxZoomF), jDefinition.Get(env, pixelRatioF) ); - - // Delete references - jni::DeleteLocalRef(env, jStyleURL); - jni::DeleteLocalRef(env, jBounds); - - return definition; } -jni::Class<OfflineTilePyramidRegionDefinition> OfflineTilePyramidRegionDefinition::javaClass; - void OfflineTilePyramidRegionDefinition::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineTilePyramidRegionDefinition>::Find(env).NewGlobalRef(env).release(); + jni::Class<OfflineTilePyramidRegionDefinition>::Singleton(env); } // OfflineGeometryRegionDefinition // jni::Object<OfflineGeometryRegionDefinition> OfflineGeometryRegionDefinition::New(jni::JNIEnv& env, const mbgl::OfflineGeometryRegionDefinition& definition) { - //Convert objects - auto styleURL = jni::Make<jni::String>(env, definition.styleURL); - auto geometry = geojson::Geometry::New(env, definition.geometry); - + static auto javaClass = jni::Class<OfflineGeometryRegionDefinition>::Singleton(env); static auto constructor = javaClass.GetConstructor<jni::String, jni::Object<geojson::Geometry>, jni::jdouble, jni::jdouble, jni::jfloat>(env); - auto jdefinition = javaClass.New(env, constructor, styleURL, geometry, definition.minZoom, definition.maxZoom, definition.pixelRatio); - - //Delete References - jni::DeleteLocalRef(env, styleURL); - jni::DeleteLocalRef(env, geometry); - return jdefinition; + return javaClass.New(env, constructor, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, definition.styleURL)), + *jni::SeizeLocal(env, geojson::Geometry::New(env, definition.geometry)), + definition.minZoom, + definition.maxZoom, + definition.pixelRatio); } mbgl::OfflineGeometryRegionDefinition OfflineGeometryRegionDefinition::getDefinition(jni::JNIEnv& env, jni::Object<OfflineGeometryRegionDefinition> jDefinition) { // Field references + static auto javaClass = jni::Class<OfflineGeometryRegionDefinition>::Singleton(env); static auto styleURLF = javaClass.GetField<jni::String>(env, "styleURL"); static auto geometryF = javaClass.GetField<jni::Object<geojson::Geometry>>(env, "geometry"); static auto minZoomF = javaClass.GetField<jni::jdouble>(env, "minZoom"); static auto maxZoomF = javaClass.GetField<jni::jdouble>(env, "maxZoom"); static auto pixelRatioF = javaClass.GetField<jni::jfloat>(env, "pixelRatio"); - // Get objects - auto jStyleURL = jDefinition.Get(env, styleURLF); - auto jGeometry = jDefinition.Get(env, geometryF); - - // Create definition - mbgl::OfflineGeometryRegionDefinition definition( - jni::Make<std::string>(env, jStyleURL), - geojson::Geometry::convert(env, jGeometry), - jDefinition.Get(env, minZoomF), - jDefinition.Get(env, maxZoomF), - jDefinition.Get(env, pixelRatioF) + return mbgl::OfflineGeometryRegionDefinition( + jni::Make<std::string>(env, *jni::SeizeLocal(env, jDefinition.Get(env, styleURLF))), + geojson::Geometry::convert(env, *jni::SeizeLocal(env, jDefinition.Get(env, geometryF))), + jDefinition.Get(env, minZoomF), + jDefinition.Get(env, maxZoomF), + jDefinition.Get(env, pixelRatioF) ); - - // Delete references - jni::DeleteLocalRef(env, jStyleURL); - jni::DeleteLocalRef(env, jGeometry); - - return definition; } -jni::Class<OfflineGeometryRegionDefinition> OfflineGeometryRegionDefinition::javaClass; - void OfflineGeometryRegionDefinition::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineGeometryRegionDefinition>::Find(env).NewGlobalRef(env).release(); + jni::Class<OfflineGeometryRegionDefinition>::Singleton(env); } } // namespace android diff --git a/platform/android/src/offline/offline_region_definition.hpp b/platform/android/src/offline/offline_region_definition.hpp index a9dfb54634..853cc833bf 100644 --- a/platform/android/src/offline/offline_region_definition.hpp +++ b/platform/android/src/offline/offline_region_definition.hpp @@ -10,8 +10,6 @@ class OfflineRegionDefinition { public: static constexpr auto Name() { return "com/mapbox/mapboxsdk/offline/OfflineRegionDefinition"; }; - static jni::Class<OfflineRegionDefinition> javaClass; - static void registerNative(jni::JNIEnv&); static mbgl::OfflineRegionDefinition getDefinition(JNIEnv& env, jni::Object<OfflineRegionDefinition> jDefinition); @@ -25,10 +23,7 @@ public: static mbgl::OfflineTilePyramidRegionDefinition getDefinition(jni::JNIEnv&, jni::Object<OfflineTilePyramidRegionDefinition>); - static jni::Class<OfflineTilePyramidRegionDefinition> javaClass; - static void registerNative(jni::JNIEnv&); - }; class OfflineGeometryRegionDefinition: public OfflineRegionDefinition { @@ -39,10 +34,7 @@ public: static mbgl::OfflineGeometryRegionDefinition getDefinition(jni::JNIEnv&, jni::Object<OfflineGeometryRegionDefinition>); - static jni::Class<OfflineGeometryRegionDefinition> javaClass; - static void registerNative(jni::JNIEnv&); - }; } // namespace android diff --git a/platform/android/src/offline/offline_region_error.cpp b/platform/android/src/offline/offline_region_error.cpp index b0a19f934f..02432757d4 100644 --- a/platform/android/src/offline/offline_region_error.cpp +++ b/platform/android/src/offline/offline_region_error.cpp @@ -28,25 +28,16 @@ jni::Object<OfflineRegionError> OfflineRegionError::New(jni::JNIEnv& env, mbgl:: break; } - // Convert - auto jReason = jni::Make<jni::String>(env, reason); - auto jMessage = jni::Make<jni::String>(env, error.message); - - // Create java object + static auto javaClass = jni::Class<OfflineRegionError>::Singleton(env); static auto constructor = javaClass.GetConstructor<jni::String, jni::String>(env); - auto jError = javaClass.New(env, constructor, jReason, jMessage); - - // Delete references - jni::DeleteLocalRef(env, jReason); - jni::DeleteLocalRef(env, jMessage); - return jError; + return javaClass.New(env, constructor, + *jni::SeizeLocal(env, jni::Make<jni::String>(env, reason)), + *jni::SeizeLocal(env, jni::Make<jni::String>(env, error.message))); } -jni::Class<OfflineRegionError> OfflineRegionError::javaClass; - void OfflineRegionError::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegionError>::Find(env).NewGlobalRef(env).release(); + jni::Class<OfflineRegionError>::Singleton(env); } } // namespace android diff --git a/platform/android/src/offline/offline_region_error.hpp b/platform/android/src/offline/offline_region_error.hpp index 61efaca67e..c51f08a745 100644 --- a/platform/android/src/offline/offline_region_error.hpp +++ b/platform/android/src/offline/offline_region_error.hpp @@ -12,8 +12,6 @@ public: static jni::Object<OfflineRegionError> New(jni::JNIEnv&, mbgl::Response::Error); - static jni::Class<OfflineRegionError> javaClass; - 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 d0bbae124f..0a415bdb5f 100644 --- a/platform/android/src/offline/offline_region_status.cpp +++ b/platform/android/src/offline/offline_region_status.cpp @@ -17,6 +17,7 @@ jni::Object<OfflineRegionStatus> OfflineRegionStatus::New(jni::JNIEnv& env, mbgl } // Create java object + static auto javaClass = jni::Class<OfflineRegionStatus>::Singleton(env); static auto constructor = javaClass.GetConstructor<jint, jlong, jlong, jlong, jlong, jlong, jboolean>(env); return javaClass.New(env, constructor, downloadState, @@ -29,10 +30,8 @@ jni::Object<OfflineRegionStatus> OfflineRegionStatus::New(jni::JNIEnv& env, mbgl ); } -jni::Class<OfflineRegionStatus> OfflineRegionStatus::javaClass; - void OfflineRegionStatus::registerNative(jni::JNIEnv& env) { - javaClass = *jni::Class<OfflineRegionStatus>::Find(env).NewGlobalRef(env).release(); + jni::Class<OfflineRegionStatus>::Singleton(env); } } // namespace android diff --git a/platform/android/src/offline/offline_region_status.hpp b/platform/android/src/offline/offline_region_status.hpp index b29a653655..9f638e1093 100644 --- a/platform/android/src/offline/offline_region_status.hpp +++ b/platform/android/src/offline/offline_region_status.hpp @@ -12,8 +12,6 @@ public: static jni::Object<OfflineRegionStatus> New(jni::JNIEnv&, mbgl::OfflineRegionStatus status); - static jni::Class<OfflineRegionStatus> javaClass; - static void registerNative(jni::JNIEnv&); }; |