Поиск…


Создание собственных исполняемых файлов для Android

Проект / JNI / main.c

#include <stdio.h>
#include <unistd.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}

Проект / JNI / Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)

Проект / JNI / Application.mk

APP_ABI := all
APP_PLATFORM := android-21

Если вы хотите поддерживать устройства под управлением версий Android версии ниже 5.0 (API 21), вам необходимо скомпилировать ваш двоичный файл с помощью APP_PLATFORM установленного на более старый API, например, android-8 . Это является следствием того, что Android 5.0 обеспечивает независимые бинарные позиции (PIE), тогда как более старые устройства не обязательно поддерживают PIE. Поэтому в зависимости от версии устройства вам необходимо использовать PIE или не-PIE. Если вы хотите использовать двоичный код в своем приложении для Android, вам нужно проверить уровень API и извлечь правильный двоичный файл.

APP_ABI можно изменить на определенные платформы, такие как armeabi для создания двоичного armeabi только для этих архитектур.

В худшем случае вы будете иметь как PIE, так и не-PIE двоичные файлы для каждой архитектуры (около 14 различных двоичных файлов, использующих ndk-r10e).

Чтобы создать исполняемый файл:

cd project
ndk-build

Вы найдете двоичные файлы в project/libs/<architecture>/hello_world . Вы можете использовать их через ADB ( push и chmod с исполняемым разрешением) или из вашего приложения (извлечь и chmod с разрешением на выполнение).

Чтобы определить архитектуру ЦП, ro.product.cpu.abi свойство build ro.product.cpu.abi для первичной архитектуры или ro.product.cpu.abilist (на новых устройствах) для получения полного списка поддерживаемых архитектур. Вы можете сделать это, используя класс android.os.Build из вашего приложения или используя getprop <name> через ADB.

Как очистить сборку

Если вам нужно очистить сборку:

ndk-build clean

Как использовать makefile, отличный от Android.mk

ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk

Как войти в систему ndk

Сначала убедитесь, что вы связываетесь с библиотекой протоколирования в файле Android.mk :

LOCAL_LDLIBS := -llog   

Затем используйте один из следующих __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)

Или используйте их более удобным способом, определяя соответствующие макросы:

#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__)

Пример :

int x = 42;
LOGD("The value of x is %d", x);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow