Android
NDK Android
Recherche…
Construire des exécutables natifs pour Android
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.
Comment nettoyer la construction
Si vous devez nettoyer la version:
ndk-build clean
Comment utiliser un makefile autre que Android.mk
ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk
Comment se connecter à ndk
Assurez-vous d'abord de créer un lien avec la bibliothèque de journalisation dans votre fichier Android.mk
:
LOCAL_LDLIBS := -llog
Ensuite, utilisez l'un des appels __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)
Ou utilisez-les de manière plus pratique en définissant les macros correspondantes:
#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__)
Exemple :
int x = 42;
LOGD("The value of x is %d", x);