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