Android Creazione di eseguibili nativi per Android


Esempio

progetto / jni / main.c

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

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

progetto / jni / Android.mk

LOCAL_PATH := $(call my-dir)

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

progetto / jni / Application.mk

APP_ABI := all
APP_PLATFORM := android-21

Se vuoi supportare dispositivi con versioni Android inferiori a 5.0 (API 21), devi compilare il tuo binario con APP_PLATFORM impostato su un'API precedente, ad esempio android-8 . Questa è una conseguenza di Android 5.0 che applica i BIN indipendenti dalla posizione (PIE), mentre i dispositivi più vecchi non necessariamente supportano i PIE. Pertanto, è necessario utilizzare il PIE o il non-PIE, a seconda della versione del dispositivo. Se si desidera utilizzare il binario dall'applicazione Android, è necessario controllare il livello API ed estrarre il binario corretto.

APP_ABI può essere modificato su piattaforme specifiche come armeabi per costruire il binario solo per quelle architetture.

Nel peggiore dei casi, avrai sia un PIE che un binario non-PIE per ogni architettura (circa 14 binari diversi usando ndk-r10e).

Per costruire l'eseguibile:

cd project
ndk-build

Troverete i binari a project/libs/<architecture>/hello_world . Puoi utilizzarli tramite ADB ( push e chmod con permesso eseguibile) o dalla tua applicazione (estrai e chmod con permesso eseguibile).

Per determinare l'architettura della CPU, recuperare la proprietà build ro.product.cpu.abi per l'architettura principale o ro.product.cpu.abilist (sui dispositivi più recenti) per un elenco completo delle architetture supportate. Puoi farlo usando la classe android.os.Build dall'interno dell'applicazione o usando getprop <name> tramite ADB.