(NDK编译)详解使用Android.mk编译的C/C++程序过程

想要在Android设备 上运行C/C++程序 可执行文件,可采用一个方法就是使用NDK编译 ,很多时候要比gcc编译 更适合,这里我采用的是imx6q开发板 上面装载了自己编写的Android6.0.1镜像,在Ubuntu64位系统上采用NDK编译。

目录

1.准备文件

2.编写Android.mk

注意

完整Android.mk代码

3.NDK编译

4.运行可执行文件


1.准备文件

首先在新建的一个文件夹中,放置自己编写的两个文件,一个是C语言程序,一个是Android.mk,C语言程序内容可以由自己决定,符合标准即可。也可以是最简单的打印hello,world

2.编写Android.mk

对于Android.mk文件的编写,需要先了解其中一些必要的设置,这里我先放出我的Android.mk

文件内容很简短,来详细解释一下,

复制代码
LOCAL_PATH := $(call my-dir)

首先必须定义好LOCAL_PATH变量,用于在开发树中查找源文件。宏函数my-dir由编译系统提供,用于返回当前路径(即包含Android.mk文件的目录)。

复制代码
include $(CLEAR_VARS)

这是必要的语句,CLEAR_VARS由编译系统提供,用于清除许多LOCAL_XXX变量,如: LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES...

复制代码
LOCAL_MODULE := test_app

编译的目标对象,LOCAL_MODULE变量必须定义,以标识在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。编译系统会自动产生合适的前缀和后缀,一个被命名为'sum'的共享库模块,将会生成'libsum.so'文件。

复制代码
LOCAL_SRC_FILES := test_app.c

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。我们不需要在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件,仅仅列出直接传递给编译器的源代码文件就好。

复制代码
include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做

注意

可以看到我的Android.mk文件当中还有两行

复制代码
LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE

在起初我没有添加这两行代码时,也可使用NDK成功编译出可执行文件,但放在Android系统的开发板上时无法运行并报错:only position independent executables (PIE) are supported

我通过参考error: only position independent executables (PIE) are supported 了解了这个问题以及解决办法,大体上就是从Android4.1引入了PIE 这个安全机制,解决办法就是加入上述的两条语句在Android.mk文件中即可

完整Android.mk代码

给出完整的Android.mk代码,由于我的C文件叫做test_app.c ,所以想要直接使用需要把下面代码中test_app换为自己电脑上C程序文件的名称即可。

复制代码
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


LOCAL_SRC_FILES := test_app.c
LOCAL_MODULE := test_app

LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE

include $(BUILD_EXECUTABLE)

#APP_ALLOW_MISSING_DEPS=true

#APP_PLATFORM        := android-14
APP_ABI             := armeabi-v7a x86 x86_64 arm64-v8a

3.NDK编译

完成上述步骤后,在当前文件夹下打开终端,输入ndk-build的命令进行编译

复制代码
/home/yinlong/Music/sdkapp/android-ndk-r14b-linux-x86_64/android-ndk-r14b/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

成功编译后,在当前目录下出现了两个新的文件夹,生成的可执行程序都放在libs目录下

libs 目录下可以看到有多个版本,适合我的imx6q开发板的是armeabi-v7a下的程序

打开后可以看到编译好的test_app

4.运行可执行文件

把上面的文件放到Android设备中,也就是放入我的开发板中运行下面命令设置文件的读写权限,注意是要在有root权限的情况下

复制代码
chmod 777 test_app

接着就可以运行NDK编译的可执行文件了

复制代码
./test_app
相关推荐
小杍随笔4 分钟前
Rust桌面GUI框架:性能优化与实战避坑指南
开发语言·性能优化·rust
二哈赛车手7 分钟前
新人笔记---项目中简易版的RAG检索后评测指标(@Recall ,Mrr..)实现
java·开发语言·笔记·spring·ai
格林威9 分钟前
3D相机视觉检测:环境光太强,结构光点云全是噪点怎么办?
开发语言·人工智能·数码相机·计算机视觉·3d·视觉检测·工业相机
Rust语言中文社区16 分钟前
【Rust日报】2026-05-02 Temper - 用 Rust 编写的 Minecraft 服务器项目发布 0.1.0 版
运维·服务器·开发语言·后端·rust
冯诺依曼的锦鲤21 分钟前
从零实现高并发内存池:TCMalloc 核心架构拆解
c++·学习·算法·架构
怣疯knight42 分钟前
Windows不安装 Android Studio如何打包安卓软件
android·windows·android studio
ke_csdn1 小时前
从Java演变到Kotlin下的jet pack
android
爱滑雪的码农1 小时前
Java基础十一 流(Stream)、文件(File)和IO
java·开发语言·python
叶小鸡1 小时前
Java 篇-项目实战-天机学堂(从0到1)-day11
java·开发语言
格林威1 小时前
线阵工业相机:线阵图像出现“波浪纹”,是机械振动还是编码器问题?
开发语言·人工智能·数码相机·计算机视觉·视觉检测·工业相机·线阵相机