【笔记】学习Android.mk(三)

一、在Android.mk文件中引入系统动态库

要在 Android.mk 文件中引入系统动态库,你可以使用 LOCAL_SHARED_LIBRARIES 变量来指定系统动态库。以下是一个示例:

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

include $(CLEAR_VARS)

# 定义模块名称和源文件
LOCAL_MODULE := mymodule
LOCAL_SRC_FILES := file1.cpp file2.cpp

# 设置编译标志
LOCAL_CFLAGS := -Wall -Werror

# 添加头文件包含路径
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

# 指定依赖的系统动态库
LOCAL_SHARED_LIBRARIES := log

include $(BUILD_SHARED_LIBRARY)

在这个示例中,log 是系统动态库的名称。这个库会被链接到你的模块中。

当你执行 ndk-build 后,系统动态库会被自动链接到你的模块中,使得你可以在代码中使用系统库提供的函数和功能。

LOCAL_SHARED_LIBRARIES := logLOCAL_SHARED_LIBRARIES += logAndroid.mk 文件中的作用是相似的,但它们在赋值的方式上有所不同,因此具有一些区别:

  1. LOCAL_SHARED_LIBRARIES := log

    • 使用 := 赋值符号,表示赋值为 log
    • 这种方式会完全覆盖之前的值,如果之前有其他库,会被 log 替代。
  2. LOCAL_SHARED_LIBRARIES += log

    • 使用 += 赋值符号,表示在现有值的基础上追加 log
    • 这种方式不会覆盖之前的值,而是将 log 添加到已有的库列表之后。

因此,如果你希望仅使用 log 这个系统动态库,而不管之前是否已经有其他库,可以使用 LOCAL_SHARED_LIBRARIES := log。如果你想在已有的库列表之后添加 log,可以使用 LOCAL_SHARED_LIBRARIES += log

要追加多个系统动态库,你可以使用 += 符号来添加多个库。以下是一个示例:

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

include $(CLEAR_VARS)

# 定义模块名称和源文件
LOCAL_MODULE := mymodule
LOCAL_SRC_FILES := file1.cpp file2.cpp

# 设置编译标志
LOCAL_CFLAGS := -Wall -Werror

# 添加头文件包含路径
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

# 追加多个系统动态库
LOCAL_SHARED_LIBRARIES += log
LOCAL_SHARED_LIBRARIES += android
LOCAL_SHARED_LIBRARIES += GLESv2

include $(BUILD_SHARED_LIBRARY)

在这个示例中,我们使用 += 符号追加了多个系统动态库:logandroidGLESv2。这些库将会被链接到你的模块中。

二、引入第三方库

Android.mk 文件中,LOCAL_LDFLAGS 变量用于指定链接阶段的额外选项和标志。这些选项和标志会传递给链接器,影响库的链接行为。以下是 LOCAL_LDFLAGS 的一些常见用法和作用:

  1. 链接库 :你可以使用 -l 选项来指定要链接的库。例如,如果要链接一个名为 mylibrary 的库,你可以使用 -lmylibrary

  2. 指定库路径 :有时候库文件不在默认的搜索路径中,你可以使用 -L 选项来指定库文件的搜索路径。例如,如果库文件在 libs 目录下,你可以使用 -Llibs 来告诉链接器去搜索这个目录。

  3. 指定运行时库路径 :如果你希望运行时能够动态加载库,你可以使用 -rpath 选项来指定运行时库的搜索路径。

  4. 链接器选项 :你可以使用其他链接器选项,例如 -Wl,--whole-archive-Wl,--no-whole-archive 等来控制链接行为。

以下是一个示例,演示了如何在 LOCAL_LDFLAGS 中使用 -l-L 选项:

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

include $(CLEAR_VARS)

# 定义模块名称和源文件
LOCAL_MODULE := mymodule
LOCAL_SRC_FILES := file1.cpp file2.cpp

# 设置编译标志
LOCAL_CFLAGS := -Wall -Werror

# 添加头文件包含路径
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include

# 指定依赖的系统库
LOCAL_LDLIBS := -llog

# 指定额外的链接标志和选项
LOCAL_LDFLAGS := -L$(LOCAL_PATH)/libs -Wl,-rpath=$(LOCAL_PATH)/libs

include $(BUILD_SHARED_LIBRARY)

在这个示例中,我们使用 LOCAL_LDFLAGS 添加了 -L 选项来指定库文件搜索路径为 libs 目录,并且使用 -Wl,-rpath 选项来指定运行时库的搜索路径为 libs 目录。

相关推荐
L***一13 分钟前
2026届大专跨境电商专业毕业生就业能力提升路径探析
学习
.小墨迹26 分钟前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
ZH154558913136 分钟前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
山岚的运维笔记40 分钟前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
Gain_chance42 分钟前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
hqyjzsb1 小时前
盲目用AI提效?当心陷入“工具奴”陷阱,效率不增反降
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·远程工作
承渊政道1 小时前
Linux系统学习【Linux系统的进度条实现、版本控制器git和调试器gdb介绍】
linux·开发语言·笔记·git·学习·gitee
lpfasd1231 小时前
两个美国:精英的知识崇拜与底层的反智驯化
笔记
清水迎朝阳1 小时前
解锁读书新体验--有声小说书屋 本地网站的 标注笔记功能
笔记·电子书·读书·标注·有声小说
消失的旧时光-19432 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed