From 00cde7cbbddbd5be5e104a72f259578b109d8bb7 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 16 Jul 2020 18:42:15 +0200 Subject: [PATCH] Android: Don't access /dev/ashmem on newer Android versions Fixes a critical regression where 95945a0 made us unable to start emulation on Android 10 and newer. Android is restricting direct access to /dev/ashmem starting with the new SDK version, but we can use the new (and simpler) ASharedMemory API instead. We have to keep using the /dev/ashmem approach on old versions of Android, though. --- Source/Core/Common/MemArena.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/Source/Core/Common/MemArena.cpp b/Source/Core/Common/MemArena.cpp index fcd18892ba..19085e3d8f 100644 --- a/Source/Core/Common/MemArena.cpp +++ b/Source/Core/Common/MemArena.cpp @@ -23,6 +23,7 @@ #include #include #ifdef ANDROID +#include #include #include #endif @@ -35,6 +36,18 @@ namespace Common static int AshmemCreateFileMapping(const char* name, size_t size) { + // ASharedMemory path - works on API >= 26 and falls through on API < 26: + + // We can't call ASharedMemory_create the normal way without increasing the + // minimum version requirement to API 26, so we use dlopen/dlsym instead + static void* libandroid = dlopen("libandroid.so", RTLD_LAZY | RTLD_LOCAL); + static auto shared_memory_create = + reinterpret_cast(dlsym(libandroid, "ASharedMemory_create")); + if (shared_memory_create) + return shared_memory_create(name, size); + + // /dev/ashmem path - works on API < 29: + int fd, ret; fd = open(ASHMEM_DEVICE, O_RDWR); if (fd < 0)