Android
Android NDK
Szukaj…
Budowanie natywnych plików wykonywalnych dla Androida
project / jni / main.c
#include <stdio.h>
#include <unistd.h>
int main(void) {
printf("Hello world!\n");
return 0;
}
project / jni / Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)
project / jni / Application.mk
APP_ABI := all
APP_PLATFORM := android-21
Jeśli chcesz obsługiwać urządzenia z systemem Android w wersji niższej niż 5.0 (API 21), musisz skompilować swój plik binarny z APP_PLATFORM
ustawionym na starsze API, np. android-8
. Jest to konsekwencja egzekwowania pozycji niezależnych plików binarnych (PIE) przez system Android 5.0, podczas gdy starsze urządzenia niekoniecznie obsługują PIE. Dlatego musisz użyć albo SROKI, albo nie-SROKI, w zależności od wersji urządzenia. Jeśli chcesz używać pliku binarnego z poziomu aplikacji na Androida, musisz sprawdzić poziom interfejsu API i wyodrębnić odpowiedni plik binarny.
APP_ABI
można zmienić na określone platformy, takie jak armeabi
aby zbudować plik binarny tylko dla tych architektur.
W najgorszym przypadku będziesz mieć plik PIE i plik binarny inny niż PIE dla każdej architektury (około 14 różnych plików binarnych przy użyciu ndk-r10e).
Aby zbudować plik wykonywalny:
cd project
ndk-build
Pliki binarne znajdziesz w project/libs/<architecture>/hello_world
. Możesz ich używać przez ADB
( push
i chmod
z uprawnieniami do wykonywania) lub z aplikacji (rozpakuj i chmod
z uprawnieniami do wykonywania).
Aby określić architekturę procesora, pobierz właściwość kompilacji ro.product.cpu.abi
dla architektury podstawowej lub ro.product.cpu.abilist
(na nowszych urządzeniach), aby uzyskać pełną listę obsługiwanych architektur. Możesz to zrobić za pomocą klasy android.os.Build
z poziomu aplikacji lub za pomocą getprop <name>
poprzez ADB.
Jak wyczyścić kompilację
Jeśli musisz wyczyścić kompilację:
ndk-build clean
Jak korzystać z pliku makefile innego niż Android.mk
ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk
Jak się zalogować ndk
Najpierw upewnij się, że łączysz się z biblioteką rejestrowania w pliku Android.mk
:
LOCAL_LDLIBS := -llog
Następnie użyj jednego z następujących __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)
Lub użyj ich w wygodniejszy sposób, definiując odpowiednie makra:
#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__)
Przykład :
int x = 42;
LOGD("The value of x is %d", x);