ndk编译Android二进制可执行文件

ndk编译Android二进制可执行文件

原文

将单个 c 文件编译成二进制可执行文件,可通过Android shell Process 调用执行,例如在手机端调用 ffmpeg 执行命令

文件准备

在一个单独的新目录中,新建两个文件 Android.mkApplication.mk,然后分别按照如下代码对 Android.mk 文件和 Application.mk 文件进行编辑。

#Adroid.mk文件内容

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS)          #会清理除了LOCAL_PATH歪的其他LOCAL文件路径
LOCAL_CFLAGS += -std=c99       #使用c语言c99规范
LOCAL_CFLAGS += -pie -fPIE     #相当于在源文件中增加宏定义,安卓5.0以上需要添加,否则编译出来无法使用
LOCAL_LDFLAGS += -pie -fPIE    #相当于在源文件中增加宏定义,安卓5.0以上需要添加,否则编译出来无法使用
LOCAL_ARM_MODE := arm          #模块指令集
LOCAL_MODULE    := TestNdk     #模块名称(最后生成的可执行文件的名字,可以按照需求修改)
LOCAL_SRC_FILES := TestNdk.c   #源文件名(需要替换成我们自己的.c文件)
include $(BUILD_EXECUTABLE)    #编译为可执行文件
#Application.mk文件内容

APP_ABI := x86 armeabi-v8a

APP_ABI是指明编译与调试的CPU架构。
目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。

根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。

或者明确写明支持的CPU架构APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64

注意:由于目前版本支持的问题,采用Eclipse+NDK+Windows集成方式开发,对应编译生成对应CPU架构的so文件是没有问题的。但是不一定可以执行调试工作,启动NDK调试模式时将会提示无法识别对应的ABI。

执行编译

在 build 目录打开 cmd 执行 ndk-build 命令

ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk

# ndk-build是执行命令的关键字
# NDK_PROJECT_PATH是你的工程存放的路径,比如我放在了D盘的DEMO文件夹下面,就是D:/DEMO
#APP_BUILD_SCRIPT是你的Android.mk文件存放的地方。一般情况下我们都会将工程文件和mk文件存放在一起,所以路径和上述路径一致,在后面加上Android.mk即可。

如果已经安装 ndk-build ,那么 ndk-build 在 Android sdk 目录,需要设置 windows 环境变量,将 ndk 路径加入 Path

微信截图_20240327143422

libsobj 就是输出文件

输出文件可以修改为 libxxx.so 放入app libs 目录,可通过 shell 调用

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://zwc365.com/2024/03/26/ndk编译二进制可执行文件

Buy me a cup of coffee ☕.