Android.mk 多级嵌套编译的手记

基本流程如下

在JNI下(第一层嵌套)

 include $(CLEAR_VARS) 

之后

$(call import-add-path, $(LOCAL_PATH)/external)

这里是告诉ndk, 添加一个模块的目录, 这里仅仅是添加目录, 实际还没有执行

在最后需要把moudle import进入这次编译,路径就定义 . 就可以了,之前在import-add-path已经把目录包含进来

include $(BUILD_SHARED_LIBRARY)
$(call import-module,.)

第二层Android.mk

把需要的组件目录添加 这个目录下多是自己封装的cpp/c文件
如果有第三方组件的头文件,但是木有在下层Android.mk封装的话,需要

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/curl

包第三方库的头文件包含进来,在编译时会自动到这个目录下查找,如果没有的话就不需要了

在第二层Android.mk下,首先需要把自己封装的cpp/c都

LOCAL_SRC_FILES :=\
LOCAL_C_INCLUDES := $(LOCAL_PATH) \

一下, 这里可以使用*.cpp通配符查找目录下所有cpp/c文件,当然这次是手写的
这是LOCAL_PATH还是当前的目录,所以大胆的放心使用
在这里需要把编译查询包含进来,比如

LOCAL_CFLAGS  := -DUSE_FILE32API -fexceptions -DANDROID

LOCAL_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat

LOCAL_EXPORT_CFLAGS  := -DUSE_FILE32API

LOCAL_EXPORT_CPPFLAGS := -Wno-deprecated-declarations -Wno-extern-c-compat

嵌套自己写的cpp/c就到此为止了,在第三层Android.mk下,会发现LOCAL_PATH成了ndk-bundle,估计是自己乱import-add-path的后果

最后有需要依赖第三方库的话

include $(BUILD_SHARED_LIBRARY)

$(call import-module, thridlibrary/android/curl/prebuilt/android)

$(call import-module, xxx/zlib/prebuilt/android)

把第三方库的路径import-module进来, 这是后import-module的付目录是第一层 import-add-path的路径,所以在这里不需要add-import一次

在第三层Android.mk

这里最主要的工作就是把第三方的静态库包含进来
完整的路径如下

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := medium_curl_static

LOCAL_MODULE_FILENAME := curl

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcurl.a

LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../include/curl

LOCAL_STATIC_LIBRARIES += medium_ssl_static

LOCAL_STATIC_LIBRARIES += medium_crypto_static

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := medium_crypto_static

LOCAL_MODULE_FILENAME := crypto

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libcrypto.a

include $(PREBUILT_STATIC_LIBRARY)

include $(CLEAR_VARS)

LOCAL_MODULE := medium_ssl_static

LOCAL_MODULE_FILENAME := ssl

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libssl.a

include $(PREBUILT_STATIC_LIBRARY)

记录一个坑, 在 ndk的不知道什么版本, crypto编译会抛出一个bsd_signal的错误,这时切换到底版本的ndk,谁特么知道什么原因,下次再纠结这个问题吧

你可能感兴趣的:(Android.mk 多级嵌套编译的手记)