NDK编译(使用Android.mk)C/C++程序和库

1、编译可执行目标文件

1.1、编写源代码

源代码可以是c或cpp文件,但一定要包含main函数,否则会报错。例如:

复制代码
//test.c
#include <stdio.h>
int main()
{
  printf("Hello,NDK!");
}

1.2 编写Android.mk文件

编写Android.mk文件,内容如下:

复制代码
#LOCAL_PATH变量,用于在开发树中查找源文件
#宏函数my-dir由编译系统提供,用于返回当前路径(即包含Android.mk文件的目录)
LOCAL_PATH := $(call my-dir)
#CLEAR_VARS由编译系统提供,用于清除许多LOCAL_XXX变量
include $(CLEAR_VARS)
#LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件
#不需要在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件
LOCAL_SRC_FILES := test.c
#LOCAL_MODULE变量定义编译的目标对象名称,必须定义
#名称必须是唯一的,而且不包含任何空格
#编译系统会自动产生合适的前缀和后缀,一个被命名为'sum'的共享库模块,将会生成'libsum.so'文件。
LOCAL_MODULE := test
#从Android4.1引入了PIE安全机制,避免无法运行并报错:only position independent executables (PIE) are supported
#生成库文件时可以不定义
LOCAL_CFLAGS += -pie -fPIE 
LOCAL_LDFLAGS += -pie -fPIE
#BUILD_EXECUTABLE表示编译生成可执行文件
include $(BUILD_EXECUTABLE)
#BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量
#include $(BUILD_SHARED_LIBRARY)

#APP_ALLOW_MISSING_DEPS=true
#运行平台定义,默认最低支持平台为android-21,可以不定义
#APP_PLATFORM        := android-14

1.3、运行mk文件

若已经安装ndk,找到ndk-build文件目录,输入以下命令:

复制代码
/path/to/ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk

也可创建一个sh文件,修改属性后执行。

成功运行后,会在目录下生成libs和obj文件夹,目标文件在libs目录下以各个架构命名的文件夹中。

2、编译库文件

源代码文件可以是c或cpp/cc文件。

注意的是mk文件中使用:

include $(BUILD_SHARED_LIBRARY)

查看so库中的函数:

复制代码
nm -D libtest.so 
相关推荐
智者知已应修善业1 小时前
【洛谷P9975奶牛被病毒传染最少数量推导,导出多样例】2025-2-26
c语言·c++·经验分享·笔记·算法·推荐算法
Trouvaille ~1 小时前
【Linux】应用层协议设计实战(一):自定义协议与网络计算器
linux·运维·服务器·网络·c++·http·应用层协议
CSCN新手听安1 小时前
【linux】高级IO,I/O多路转接之poll,接口和原理讲解,poll版本的TCP服务器
linux·运维·服务器·c++·计算机网络·高级io·poll
CSCN新手听安1 小时前
【linux】网络基础(三)TCP服务端网络版本计算器的优化,Json的使用,服务器守护进程化daemon,重谈OSI七层模型
linux·服务器·网络·c++·tcp/ip·json
m0_736919101 小时前
C++中的委托构造函数
开发语言·c++·算法
小小小小王王王1 小时前
洛谷-P1886 【模板】单调队列 / 滑动窗口
c++·算法
历程里程碑2 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun2 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
2501_916008892 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
小龙报2 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机