為 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
(具有可執行許可權的 push
和 chmod
)或從你的應用程式(具有可執行許可權的 extract 和 chmod
)使用它們。
要確定 CPU 的體系結構,請檢索主體系結構的構建屬性 ro.product.cpu.abi
或 ro.product.cpu.abilist
(在較新的裝置上)以獲取支援的體系結構的完整列表。你可以在應用程式中使用 android.os.Build
類或通過 ADB 使用 getprop <name>
來完成此操作。