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 脚本

时间: 2024-10-13 23:26:09

ndk-build 学习笔记的相关文章

String Buffer 和 String Build学习笔记

public class Concatenation {   public static void main(String[] args) {     String mango = "mango";     String s = "abc" + mango + "def" + 47;     System.out.println(s);   } } /* Output: abcmangodef47 *///:~ 引入一段代码,大家都知道"

Android NDK学习笔记(一) 为什么要用NDK?

NDK是什么 NDK是Native Development Kit的简称,即本地开发工具包.通过NDK,Android允许开发人员使用本地代码语言(例如C/C++)来完成应用的部分(甚至全部)功能.注意:由于翻译原因,有些地方也把Native翻译为"原生". NDK是SDK的一个补充,可以帮助你做这些事情: 生成可以在ARM CPU,Android 1.5(及以上)平台运行的JNI兼容的共享库. 将生成的共享库放置在应用程序项目路径的合适位置,使其能自动地添加进你最终的(和经过签名的)

Android深度探索(卷1)HAL与驱动开发学习笔记(2)

Android深度探索(卷1)HAL与驱动开发学习笔记(2) 第二章搭建Android开发环境 书中介绍了两种JDK的安装方法, 方法一: 从官网下载JDK并进行配置,解压后在终端打开profile文件来设置PATH环境变量(# soure /etc/profile),打开profile文件后输入下面的内容 export PATH=.:developer/jdk6/bin:$PATH 保存profile文件以后,有两种方法可以重新加载profile文件. 1.# sourse  /etc/pro

cocos2dx学习笔记(2)

昨天尝试了cocos2dx在win下的开发环境配置,并且运行了cocos的helloword程序,晚上想要尝试一下android开发环境配置,顺便学习cocos在eclipse下的JNI机制,按照cocoa中文论坛的android环境配置弄了NDK,并配置了环境变量,由于想要学习cocos的luabind机制(这个我们公司游戏的引擎用的很多,确实比较有兴趣),一切搞定不明就里的用eclipse导入了cocos3.0rc中的tests目录下的cpp-tests工程(这算android开发久了的毛病

七、Android学习笔记_JNI hello world

1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同. : ${ORIGINAL_PATH=${PATH}} if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then PATH="/usr/local/bi

Android学习笔记_JNI hello world

1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 2.开发步骤: a.创建一个android工程 b.JAVA代码中写声明 native 方法 public native String helloFromJNI(); 通过javah 包名.类名生成jni的方法签名 c. 创建jni目录,编写c代码,方法名字要对应.或者将生成的签名文件拷贝到jni目录,然后在c代码中引入. d.编写Android.mk文件 e.Ndk编译生成动态库(

Android深度探索(卷1)HAL与驱动开发学习笔记(4)

Android深度探索(卷1)HAL与驱动开发学习笔记(4) 第四章  源代码的下载与编译 一.源代码配置Android源代码下载环境 1.建一个用于存放下载脚本文件(repo)的目录 # mkdir ~/bin # PATH=~.bin:$PATH 2.下载repo脚本文件 # curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo #chmod a+x ~/bin/repo 3.创建用于存放Andro

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

storm学习笔记完整记录(一)

storm有两种运行模式(本地模式和集群模式) 1. 首先创建一个类似于HelloWorld的简单程序,以便进入storm的大门,包结构如下: 2.从包结构可以知道,这是一个Maven Project,pom.xml的内容如下: <project xmlns="http://maven.apache.org/POM/4.0.0"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    

Caffe学习笔记3

Caffe学习笔记3 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing http://caffe.berkeleyvision.org/gathered/examples/feature_extraction.html 这篇博客主要是用imagenet的一个网络模型来对自己的图片进行训练和测试 图片下载网