一、在Android.mk文件中引入系统动态库
要在 Android.mk
文件中引入系统动态库,你可以使用 LOCAL_SHARED_LIBRARIES
变量来指定系统动态库。以下是一个示例:
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 := loginclude $(BUILD_SHARED_LIBRARY)
在这个示例中,log
是系统动态库的名称。这个库会被链接到你的模块中。
当你执行 ndk-build
后,系统动态库会被自动链接到你的模块中,使得你可以在代码中使用系统库提供的函数和功能。
LOCAL_SHARED_LIBRARIES := log
和 LOCAL_SHARED_LIBRARIES += log
在 Android.mk
文件中的作用是相似的,但它们在赋值的方式上有所不同,因此具有一些区别:
-
LOCAL_SHARED_LIBRARIES := log
:- 使用
:=
赋值符号,表示赋值为log
。 - 这种方式会完全覆盖之前的值,如果之前有其他库,会被
log
替代。
- 使用
-
LOCAL_SHARED_LIBRARIES += log
:- 使用
+=
赋值符号,表示在现有值的基础上追加log
。 - 这种方式不会覆盖之前的值,而是将
log
添加到已有的库列表之后。
- 使用
因此,如果你希望仅使用 log
这个系统动态库,而不管之前是否已经有其他库,可以使用 LOCAL_SHARED_LIBRARIES := log
。如果你想在已有的库列表之后添加 log
,可以使用 LOCAL_SHARED_LIBRARIES += log
。
要追加多个系统动态库,你可以使用 +=
符号来添加多个库。以下是一个示例:
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 += GLESv2include $(BUILD_SHARED_LIBRARY)
在这个示例中,我们使用 +=
符号追加了多个系统动态库:log
、android
和 GLESv2
。这些库将会被链接到你的模块中。
二、引入第三方库
在 Android.mk
文件中,LOCAL_LDFLAGS
变量用于指定链接阶段的额外选项和标志。这些选项和标志会传递给链接器,影响库的链接行为。以下是 LOCAL_LDFLAGS
的一些常见用法和作用:
-
链接库:你可以使用
-l
选项来指定要链接的库。例如,如果要链接一个名为mylibrary
的库,你可以使用-lmylibrary
。 -
指定库路径:有时候库文件不在默认的搜索路径中,你可以使用
-L
选项来指定库文件的搜索路径。例如,如果库文件在libs
目录下,你可以使用-Llibs
来告诉链接器去搜索这个目录。 -
指定运行时库路径:如果你希望运行时能够动态加载库,你可以使用
-rpath
选项来指定运行时库的搜索路径。 -
链接器选项:你可以使用其他链接器选项,例如
-Wl,--whole-archive
和-Wl,--no-whole-archive
等来控制链接行为。
以下是一个示例,演示了如何在 LOCAL_LDFLAGS
中使用 -l
和 -L
选项:
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)/libsinclude $(BUILD_SHARED_LIBRARY)
在这个示例中,我们使用 LOCAL_LDFLAGS
添加了 -L
选项来指定库文件搜索路径为 libs
目录,并且使用 -Wl,-rpath
选项来指定运行时库的搜索路径为 libs
目录。