Sök…


Bygga ursprungliga körbara filer för Android

Projekt / JNI / main.c

#include <stdio.h>
#include <unistd.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}

projekt / JNI / Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := hello_world
LOCAL_SRC_FILES := main.c
include $(BUILD_EXECUTABLE)

projekt / JNI / Application.mk

APP_ABI := all
APP_PLATFORM := android-21

Om du vill stödja enheter som kör Android-versioner lägre än 5.0 (API 21) måste du kompilera din binära med APP_PLATFORM inställd på ett äldre API, t.ex. android-8 . Detta är en följd av att Android 5.0 upprätthåller Position Independent Binaries (PIE), medan äldre enheter inte nödvändigtvis stöder PIE: er. Därför måste du använda antingen PIE eller icke-PIE, beroende på enhetsversion. Om du vill använda den binära från din Android-applikation måste du kontrollera API-nivån och extrahera rätt binär.

APP_ABI kan ändras till specifika plattformar som armeabi att bara bygga det binära för dessa arkitekturer.

I värsta fall kommer du att ha både en PIE och en icke-PIE-binär för varje arkitektur (cirka 14 olika binärer som använder ndk-r10e).

Så här bygger du den körbara:

cd project
ndk-build

Du hittar binärerna på project/libs/<architecture>/hello_world . Du kan använda dem via ADB ( push och chmod det med körbart tillstånd) eller från din applikation (extrahera och chmod det med körbart tillstånd).

För att bestämma CPU: s arkitektur, hämta ro.product.cpu.abi för den primära arkitekturen eller ro.product.cpu.abilist (på nyare enheter) för en fullständig lista över stödsarkitekturer. Du kan göra detta med android.os.Build klassen från din applikation eller med getprop <name> via ADB.

Hur man rengör byggnaden

Om du behöver rengöra byggnaden:

ndk-build clean

Hur man använder en annan fil än Android.mk

ndk-build NDK_PROJECT_PATH = PROJECT_PATH APP_BUILD_SCRIPT = MyAndroid.mk

Hur man loggar in ndk

Se först till att du länkar mot loggbiblioteket i din Android.mk fil:

LOCAL_LDLIBS := -llog   

Använd sedan ett av följande __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)

Eller använd dem på ett mer bekvämt sätt genom att definiera motsvarande makron:

#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__)

Exempel :

int x = 42;
LOGD("The value of x is %d", x);


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow