core: Add error reporting for corrupted symbols (#4458)

This commit is contained in:
Adrian Cojocaru
2026-08-11 19:20:59 +03:00
committed by GitHub
parent 7f430aa624
commit d9664ee187
39 changed files with 331 additions and 29 deletions

View File

@@ -54,6 +54,10 @@ public:
delegate.invoke(&RendererObserver::onRemoveUnusedStyleImages, ids);
}
void onSymbolError(const std::string& message) override {
delegate.invoke(&RendererObserver::onSymbolError, message);
}
void onPreCompileShader(mbgl::shaders::BuiltIn id,
mbgl::gfx::Backend::Type type,
const std::string& additionalDefines) override {

View File

@@ -1737,5 +1737,17 @@ void NativeMapView::onRenderError(std::exception_ptr) {
}
}
void NativeMapView::onSymbolError(const std::string& message) {
assert(vm != nullptr);
android::UniqueEnv _env = android::AttachEnv();
static auto& javaClass = jni::Class<NativeMapView>::Singleton(*_env);
static auto onSymbolError = javaClass.GetMethod<void(jni::String)>(*_env, "onSymbolError");
auto weakReference = javaPeer.get(*_env);
if (weakReference) {
weakReference.Call(*_env, onSymbolError, jni::Make<jni::String>(*_env, message));
}
}
} // namespace android
} // namespace mbgl

View File

@@ -367,6 +367,8 @@ public:
// Renderer
void onRenderError(std::exception_ptr) override;
void onSymbolError(const std::string&) override;
private:
std::shared_ptr<AndroidRendererFrontend> rendererFrontend;

View File

@@ -60,6 +60,8 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
= new CopyOnWriteArrayList<>();
private final List<MapView.OnRenderErrorListener> onRenderErrorList
= new CopyOnWriteArrayList<>();
private final List<MapView.OnSymbolErrorListener> onSymbolErrorList
= new CopyOnWriteArrayList<>();
@Override
public void onCameraWillChange(boolean animated) {
@@ -440,6 +442,17 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
}
}
@Override
public void onSymbolError(String message) {
try {
for (MapView.OnSymbolErrorListener listener : onSymbolErrorList) {
listener.onSymbolError(message);
}
} catch (Throwable err) {
Logger.e(TAG, "Exception in onSymbolError", err);
}
}
void addOnCameraWillChangeListener(MapView.OnCameraWillChangeListener listener) {
onCameraWillChangeListenerList.add(listener);
}
@@ -612,6 +625,10 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
onRenderErrorList.add(callback);
}
public void addOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
onSymbolErrorList.add(callback);
}
public void removeOnPreCompileShaderListener(MapView.OnPreCompileShaderListener callback) {
onPreCompileShaderList.remove(callback);
}
@@ -656,6 +673,10 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
onRenderErrorList.remove(callback);
}
public void removeOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
onSymbolErrorList.remove(callback);
}
void clear() {
onCameraWillChangeListenerList.clear();
onCameraIsChangingListenerList.clear();
@@ -683,5 +704,6 @@ class MapChangeReceiver implements NativeMapView.StateCallback {
onSpriteErrorList.clear();
onSpriteRequestedList.clear();
onRenderErrorList.clear();
onSymbolErrorList.clear();
}
}

View File

@@ -1121,6 +1121,19 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
mapChangeReceiver.removeOnRenderErrorListener(callback);
}
/**
* Set a callback that's invoked after a corrupted symbol is detected
*
* @param listener The callback that's invoked
*/
public void addOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
mapChangeReceiver.addOnSymbolErrorListener(callback);
}
public void removeOnSymbolErrorListener(MapView.OnSymbolErrorListener callback) {
mapChangeReceiver.removeOnSymbolErrorListener(callback);
}
/**
* Interface definition for a callback to be invoked when the camera will change.
* <p>
@@ -1549,6 +1562,19 @@ public class MapView extends FrameLayout implements NativeMapView.ViewCallback {
void onRenderError();
}
/**
* Interface definition for a callback to be invoked after a corrupted symbol is detected
* <p>
* {@link MapView#addOnSymbolErrorListener(OnSymbolErrorListener)}
* </p>
*/
public interface OnSymbolErrorListener {
/**
* Called when a corrupted symbol is detected.
*/
void onSymbolError(@NonNull String message);
}
/**
* Sets a callback object which will be triggered when the {@link MapLibreMap} instance is ready to be used.
*

View File

@@ -1430,6 +1430,13 @@ final class NativeMapView implements NativeMap {
}
}
@Keep
private void onSymbolError(String message) {
if (stateCallback != null) {
stateCallback.onSymbolError(message);
}
}
//
// JNI methods
//
@@ -1938,5 +1945,7 @@ final class NativeMapView implements NativeMap {
void onSpriteRequested(String id, String url);
void onRenderError();
void onSymbolError(String message);
}
}