From 434f27a21978a7d26703d3e0d74e46ddd6a9d6e1 Mon Sep 17 00:00:00 2001 From: Matt Blair Date: Mon, 14 Dec 2020 15:12:51 -0500 Subject: [PATCH] Don't throw when native pointers have long values < 0 (#2217) * Don't throw when native pointers have long values < 0 Android 11 and certain ROMs use "tagged pointers" that set the high bits on pointers, causing them to become negative as a long. * Fix more pointer check comparisons in MapController --- .../java/com/mapzen/tangram/MapController.java | 14 ++++---------- .../src/main/java/com/mapzen/tangram/MapData.java | 2 +- .../main/java/com/mapzen/tangram/NativeMap.java | 2 +- 3 files changed, 6 insertions(+), 12 deletions(-) diff --git a/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapController.java b/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapController.java index 4109541f12..f0127a1428 100644 --- a/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapController.java +++ b/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapController.java @@ -670,7 +670,7 @@ public MapData addDataLayer(final String name, final boolean generateCentroid) { return mapData; } final long pointer = nativeMap.addClientDataSource(name, generateCentroid); - if (pointer <= 0) { + if (pointer == 0) { throw new RuntimeException("Unable to create new data source"); } mapData = new MapData(name, pointer, this); @@ -684,7 +684,9 @@ public MapData addDataLayer(final String name, final boolean generateCentroid) { */ void removeDataLayer(@NonNull final MapData mapData) { clientTileSources.remove(mapData.name); - checkPointer(mapData.pointer); + if (mapData.pointer == 0) { + throw new RuntimeException("Tried to remove a MapData that was already disposed"); + } nativeMap.removeClientDataSource(mapData.pointer); } @@ -1083,14 +1085,6 @@ void onLowMemory() { nativeMap.onLowMemory(); } - void checkPointer(final long ptr) { - if (ptr <= 0) { - throw new RuntimeException("Tried to perform an operation on an invalid pointer!" - + " This means you may have used an object that has been disposed and is no" - + " longer valid."); - } - } - void checkId(final long id) { if (id <= 0) { throw new RuntimeException("Tried to perform an operation on an invalid id!" diff --git a/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapData.java b/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapData.java index abeb8b0b3b..e2fac5b6e3 100644 --- a/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapData.java +++ b/platforms/android/tangram/src/main/java/com/mapzen/tangram/MapData.java @@ -92,7 +92,7 @@ public void clear() { } private void checkPointer(final long ptr) { - if (ptr <= 0) { + if (ptr == 0) { throw new RuntimeException("Tried to perform an operation on an invalid pointer!" + " This means you may have used a MapData that has already been removed."); } diff --git a/platforms/android/tangram/src/main/java/com/mapzen/tangram/NativeMap.java b/platforms/android/tangram/src/main/java/com/mapzen/tangram/NativeMap.java index 5725b9721c..46f023fd79 100644 --- a/platforms/android/tangram/src/main/java/com/mapzen/tangram/NativeMap.java +++ b/platforms/android/tangram/src/main/java/com/mapzen/tangram/NativeMap.java @@ -9,7 +9,7 @@ class NativeMap { NativeMap(MapController mapController, AssetManager assetManager) { nativePointer = init(mapController, assetManager); - if (nativePointer <= 0) { + if (nativePointer == 0) { throw new RuntimeException("Unable to create a native Map object! There may be insufficient memory available."); } }