Android.mk - nonelittlesong/study-cpp GitHub Wiki

参考:
http://www.cnblogs.com/wainiwann/p/3837936.html
https://github.com/nonelittlesong/study-java/wiki/jni

内容:

LOCAL_PATH := $(call my-dir)

// 包含第三方库my_lib
NCNN_INSTALL_PATH := /home/nihui/osd/ncnn/ncnn-android-lib
include $(CLEAR_VARS)
LOCAL_MODULE := ncnn
LOCAL_SRC_FILES := $(NCNN_INSTALL_PATH)/$(TARGET_ARCH_ABI)/libncnn.a
include $(PREBUILT_STATIC_LIBRARY)

// 设置工程编译
include $(CLEAR_VARS)
LOCAL_MODULE := squeezencnn
LOCAL_SRC_FILES := squeezencnn_jni.cpp
LOCAL_C_INCLUDES := $(NCNN_INSTALL_PATH)/include
LOCAL_STATIC_LIBRARIES := ncnn
LOCAL_CFLAGS := -O2 -fvisibility=hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_CPPFLAGS := -O2 -fvisibility=hidden -fvisibility-inlines-hidden -fomit-frame-pointer -fstrict-aliasing -ffunction-sections -fdata-sections -ffast-math
LOCAL_LDFLAGS += -Wl,--gc-sections
LOCAL_CFLAGS += -fopenmp
LOCAL_CPPFLAGS += -fopenmp
LOCAL_LDFLAGS += -fopenmp
LOCAL_LDLIBS := -lz -llog -ljnigraphics
include $(BUILD_SHARED_LIBRARY)

// 导入其他.mk工程
$(call import-module, ...)

include &(CLEAR_VARS) 与 include &(**_LIBRARY)之间是编译的一个目标。
include &(CLEAR_VARS)这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。清理后避免互相影响。

**_LIBRARY

PREBUILT_SHARED_LIBRARY: 已编译的共享库.so。此时模块的LOCAL_SRC_FILES应该被指定为一个预先编译好的动态库,而非source file。
PREBUILT_STATIC_LIBRARY: 已编译的静态库.a。同上。
BUILD_SHARED_LIBRARY: 编译生成共享库.so
BUILD_STATIC_LIBRARY: 编译生成静态库.a
BUILD_EXECUTABLE: 编译为Native C可执行程序

LOCAL_MODULE

编译后库的名称。模块必须定义,以表示Android.mk中的每一个模块。名字必须唯一且不包含空格。
Build System会自动添加适当的前缀和后缀。例如,foo,要产生动态库,则生成libfoo.so. 但请注意:如果模块名被定为:libfoo.则生成libfoo.so. 不再加前缀。

LOCAL_SRC_FILES

库或源码的路径

LOCAL_C_INCLUDES

指定链接的库以及源码的头文件路径。不必列出头文件,build System 会自动帮我们找出依赖文件。
缺省的C++源码的扩展名为.cpp. 也可以修改,通过LOCAL_CPP_EXTENSION。

LOCAL_SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES

告诉连接器,需要链接的第三方库

LOCAL_LDLIBS

告诉连接器,需要链接的系统库

LOCAL_CFLAGS

一个可选的设置,在编译C/C++ source 时添加如Flags。
用来附加编译选项。 注意:不要尝试在此处修改编译的优化选项和Debug等级。它会通过您Application.mk中的信息自动指定。
也可以指定include 目录通过:LOCAL_CFLAGS += -I。 这个方法比使用LOCAL_C_INCLUDES要好。因为这样也可以被ndk-debug使用。

LOCAL_CPPFLAGS

C++ Source 编译时添加的C Flags。这些Flags将出现在LOCAL_CFLAGS flags 的后面。

$(call import-module, ...)

...表示一个包含Android.mk的路径,他的意思是,当我们需要用到这个Android.mk生成的.so或.a时,
我们需要先编译该Android.mk所对应的工程,让它生成我们想要的库。

$(call my-dir)

返回最近一次include的Makefile的路径。通常返回Android.mk所在的路径。它用来作为Android.mk的开头来定义LOCAL_PATH。

⚠️ **GitHub.com Fallback** ⚠️