Android
NDK Android
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);