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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow