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 脚本
ndk-build 学习笔记的更多相关文章
- Android Native 代码NDK开发学习笔记
引用:http://www.kunli.info/2011/08/21/android-native-code-study-note/ JNI,全称Java Native Interface,是用于让 ...
- Android NDK开发及OpenCV初步学习笔记
https://www.jianshu.com/p/c29bb20908da Android NDK开发及OpenCV初步学习笔记 Super_圣代 关注 2017.08.19 00:55* 字数 6 ...
- NDK开发_笔记0
自谷歌搜索退出中国以来,谷歌对全球第二大市场中国的态度一直保持冷淡.可是北京时间12月8日,谷歌2016开发者大会在北京召开,同时专门针对中国的谷歌开发者网站已经上线:https://develope ...
- android cocos2d-x for Android安装和学习笔记(请用adt-bundle21.1或以上导入)
引用:http://weimingtom.iteye.com/blog/1483566 (20121108)注意:这篇文章用cdt编译ndk工程的内容已过时(现在可以用adt-bundle,避免配置繁 ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- maven权威指南学习笔记(三)——一个简单的maven项目
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- OpenCV学习笔记(一)——OpenCV3.1.0+VS2015开发环境配置
摘要: 由于最近AR(增强现实)这个概念非常火爆,各种基于AR的应用及游戏逐渐面向大众,而在AR中最重要的两个技术就是跟踪识别和增强渲染,其中跟踪识别是通过OpenCV这个开源的计算机视觉库来实现的, ...
- Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
随机推荐
- java中面向对象的三大特性小结
java中面向对象的三大特性:封装.继承.多态 封装 把抽象的数据和对数据的操作封装在一起,隐藏变量的实现细节.数据被保护在内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行访问. 1 ...
- phpstorm主题设置
毫无疑问,phpstorm很好用,但是安装完成后自带的主题,丑的一匹,所以总结下如何更换主题............. 1.主题下载位置 http://www.phpstorm-themes.com ...
- python数据处理
1.数据清洗 1.1 数据格式化 数据格式化是数据清洗常见的形式之一,就是将可读性差的或无法阅读的数据转换成可读性较强的数据格式. python对字符串和数字都有格式化的方法,如%s, %d分别代表格 ...
- ADO.NET教程(1)初识ado.net
ADO.NET简介 ADO.NET使用到的类 需掌握的方法和属性 ado.net连接实例 ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的 ...
- 迟到的UED(转发)
2013UCAN用户体验设计论坛–精彩视频赏析 - 交互设计 博文 视觉设计 | TaoBaoUEDhttp://ued.taobao.org/blog/2013/09/2013ucan/
- oracle 常用操作记录--持续更新...
一.oracle grant 授权语句(转自:https://www.cnblogs.com/yt954437595/p/6488819.html) --select * from dba_users ...
- 冒泡排序——Java实现
一.排序思想 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复以上的步骤, ...
- java中的集合和视图
一.集合的概念 何为集合,集合就是相当于一个对象的容器.集合是类似数组的一个作用.既然有了数组,为何还要有集合呢,由于数组对象一旦创建,其大小便不可以更改,我们只能往数组中存放创建时数量的对象.而集合 ...
- PAT 1070 Mooncake
题目意思能搞成这样我也是服了这个女人了 #include <cstdio> #include <cstdlib> #include <vector> #includ ...
- Jupyter Notebook(iPython)
一.Jupyter Notebook介绍 1.什么是Jupyter Notebook Jupyter Notebook是基于网页的用于交互计算的应用程序.其可被应用于全过编码开发.文档编写.运行代码和 ...