graphhopper: Android: Clean mapped byte buffers fails
On Android the clean of mapped byte buffers fails with:
Caused by: java.lang.RuntimeException: unable to unmap the mapped buffer
at com.graphhopper.util.Helper.cleanMappedByteBuffer(Helper.java:426)
at com.graphhopper.storage.MMapDataAccess.clean(MMapDataAccess.java:356)
at com.graphhopper.storage.MMapDataAccess.close(MMapDataAccess.java:257)
at com.graphhopper.storage.MMapDataAccess.close(MMapDataAccess.java:249)
at com.graphhopper.storage.StorableProperties.close(StorableProperties.java:113)
at com.graphhopper.storage.GraphHopperStorage.close(GraphHopperStorage.java:277)
at com.graphhopper.GraphHopper.close(GraphHopper.java:1226)
at com.graphhopper.android.MainActivity.onDestroy(MainActivity.java:170)
at android.app.Activity.performDestroy(Activity.java:6881)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1153)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4190)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221)
at android.app.ActivityThread.-wrap6(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1538)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.security.PrivilegedActionException: java.lang.NoSuchMethodException: free []
at java.security.AccessController.doPrivileged(AccessController.java:71)
at com.graphhopper.util.Helper.cleanMappedByteBuffer(Helper.java:370)
at com.graphhopper.storage.MMapDataAccess.clean(MMapDataAccess.java:356)
at com.graphhopper.storage.MMapDataAccess.close(MMapDataAccess.java:257)
at com.graphhopper.storage.MMapDataAccess.close(MMapDataAccess.java:249)
at com.graphhopper.storage.StorableProperties.close(StorableProperties.java:113)
at com.graphhopper.storage.GraphHopperStorage.close(GraphHopperStorage.java:277)
at com.graphhopper.GraphHopper.close(GraphHopper.java:1226)
at com.graphhopper.android.MainActivity.onDestroy(MainActivity.java:170)
at android.app.Activity.performDestroy(Activity.java:6881)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1153)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4190)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221)
at android.app.ActivityThread.-wrap6(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1538)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.NoSuchMethodException: free []
at java.lang.Class.getMethod(Class.java:1981)
at java.lang.Class.getMethod(Class.java:1637)
at com.graphhopper.util.Helper$1.run(Helper.java:377)
at java.security.AccessController.doPrivileged(AccessController.java:67)
at com.graphhopper.util.Helper.cleanMappedByteBuffer(Helper.java:370)
at com.graphhopper.storage.MMapDataAccess.clean(MMapDataAccess.java:356)
at com.graphhopper.storage.MMapDataAccess.close(MMapDataAccess.java:257)
at com.graphhopper.storage.MMapDataAccess.close(MMapDataAccess.java:249)
at com.graphhopper.storage.StorableProperties.close(StorableProperties.java:113)
at com.graphhopper.storage.GraphHopperStorage.close(GraphHopperStorage.java:277)
at com.graphhopper.GraphHopper.close(GraphHopper.java:1226)
at com.graphhopper.android.MainActivity.onDestroy(MainActivity.java:170)
at android.app.Activity.performDestroy(Activity.java:6881)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1153)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4190)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4221)
at android.app.ActivityThread.-wrap6(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1538)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
As reported here.
About this issue
- Original URL
- State: closed
- Created 7 years ago
- Comments: 17 (17 by maintainers)
Commits related to this issue
- fix memory mapped unmapping again, jdk9 only, #701 — committed to graphhopper/graphhopper by karussell 7 years ago
- no special case for Android necessary, #933 — committed to graphhopper/graphhopper by karussell 7 years ago
- under Android 5.x calling DirectByteBuffer.free is necessary, #933 — committed to graphhopper/graphhopper by karussell 7 years ago
Oh, I forgot again to change in
build.gradle
the repositories. So indeed with old code I see too the exception on 5.1.1, good finding! 🙂Can be easily fixed as there is also a free method: https://android.googlesource.com/platform/libcore/+/android-5.0.2_r1/luni/src/main/java/java/nio/DirectByteBuffer.java