Android
Android NDK
Поиск…
Создание собственных исполняемых файлов для 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);