為 Android 構建本機可執行檔案

專案/ JNI / main.c 中

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

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

專案/ JNI / Android.mk

LOCAL_PATH := $(call my-dir)

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

專案/ JNI / Application.mk

APP_ABI := all
APP_PLATFORM := android-21

如果你想支援執行低於 5.0 的 Android 版本(API 21)的裝置,則需要將 APP_PLATFORM 設定為較舊的 API(例如 android-8)來編譯二進位制檔案。這是 Android 5.0 強制執行位置無關二進位制 (PIE)的結果,而舊裝置不一定支援 PIE。因此,你需要使用 PIE 或非 PIE,具體取決於裝置版本。如果要在 Android 應用程式中使用二進位制檔案,則需要檢查 API 級別並提取正確的二進位制檔案。

APP_ABI 可以更改為特定平臺,例如 armeabi,僅為這些體系結構構建二進位制檔案。

在最壞的情況下,每個架構都有一個 PIE 和一個非 PIE 二進位制檔案(使用 ndk-r10e 的大約 14 個不同的二進位制檔案)。

要構建可執行檔案:

cd project
ndk-build

你將在 project/libs/<architecture>/hello_world 找到二進位制檔案。你可以通過 ADB(具有可執行許可權的 pushchmod)或從你的應用程式(具有可執行許可權的 extract 和 chmod)使用它們。

要確定 CPU 的體系結構,請檢索主體系結構的構建屬性 ro.product.cpu.abiro.product.cpu.abilist(在較新的裝置上)以獲取支援的體系結構的完整列表。你可以在應用程式中使用 android.os.Build 類或通過 ADB 使用 getprop <name> 來完成此操作。