为 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>
来完成此操作。