android编译架构之添加C项目
2015-07-28 11:57
886 查看
1. 增加一个项目与android编译中枢息息相关。特别需要告诉编译中枢的一些特别信息。
例如:
A 这个项目target名字是什么
B 这个项目编译类型是什么,bin?c?lib?or jar?
C 这个项目对应的variant是什么,此项说明不同的variant将会把输出结果放到不同的产品目录下。
D 这个项目应该放在哪里?首选目标是external及vendor目录,为什么呢,我只能说是为了一致性,其实放哪里,理论上都是可以的。
2. 项目类型定义:
基本项目类型定义都会在jb/build/core/config.mk文件中定义。
他山之石,可以攻玉,看下别人的总结
![](http://images0.cnblogs.com/blog2015/483365/201507/281105062033639.png)
显然,我们需要用到的是BUILD_EXECUTABLE。
OK,开始干活,在external目录下创建helloworld目录。
helloworld
|----inclued
| |-----hello.h
|----src
| |-----main.c
|----Android.mk
NO1 编写hello.h的代码。目录是helloworld/include下面
NO2 编写main.c的代码。目录是helloworld/src下面
NO3 编写Android.mk文件
NO4 编译,cd到helloworld目录执行#mm
Install: out/target/product/cv6a628h_base/system/bin/helloworld
NO5 验证,将helloworld拷贝到板子执行#./helloworld
shell@cv6a628h_base:/system/bin # ./helloworld hello world
NO6 回看Android.mk
三个变量:
a LOCAL_PATH:= $(call my-dir)
他山之石可以攻玉,看下别人解释
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。
b include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
c include $(BUILD_EXECUTABLE),上面已解释过,这里不说了。
d:我为什么要这样写Android.mk
主要源自别人的写法,觉得好,假设有include下有n个.h 或者src下n个 .c文件时候,此时这个写法很有作用了,仅需要在HELLO_HEADERS和HELLO_SRC下添加头文件及c文件即可。
例如:
A 这个项目target名字是什么
B 这个项目编译类型是什么,bin?c?lib?or jar?
C 这个项目对应的variant是什么,此项说明不同的variant将会把输出结果放到不同的产品目录下。
D 这个项目应该放在哪里?首选目标是external及vendor目录,为什么呢,我只能说是为了一致性,其实放哪里,理论上都是可以的。
2. 项目类型定义:
基本项目类型定义都会在jb/build/core/config.mk文件中定义。
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk BUILD_NOTICE_FILE := $(BUILD_SYSTEM)/notice_files.mk
他山之石,可以攻玉,看下别人的总结
![](http://images0.cnblogs.com/blog2015/483365/201507/281105062033639.png)
显然,我们需要用到的是BUILD_EXECUTABLE。
OK,开始干活,在external目录下创建helloworld目录。
helloworld
|----inclued
| |-----hello.h
|----src
| |-----main.c
|----Android.mk
NO1 编写hello.h的代码。目录是helloworld/include下面
#include <stdio.h> #include <stdlib.h> #ifndef __HELLO_H #define __HELLO_H void makePrintf(char *str) { printf("%s\n",str); } #endif
NO2 编写main.c的代码。目录是helloworld/src下面
#include "include/hello.h" int main() { makePrintf("hello world"); return 0; }
NO3 编写Android.mk文件
######################################## # jeff # jan 2015 LOCAL_PATH:= $(call my-dir) ######################### # Build helloworld by jeff include $(CLEAR_VARS) HELLO_HEADERS := \ hello.h HELLO_SRC := \ main.c LOCAL_C_INCLUDES :=$(addprefixinclude/,$(HELLO_HEADERS)) LOCAL_SRC_FILES := $(addprefix src/,$(HELLO_SRC)) LOCAL_MODULE:= helloworld LOCAL_MODULE_TAGS := eng include $(BUILD_EXECUTABLE)
NO4 编译,cd到helloworld目录执行#mm
Install: out/target/product/cv6a628h_base/system/bin/helloworld
NO5 验证,将helloworld拷贝到板子执行#./helloworld
shell@cv6a628h_base:/system/bin # ./helloworld hello world
NO6 回看Android.mk
三个变量:
a LOCAL_PATH:= $(call my-dir)
他山之石可以攻玉,看下别人解释
每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。返回包含Android.mk的目录路径。
b include $(CLEAR_VARS)
CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。
c include $(BUILD_EXECUTABLE),上面已解释过,这里不说了。
d:我为什么要这样写Android.mk
HELLO_HEADERS := \ hello.h HELLO_SRC := \ main.c LOCAL_C_INCLUDES := $(addprefix include/,$(HELLO_HEADERS)) LOCAL_SRC_FILES := $(addprefix src/,$(HELLO_SRC))
主要源自别人的写法,觉得好,假设有include下有n个.h 或者src下n个 .c文件时候,此时这个写法很有作用了,仅需要在HELLO_HEADERS和HELLO_SRC下添加头文件及c文件即可。
相关文章推荐
- bootstrap网站样式使用一
- 为什么架构于开源之上?
- 为什么架构于开源之上?
- Android Media架构
- 八点掌握网站设计的要领
- .NET应用架构设计—四色原型模式(色彩造型、域无关的模型)(概念版)
- 中国最早论坛聚合门户:大旗网突然关站
- 【html5构建触屏网站】之touch事件
- [技术新闻]相关网站
- 开源网站
- 基于keepalived双主模型的高可用LVS
- 基于keepalived双主模型的高可用LVS
- RMS 向开源硬件众筹网站送去祝福
- 主要软件类型 适用 的几种典型的 架构模式
- 测试server是否block port或者网站
- 基于keepalived双主模型的高可用LVS
- 好的淘宝网站
- 《开源公开课1》:开源框架构建与实践
- Neutron - keepalived + allow_address_pairs实现虚拟机高可用
- 移动平台3G手机网站前端开发布局技巧