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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow