将单个 c 文件编译成二进制可执行文件,可通过Android shell Process 调用执行,例如在手机端调用 ffmpeg 执行命令
文件准备
在一个单独的新目录中,新建两个文件 Android.mk
和 Application.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
libs
和obj
就是输出文件
输出文件可以修改为
libxxx.so
放入app libs 目录,可通过 shell 调用