Android Construire des exécutables natifs pour Android


Exemple

projet / jni / main.c

#include <stdio.h>
#include <unistd.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}

projet / jni / Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)

projet / jni / Application.mk

APP_ABI := all
APP_PLATFORM := android-21

Si vous souhaitez prendre en charge les périphériques exécutant des versions Android inférieures à 5.0 (API 21), vous devez compiler votre fichier binaire avec APP_PLATFORM défini sur une ancienne API, par exemple android-8 . Ceci est une conséquence de la mise en place de binaires de positionnement indépendants (PIE) par Android 5.0, alors que les anciens appareils ne prennent pas nécessairement en charge les PIE. Par conséquent, vous devez utiliser le PIE ou le non-PIE, selon la version du périphérique. Si vous souhaitez utiliser le binaire depuis votre application Android, vous devez vérifier le niveau de l'API et extraire le binaire correct.

APP_ABI peut être changé en plates-formes spécifiques telles que armeabi pour construire le binaire pour ces architectures uniquement.

Dans le pire des cas, vous aurez à la fois un binaire PIE et un binaire non-PIE pour chaque architecture (environ 14 binaires différents utilisant ndk-r10e).

Pour construire l'exécutable:

cd project
ndk-build

Vous trouverez les binaires à project/libs/<architecture>/hello_world . Vous pouvez les utiliser via ADB ( push et chmod avec l'autorisation exécutable) ou depuis votre application (extrayez et chmod le avec l'autorisation de l'exécutable).

Pour déterminer l'architecture de la CPU, récupérez la propriété de construction ro.product.cpu.abi pour l'architecture principale ou ro.product.cpu.abilist (sur les nouveaux périphériques) pour obtenir une liste complète des architectures prises en charge. Vous pouvez le faire en utilisant la classe android.os.Build depuis votre application ou en utilisant getprop <name> via ADB.