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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow