美文网首页Android开发计算机基础
Android.mk 多级嵌套编译的手记

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

作者: 睡后3k | 来源:发表于2016-03-28 23:42 被阅读1191次

    基本流程如下

    在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 多级嵌套编译的手记

        本文链接:https://www.haomeiwen.com/subject/ubexlttx.html