• ndk-build 学习笔记


    # 必须以local_path 开头
    # 定位源文件
    LOCAL_PATH := $(call my-dir)

    #引入clear-vars.mk文件,清除除local_path以外的其他local_<name>变量
    Include $(CLEAR_VARS)

    # 每一个原声组件称为一个模块,local_modul变量用来给模块设定一个唯一名称
    LOCAL_MODULE := hello-jni
    # hello-jni模块会生成一个共享库文件且构建系统会将它命名为libhello-jni.so

    # local_src_files用于建立和组装这个模块的源文件列表
    LOCAL_SRC_FILES := hello-jni.c
    # local_src_files 可以包含用空格分开的多个源文件名

    # 1、构建共享库
    # 引入build-shared-library.mk文件,构建共享库
    inlcude $(BUILD_SHARED_LIBRARY)

    # 2、构建多个共享库
    LOCAL_PATH := $(call my-dir)

    # 模块1
    inlcude $(CLEAR_VARS)
    LOCAL_MODULE := module1
    LOCAL_SRC_FILES := module1.c
    include $(BUILD_SHARED_LIBRARY)

    # 模块2
    include $(CLEAR_VARS)
    LOCAL_MODULE := moludle2
    LOCAL_SRC_FILES := module2.c
    #include $(BUILD_SHARED_LIBRARY)


    # 3、构建静态库
    LOCAL_PATH := $(call-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)

    # 4、用共享库共享通用模块
    # 将通用模块作为共享库建立起来,而动态连接依赖模块以便消除重复的副本

    LOCAL_PATH := $(call my-dir)

    # 第三方avi库
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := avilib.c platform_posix.c

    include $(BUILD_SHARED_LIBRARY)
    # 重点,构建共享库,用于共享到原生模块1,和模块2

    # 原生模块1
    include $(CLEAR_VARS)
    LOCAL_MODULE := module1
    LOCAL_SRC_FILES := module1.c

    LOCLA_SHARED_LIBRARIES := avilib
    # local_shared_libraries 而不是static
    include $(BUILD_SHARED_LIBRARY)

    # 原生模块2
    include $(CLEAR_VARS)
    LOCAL_MODULE := module2
    LOCAL_SRC_FILES := module2.c

    LOCAL_SHARED_LIBRARIES := avilib

    include $(BUILD_SHARED_LIBRARY)

    # 5、在多个NDK项目间共享模块
    # 在如上mk脚本基础上加入如下一行脚本
    $(call import-module, transcode/avilib)
    # 默认情况下搜索<Android NDK>/sources 目录下的目录
    # 添加环境变量NDK_MODULE_PATH 为 transcode所在目录
    # 这样就可以搜索到transcode/avilib目录,并找到目录下的libavilib.so文件

    # 6、用Prebuilt库
    # 依然需要一个Android.mk构建文档
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE := avilib
    LOCAL_SRC_FILES := libavilib.so
    include $(PREBUILT_SHARED_LIBRARY)

    # local_src_files 指向了so库
    prebuilt_shared_library: 直接将so库复制到libs目录下
    prebuilt_static_library: 静态库可以像共享库一样被用作prebuilt库

    # 原生模块
    LOCAL_SHARED_LIBRARIES := avilib

    # 7、构建独立的可执行文件
    include $(CLEAR_VARS)
    LOCAL_MODULE := module
    LOCAL_SRC_FILES := module.c
    LOCAL_STATIC_LIBRARIES := avilib

    include $(BUILD_EXECUTABLE)
    # 使用build_executable 而不是 build_shared_library构建

    # 8、其他构建系统变量
    #构建系统定义的变量:
    #TARGET_ARCH: 目标cpu体系结构的名称,例如arm
    #TARGET_PLATFORM:目标Android平台的名称,例如android-3
    #TARGET_ARCH_ABI:目标cpu体系结构和ABI的名称,例如armeabi-v7a
    #TARGET_ABI:目标平台和ABI的串联,例如 android-3-armeabi-v7a

    # 可被定义为模块说明部分的变量
    #LOCAL_MODULE_FILENAME: 可以用来覆盖LOCAL_MODULE的值
    #LOCAL_CPP_EXTENSION:c++源文件的扩展名,默认为.cpp,可以指定多个
    LOCAL_CPP_EXTENSION :=.cpp .cxx
    #LOCAL_CPP_FEATURES: 用来指明模块所依赖的具体c++特性,如RTTI,exceptions等
    LOCAL_CPP_FEATURES := rtti
    #LOCAL_C_INCLUDES:用于搜索头文件, 默认为NDK安装目录的相对路径
    LOCAL_C_INCLUDES := sources/shared-module
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
    #LOCAL_CFLAGS: 编译器标志,在编译c和c++源文件的时候会被传送给编译器
    LOCAL_CFLAGS := -DNDEBUG -DPORT=1234
    #LOCAL_CPP_FLAGS: 编译器标志,只在编译c++源文件时传送给编译器
    #LOCAL_WHOLE_STATIC_LIBRARIES: LOCAL_STATIC_LIBRARIES 的变体,用来指明应该被包含在生成的共享库中的所有静态库内容
    # 当几个静态库之间有循环依赖时,LOCAL_WHOLE_STATIC_LIBRARIES很有用

    #LOCAL_LDLIBS: 链接标志的可选列表,当对目标文件进行连接以生成输出文件时,该标志将被传送给连接器。
    LOCAL_LDFLAGS := -llog #要与Android NDK日志库链接

    #LOCAL_ALLOW_UNDEFINED_SYMBOLS: 禁止在生成的文件中进行缺失符号检查。
    #LOCAL_ARM_MODE: arm 机器体系结构特有变量,用于指定要生成arm 还是thumb指令,默认thumb
    LOCAL_ARM_MODE := arm
    # 可以单独用.arm 扩展名指定只在arm模式下构建特定文件
    LOCAL_SRC_FILES := file1.c file2.c.arm
    #LOCAL_ARM_NEON: arm 体系特有变量,用于指定源文件中应该使用的arm高级单指令流多数据流(SIMD , aka NEON) 内联函数
    LOCAL_ARM_NEON :=true
    # 同上可以单独使用.neon扩展名指定特定文件
    LOCAL_SRC_FILES := file1.c file2.c.neon
    #LOCAL_DISABLE_NO_EXECUTE: 用来禁止 NX Bit安全特性
    #LOCAL_EXPORT_CFLAGS: 该变量记录一组编译器标志,这些标记会被添加到通过变量LOCAL_STATIC_LIBRARIES或LOCAL_SHARED_LIBRARIES 使用的本地模块的其他模块的LOCAL_CFLAGS定义中

    #LOCAL_EXPORT_CPPFLAGS:同上,仅用于C++特定代码编译器标识
    #LOCAL_EXPORT_LDFLAGS:同LOCAL_EXPORT _CFLAGS, 但用作连接器标志
    #LOCAL_EXPORT_C_INCLUDES:该变量允许记录路径集
    #LOCAL_SHORT_COMMANDS: 优化编译 (一堆内容,看不懂)
    #LOCAL_FILTER_ASM:用于过滤来自LOCAL_SRC_FILES变量的装配文件的应用程序;

    # 9、其他构建系统函数宏
    # all-subdir-makefiles: 返回当前目录的所有子目录的Android.mk构建文件列表。
    include $(call all-subdir-makefiles)

    # this-makefile: 返回当前Android.mk构建文件的路径
    # parent-makefile: 返回包含当前构建文件的父Android.mk构建文件的路径
    # grand-parent-makefile: 看名字喽

    # 10、定义新变量
    # 以MY_开头自定义变量
    MY_SRC_FILES := avilib.c platform_posix.c
    LOCAL_SRC_FILES := $(addprefix avilib/, $(MY_SRC_FILES))

    # 11、条件操作

    ifeq ($(TARGET_ARCH), arm)
    LOCAL_SRC_FILES += armonly.c
    else
    LOCAL_SRC_FILES += generic.c
    endif

    # Application.mk
    #APP_MODULES: 覆盖Android.mk中的模块,并提供一个用空格分开的需要构建的模块列表
    #APP_OPTIM: 可以为release 或者 release模式生成二进制文件
    #APP_CLAGS: 列出一些编译器标识
    #APP_CPPFLAGS: 同上,仅限于c++源文件
    #APP_BUILD_SCRIPT: 默认情况下,NDK 构建系统在jni子目录下查找Android.mk文件,该变量可以修改上述行为
    #APP_ABI: 可以生成x86 mips等api二进制文件
    #APP_STL: 默认情况下,NDK使用最小STL运行库,可以旋转stl
    APP_STL := stlport_shared
    #APP_GNUSTL_FORCE_CPP_FEATURES: 所有模块都依赖于具体的c++特性, RTTI,exceptions等(相似于 LOCAL_CPP_EXTENSIONS)
    #APP_SHORT_COMMANDS: 编译优化(LOCAL_SHORT_COMMANDS)


    # 使用ndk-build脚本
    # -C 指定ndk的位置
    ndk-build -C /path/to/the/project

    # -B 强制重新构建
    ndk-build -B

    # clean
    ndk-build clean

    # 并行执行 -j
    ndk-build -j 4

    参考:《Android C++高级编程》
    2.4.1 Android.mk
    2.4.2 Application.mk
    2.5 使用ndk-build 脚本

  • 相关阅读:
    使用过滤器对权限进行过滤,就是对访问的url地址进行判断
    百度上传文件到写入数据库之六
    百度上传文件到写入数据库之五
    百度上传文件到写入数据库之四
    百度上传文件到写入数据库之三
    百度上传文件到写入数据库之二
    百度上传文件到写入数据库之一
    FileUpLoad
    文件上传后台解说
    "/FileUpLoad"文件的说明
  • 原文地址:https://www.cnblogs.com/fog2012/p/5849207.html
Copyright © 2020-2023  润新知