综述
# makefile变量区分大小写
# 一般变量名都是大写,函数名都是小写的
##########################################################
# LOCAL_PATH 必须放在android mk文件的第一行
LOCAL_PATH := $(call my-dir)
# 日志输出warning error,其中error会停止运行
$(warning $(this-makefile)) #输出当前makefile的绝对路径,注意include会影响其值
# 清空除了LOCAL_PATH以外的LOCAL_<name>变量,例如LOCAL_MODULE,LOCAL_SRC_FILES
# android构建系统将变量CLEAR_VARS的值设置为clear-vars.mk文件的位置,因此使用include语法
include $(CLEAR_VARS)
# 构建的模块的名称,加上适当的前缀和后缀就变成了构建所生成文件的文件名
LOCAL_MODULE := hello-jni
# 可选目录列表,用来搜索文件
LOCAL_C_INCLUDES := $(LOCAL_PATH)/thirdparty \
$(LOCAL_PATH)/thirdparty/include
# 指明源文件,多个源文件之间用空格分隔
LOCAL_SRC_FILES := hello-jni.c
# 构建动态库,库文件名为libhello-jni.so
# 如果使用BUILD_EXECUTABLE可以直接编译成可执行文件
include $(BUILD_SHARED_LIBRARY)
##############################################
# 可以在多个NDK项目间共享一个模块
# 首先将共享模块源代码移动到NDK项目以外的位置,例如 C:\android\shared-modules\transcode\audiolib
# audiolib 的也需要一个mk文件,正常编译为共享库即可
# 在使用共享库项目的mk文件末尾添加 $(call import-module,transcode/audiolib)
# import-module函数宏只搜索固定路径,为了搜索C:\android\shared-modules,需要新建一个NDK_MODULE_PATH的环境变量
# 并设置值为C:\android\shared-modules
###############################################
###########################################################
# 变量:
# LOCAL_C_INCLUDES:可选目录列表,NDK安装路径的相对路径,用来搜索文件
# LOCAL_CFLAGS: 可选编译器标志,在编译C和C++源文件时会被传送给编译器
# LOCAL_CPPFLAGS: 可选编译标志,只在编译C++源文件的时候被传送给编译器
# LOCAL_LDLIBS: 链接标志的可选列表,当对目标文件进行链接以生成输出文件时
# 该标志被传送给链接器。它主要用于传送要进行动态链接的系统库的列表
# 一般我们用LOCAL_LDFLAGS := -llog 链接android日志库
# LOCAL_EXPORT_CFLAGS: 该变量记录一组编译器标志,这些标志会被添加到通过变量LOCAL_STATIC_LIBRARIES或LOCAL_SHARED_LIBRARIES
# 使用本模块的其他模块的LOCAL_CFLAGS定义中
# LOCAL_EXPORT_CPPFLAGS:
# LOCAL_EXPORT_LDFLAGS:
# LOCAL_EXPORT_C_INCLUDES
#
# 当编译链接出错时,可以添加编译参数 -v 并查看相应的库文件是否被正常链接
# 在c编译时,代码中可以使用#error “字常串“ 或者#warning "字符串" 进行预编译输出
#############################################################
实战一、编译静态库后链接
1.1 目标
现有第三方库audio的源文件 audioPlayer.cpp, audioRecorder.cpp, audioPlayer.h, audioRecorder.h,其中头文件唯一thirdparty/audio目录下,要求将其编译为静态库之后再链接到动态库audioPlugin中。
1.2 实战
代码如下(示例):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := audio
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/thirdparty \
$(LOCAL_PATH)
LOCAL_SRC_FILES := audioPlayer.cpp audioRecorder.cpp
include $(BUILD_STATIC_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := audioPlugin
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/thirdparty \
$(LOCAL_PATH)
LOCAL_SRC_FILES := audioPlugin.cpp
LOCAL_STATIC_LIBRARIES := audio
include $(BUILD_SHARED_LIBRARY)
实战二、预编译第三方动态库后链接
1.1 目标
现有第三方库libaudio.so,和其头文件audioPlayer.h, audioRecorder.h,其中头文件唯一thirdparty/audio目录下,要求将其链接到动态库audioPlugin中。
1.2 实战
代码如下(示例):
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/thirdparty
LOCAL_MODULE := audio
LOCAL_SRC_FILES := libaudio.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := audioPlugin
LOCAL_SRC_FILES := audioPlugin.cpp
LOCAL_SHARED_LIBRARIES := audio
include $(BUILD_SHARED_LIBRARY)
|