Ricerca…


Creazione di eseguibili nativi per Android

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.

Come pulire la build

Se hai bisogno di pulire la build:

ndk-build clean

Come utilizzare un makefile diverso da Android.mk

ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk

Come accedere a ndk

Per prima cosa assicurati di collegarti alla libreria di logging nel tuo file Android.mk :

LOCAL_LDLIBS := -llog   

Quindi utilizzare una delle seguenti chiamate __android_log_print() :

#include <android/log.h>    
#define TAG "MY LOG"

__android_log_print(ANDROID_LOG_VERBOSE,    TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_WARN,       TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_DEBUG,      TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_INFO,       TAG, "The value of 1 + 1 is %d", 1 + 1)
__android_log_print(ANDROID_LOG_ERROR,      TAG, "The value of 1 + 1 is %d", 1 + 1)

Oppure usa quelli in un modo più conveniente definendo le macro corrispondenti:

#define  LOGV(...)  __android_log_print(ANDROID_LOG_VERBOSE,    TAG, __VA_ARGS__)
#define  LOGW(...)  __android_log_print(ANDROID_LOG_WARN,       TAG, __VA_ARGS__)
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,      TAG, __VA_ARGS__)
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,       TAG, __VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,      TAG, __VA_ARGS__)

Esempio :

int x = 42;
LOGD("The value of x is %d", x);


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow