diff options
Diffstat (limited to 'platform/android/src/offline/offline_region.cpp')
-rw-r--r-- | platform/android/src/offline/offline_region.cpp | 148 |
1 files changed, 53 insertions, 95 deletions
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 |