GERBEN'S BLOG

Recompiler Retroarch pour une vieille tablette Android

Et voici la suite du précédent article pour redonner un coup de jeune à mon Acer Iconia A500.

Retroarch était le 2ème programme de ma liste à destination de la tablette, voyons ce que nous pouvons faire.

Retroarch

Retroarch est un multi-émulateur (si vous me permettez le néologisme) qui permet de télécharger de nombreux “coeurs” permettant d’émuler un grand nombre de consoles ou d’ordinateurs.

Il y a donc 2 composants principaux :

  • l’interface
  • les coeurs des différents émulateurs

L’interface fut une bonne surprise elle fonctionne directement sur la tablette. Il suffit de télécharger l’apk 32 bits sur le site de retroarch.

Cependant mauvaise surprise : les coeurs plantent lorsqu’on les lance après téléchargement depuis l’interface.

Compiler un coeur retroarch

Les instructions pour recompiler un coeur android indiquent comment démarrer en téléchargeant les sources :

git clone https://github.com/libretro/libretro-super.git
cd libretro-super
./libretro-fetch.sh

Ces commandes effectuent le téléchargement des sources principales puis de celles des différents coeurs d’émulation.

Les sources ont globalement la même structure : un sous-répertoire libretro-<nomDuCoeur> qui contient lui-même (parfois dans une sous-arborescence) un répertoire jni.

Le script libretro-build-android-mk.sh permet de lancer la compilation d’un des coeurs, par exemple, pour recompiler le coeur gameboy gambatte (Attention a bien avoir défini les chemins des SDK et NDK android, les chemins sont ici ceux de mon environnement) :

export ANDROID_NDK_ROOT=/Users/gerben/Library/Android/sdk/ndk/21.3.6528147
export ANDROID_SDK_ROOT=/Users/gerben/Library/Android/sdk
export PATH=$ANDROID_NDK_ROOT:$PATH
./libretro-build-android-mk.sh gambatte

Mais si vous essayez d’utiliser le coeur compilé par ce script (trouvable dans le chemin libretro-gambatte/libgambatte/libretro/libs/armeabi-v7a/libretro.so) sur votre tablette, même résultat : un crash immédiat.

Désactiver les instructions NEON

Comme dans l’article précédent, le problème se situe dans les spécificités du coeur Cortex A9 du Tegra 2 et l’utilisation des instructions NEON. Ces instructions étant activées par défaut pour les builds NDK, il faut ajouter des instructions de configuration pour les désactiver.

Dans le cas du coeur gambatte (mais c’est pareil pour les autres coeurs), il faut modifier le fichier Android.mk situé dans le sous-répertoire jni (libretro-gambatte/libgambatte/libretro/jni) et ajouter parmi les variables LOCAL_ARM_NEON := false, ce qui donne :

CAL_PATH := $(call my-dir)

ROOT_DIR     := $(LOCAL_PATH)/../../..
CORE_DIR     := $(ROOT_DIR)/libgambatte/src
LIBRETRO_DIR := $(ROOT_DIR)/libgambatte/libretro

HAVE_NETWORK := 1

include $(ROOT_DIR)/Makefile.common

COREFLAGS := -DINLINE=inline -DHAVE_STDINT_H -DHAVE_INTTYPES_H -D__LIBRETRO__ -DVIDEO_RGB565 -Wno-c++11-narrowing

ifeq ($(HAVE_NETWORK),1)
  COREFLAGS += -DHAVE_NETWORK
endif

include $(CLEAR_VARS)
LOCAL_MODULE    := retro
LOCAL_SRC_FILES := $(SOURCES_CXX) $(SOURCES_C)
LOCAL_CXXFLAGS  := $(COREFLAGS) $(INCFLAGS)
LOCAL_CFLAGS    := $(INCFLAGS)
LOCAL_LDFLAGS   := -Wl,-version-script=$(LIBRETRO_DIR)/link.T
LOCAL_ARM_NEON := false
include $(BUILD_SHARED_LIBRARY)

(notez l’avant dernière ligne qui contient la modification)

Et si tout s’est bien passé, vous avez désormais un nouveau coeur à installer dans votre retroarch (dans l’interface : Load Core -> Install or Restore a Core, enjoy !! :)

Retroarch on Acer Iconia A500