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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow