Android
Android NDK
Zoeken…
Inheemse uitvoerbare bestanden bouwen voor Android
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
Als je apparaten met Android-versies lager dan 5.0 (API 21) wilt ondersteunen, moet je je binaire bestand compileren met APP_PLATFORM
ingesteld op een oudere API, bijv. android-8
. Dit is een gevolg van Android 5.0 die positie-onafhankelijke binaries (PIE) afdwingt, terwijl oudere apparaten niet noodzakelijkerwijs PIE's ondersteunen. Daarom moet u de PIE of de niet-PIE gebruiken, afhankelijk van de apparaatversie. Als u het binaire bestand vanuit uw Android-toepassing wilt gebruiken, moet u het API-niveau controleren en het juiste binaire bestand extraheren.
APP_ABI
kan worden gewijzigd in specifieke platforms zoals armeabi
om het binaire bestand alleen voor die architecturen te bouwen.
In het ergste geval heb je zowel een PIE als een niet-PIE binair voor elke architectuur (ongeveer 14 verschillende binaries met ndk-r10e).
Om het uitvoerbare bestand te bouwen:
cd project
ndk-build
Je vindt de binaire project/libs/<architecture>/hello_world
op project/libs/<architecture>/hello_world
. Je kunt ze gebruiken via ADB
( push
en chmod
met uitvoerbare machtiging) of vanuit je applicatie (extraheren en chmod
met uitvoerbare machtiging).
Om de architectuur van de CPU te bepalen, haalt u de build-eigenschap ro.product.cpu.abi
voor de primaire architectuur of ro.product.cpu.abilist
(op nieuwere apparaten) voor een complete lijst met ondersteunde architecturen. U kunt dit doen met behulp van de klasse android.os.Build
vanuit uw toepassing of met behulp van getprop <name>
via ADB.
Hoe de build schoon te maken
Als u de build moet opschonen:
ndk-build clean
Een ander makefile gebruiken dan Android.mk
ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk
Hoe inloggen ndk
Zorg er eerst voor dat u een koppeling maakt naar de logboekbibliotheek in uw Android.mk
bestand:
LOCAL_LDLIBS := -llog
Gebruik vervolgens een van de volgende __android_log_print()
-aanroepen:
#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)
Of gebruik deze op een handigere manier door overeenkomstige macro's te definiëren:
#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__)
Voorbeeld :
int x = 42;
LOGD("The value of x is %d", x);