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