美文网首页
编译原理与语法(三)——Android.mk

编译原理与语法(三)——Android.mk

作者: 王志强_9380 | 来源:发表于2019-10-10 17:09 被阅读0次

    简单的例子

    # 定义模块当前路径
    LOCAL_PATH := $(call my-dir)
    # 清空当前环境变量(LOCAL_PATH除外)
    include $(CLEAR_VARS)
    # 当前模块名(这里会生成hello-jni.so)
    LOCAL_MODULE := hello-jni
    # 当前模块包含的源代码文件
    LOCAL_SRC_FILES := hello-jni.c
    # 当前模块将被编译成一个共享库
    include $(BUILD_SHARED_LIBRARY)
    

    编译多个共享库

    LOCAL_PATH := $(call my-dir)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := module1
    LOCAL_SRC_FILES := module1.c
    include $(BUILD_SHARED_LIBRARY)
    
    include $(CLEAR_VARS)
    LOCAL_MODULE := module2
    LOCAL_SRC_FILES := module2.c
    include $(BUILD_SHARED_LIBRARY)
    

    这个会生成libmodule1.so和libmodule2.so两个动态库

    编译静态库

    虽然Android应用程序不能直接使用静态库,静态库可以用来编译动态库。
    比如在将第三方代码添加到原生项目中时,可以不用直接将第三方源码包括在原生项目中,而是将第三方源码编译成静态库,然后并入共享库

    LOCAL_PATH := $(call my-dir)
    
    # 第三方库
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := avilib.c platform_posix.c
    include $(BUILD_STATIC_LIBRARY)
    
    # 原生模块
    include $(CLEAR_VARS)
    LOCAL_MODULE := module
    LOCAL_SRC_FILES := module.c
    LOCAL_STATIC_LIBRARIES := avilib
    include $(BUILD_SHARED_LIBRARY)
    

    使用共享库共享通用模块

    静态库可以保证源代码模块化,但是当静态库与共享库相连时,它就变成了共享库的一部分。在多个共享库的情况下,多个共享库与静态库连接时,需要将通用模块的多个副本与不同的共享库重复相连,这样就增加了app的大小。这种情况下,可以将通用模块作为共享库

    LOCAL_PATH := $(call my-dir)
    
    # 第三方库
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := avilib.c platform_posix.c
    include $(BUILD_SHARED_LIBRARY)
    
    # 原生模块1
    include $(CLEAR_VARS)
    LOCAL_MODULE := module1
    LOCAL_SRC_FILES := module1.c
    LOCAL_SHARED_LIBRARIES := avilib
    include $(BUILD_SHARED_LIBRARY)
    
    # 原生模块2
    include $(CLEAR_VARS)
    LOCAL_MODULE := module2
    LOCAL_SRC_FILES := module2.c
    LOCAL_SHARED_LIBRARIES := avilib
    include $(BUILD_SHARED_LIBRARY)
    

    在多个NDK项目间共享模块

    # avilib模块自己的mk文件
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := avilib.c platform_posix.c
    include $(BUILD_SHARED_LIBRARY)
    
    # 原生模块1的mk文件
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := module1
    LOCAL_SRC_FILES := module1.c
    LOCAL_SHARED_LIBRARIES := avilib
    include $(BUILD_SHARED_LIBRARY)
    $(call import-module,transcode/avilib)
    
    # 原生模块2的mk文件
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := module2
    LOCAL_SRC_FILES := module2.c
    LOCAL_SHARED_LIBRARIES := avilib
    include $(BUILD_SHARED_LIBRARY)
    $(call import-module,transcode/avilib)
    

    使用预编译库

    • 想在不发布源码的情况下将模块发布给他人
    • 想使用共享模块的预编译版来加速编译过程
    LOCAL_PATH := $(call my-dir)
    # 第三方预编译的库
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := libavilib.so
    include $(PREBUILD_SHARED_LIBRARY)
    

    编译独立的可执行文件

    为了方便测试和快速开发,可以编译成可执行文件。不用打包成apk就可以直接复制到android设备上运行

    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := module
    LOCAL_SRC_FILES := module.c
    LOCAL_STATIC_LIBRARIES := avilib
    include $(BUILD_EXECUTABLE)
    

    相关文章

      网友评论

          本文标题:编译原理与语法(三)——Android.mk

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