summaryrefslogtreecommitdiff
path: root/platform/android/src/offline
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/src/offline')
-rw-r--r--platform/android/src/offline/offline_manager.cpp67
-rw-r--r--platform/android/src/offline/offline_manager.hpp10
-rw-r--r--platform/android/src/offline/offline_region.cpp148
-rw-r--r--platform/android/src/offline/offline_region.hpp18
-rw-r--r--platform/android/src/offline/offline_region_definition.cpp94
-rw-r--r--platform/android/src/offline/offline_region_definition.hpp8
-rw-r--r--platform/android/src/offline/offline_region_error.cpp19
-rw-r--r--platform/android/src/offline/offline_region_error.hpp2
-rw-r--r--platform/android/src/offline/offline_region_status.cpp5
-rw-r--r--platform/android/src/offline/offline_region_status.hpp2
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&);
};