Android
Android NDK
Buscar..
Construyendo ejecutables nativos para Android
proyecto / jni / main.c
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("Hello world!\n");
return 0;
}
proyecto / jni / Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)
proyecto / jni / Application.mk
APP_ABI := all
APP_PLATFORM := android-21
Si desea admitir dispositivos con versiones de Android inferiores a 5.0 (API 21), debe compilar su binario con APP_PLATFORM
establecido en una API más antigua, por ejemplo, android-8
. Esto es una consecuencia de la aplicación de binarios independientes de posición (PIE) de Android 5.0, mientras que los dispositivos más antiguos no necesariamente admiten PIE. Por lo tanto, debe utilizar el PIE o el no PIE, dependiendo de la versión del dispositivo. Si desea utilizar el binario desde su aplicación de Android, debe verificar el nivel de API y extraer el binario correcto.
APP_ABI
se puede cambiar a plataformas específicas como armeabi
para construir el binario solo para esas arquitecturas.
En el peor de los casos, tendrá un binario PIE y otro no binario para cada arquitectura (aproximadamente 14 binarios diferentes que usan ndk-r10e).
Para construir el ejecutable:
cd project
ndk-build
Encontrará los binarios en project/libs/<architecture>/hello_world
. Puede usarlos a través de ADB
( push
y chmod
it con permiso ejecutable) o desde su aplicación (extraer y chmod
it con permiso ejecutable).
Para determinar la arquitectura de la CPU, recupere la propiedad de construcción ro.product.cpu.abi
para la arquitectura primaria o ro.product.cpu.abilist
(en dispositivos más nuevos) para obtener una lista completa de las arquitecturas compatibles. Puede hacerlo usando la clase android.os.Build
desde su aplicación o usando getprop <name>
través de ADB.
Cómo limpiar la construcción
Si necesitas limpiar la construcción:
ndk-build clean
Cómo usar un makefile que no sea Android.mk
ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk
Cómo iniciar sesión en ndk
Primero asegúrese de enlazar con la biblioteca de registro en su archivo Android.mk
:
LOCAL_LDLIBS := -llog
Luego use una de las siguientes llamadas __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)
O utilícelos de una manera más conveniente definiendo las macros correspondientes:
#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__)
Ejemplo :
int x = 42;
LOGD("The value of x is %d", x);