fix(android): guard stale layer remove path (#4300)
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1154,11 +1154,20 @@ jni::jboolean NativeMapView::removeLayerAt(JNIEnv& env, jni::jint index) {
|
||||
/**
|
||||
* Remove with wrapper object id. Ownership is transferred back to the wrapper
|
||||
*/
|
||||
jni::jboolean NativeMapView::removeLayer(JNIEnv&, jlong layerPtr) {
|
||||
assert(layerPtr != 0);
|
||||
jni::jboolean NativeMapView::removeLayer(JNIEnv& env, jlong layerPtr) {
|
||||
if (layerPtr == 0) {
|
||||
Log::Warning(Event::JNI, "Cannot remove layer: native layer pointer is null");
|
||||
return jni::jni_false;
|
||||
}
|
||||
|
||||
mbgl::android::Layer* layer = reinterpret_cast<mbgl::android::Layer*>(layerPtr);
|
||||
std::unique_ptr<mbgl::style::Layer> coreLayer = map->getStyle().removeLayer(layer->get().getID());
|
||||
const auto layerId = jni::Make<std::string>(env, layer->getId(env));
|
||||
if (layerId.empty()) {
|
||||
Log::Warning(Event::JNI, "Cannot remove layer: layer reference is detached or invalid");
|
||||
return jni::jni_false;
|
||||
}
|
||||
|
||||
std::unique_ptr<mbgl::style::Layer> coreLayer = map->getStyle().removeLayer(layerId);
|
||||
if (coreLayer) {
|
||||
layer->setLayer(std::move(coreLayer));
|
||||
return jni::jni_true;
|
||||
|
||||
@@ -1000,7 +1000,17 @@ final class NativeMapView implements NativeMap {
|
||||
if (checkState("removeLayer")) {
|
||||
return false;
|
||||
}
|
||||
return nativeRemoveLayer(layer.getNativePtr());
|
||||
if (layer.isDetached()) {
|
||||
Logger.w(TAG, "Ignoring removeLayer() call on detached layer reference.");
|
||||
return false;
|
||||
}
|
||||
|
||||
final long nativePtr = layer.getNativePtr();
|
||||
if (nativePtr == 0L) {
|
||||
Logger.w(TAG, "Ignoring removeLayer() call on released layer pointer.");
|
||||
return false;
|
||||
}
|
||||
return nativeRemoveLayer(nativePtr);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user