1.  增加一个项目与android编译中枢息息相关。特别需要告诉编译中枢的一些特别信息。

例如:

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

他山之石,可以攻玉,看下别人的总结

显然,我们需要用到的是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 ;
}

NO3 编写Android.mk文件

 ########################################
# jeff
# jan 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文件即可。

android编译架构之添加C项目的更多相关文章

  1. mtk Android 编译命令自定义--添加版本号

    1. alps\build\core\Makefile文件:(参照CUSTOM_BUILD_VERNO) ifeq "" "$(SURPLUS_BUILD_VERNO)& ...

  2. (1)-Android学习笔记之:初识Android系统架构和项目结构

    Android系统架构 Android程序结构 创建一个Android项目,为初学便于理解,将程序项目结构切换为Project模式,项目结构如下 .gradle和.idea:这两个目录下放的都是And ...

  3. Android二维码识别 开源项目ZXing的编译

    Android二维码识别 开源项目ZXing的编译 Android端的条形码/二维码识别功能 因为手机端的输入不是很方便,所以条形码/二维码的扫描是一种很有效的解决手段. 比较流行的手机应用中,常用的 ...

  4. Qualcomm Android display架构分析

    Android display架构分析(一) http://blog.csdn.net/BonderWu/archive/2010/08/12/5805961.aspx http://hi.baidu ...

  5. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

  6. Android App 架构演变

    文:https://www.jianshu.com/p/ce26e7960926 最近App项目(MVC架构)越做越大,协同开发效率较低,维护困难,所以产生了调整架构的想法,在 简书.csdn.知乎上 ...

  7. 为 Android 编译并集成 FFmpeg 的尝试与踩坑

    前言与环境说明 随着 FFmpeg.NDK 与 Android Studio 的不断迭代,本文可能也会像我参考过的过期文章一样失效(很遗憾),但希望本文中提到的问题排查以及步骤说明能够帮到你,如果发现 ...

  8. 转载: android 学习架构

    http://www.cnblogs.com/forlina/archive/2011/06/29/2093332.html 引言 通过前面两篇: Android 开发之旅:环境搭建及HelloWor ...

  9. Android程序架构基本内容概述

    在Android操作系统中开发的应用程序都有一个结构缜密的架构.我们今天就来对这一Android程序架构做一个详细的分析.帮助大家了解程序开发的特点,以方便将来在应用程序开中明确自己的程序架构. An ...

随机推荐

  1. httpsqs 源码修改(内部自动复制多队列)

    /* HTTP Simple Queue Service - httpsqs v1.7 Author: Zhang Yan (http://blog.s135.com), E-mail: net@s1 ...

  2. sqlite如何避免重复建表(获取已经存在的表)

    找到已经存在的所有表,手动判断是否需要建表 SELECT name FROM SQLITE_MASTER WHERE type='table'ORDER BY name" 建表时sqlite ...

  3. AtCoder Grand Contest 033

    为什么ABC那么多?建议Atcoder多出些ARC/AGC,好不容易才轮到AGC…… A 签到.就是以黑点为源点做多元最短路,由于边长是1直接bfs就好了,求最长路径. #include<bit ...

  4. Java面试宝典2017

    JAVA面试.笔试题(2017版)                 欲想成功,必须用功!   目录 一.                  HTML&CSS部分................ ...

  5. 没有更好的,五种操作系统助力研发,IMX6开发板做得到

    核心板参数 尺寸 51mm*61mm 四核商业级-2G NXP 四核 i.MX6Q,主频 1 GHz 内存:2GB DDR3:存储:16GB EMMC:SATA接口:支持 双核商业级-1G NXP 双 ...

  6. 吴裕雄--天生自然python学习笔记:python 用firebase实现英汉词典进阶版

    用 post 方法创建的数据会自动产生一个 id (Key ),但有时也常常为了取得这个 id 而让程序难以处理 . 以英汉词典标准版来说,它的数据结构如下: 如果将每条数据都改为{eword:cwo ...

  7. CentOS-Apache服务(1)

    title date tags layout CentOS6.5 配置Apache及多站点VirtualHost 2018-08-29 Centos6.5服务器搭建 post 1.安装httpd服务 ...

  8. 61)PHP,立即跳转

    一般使用   header(‘Location:’)来进行跳转. ******************************************************************* ...

  9. Android下的鉴权实现方案

    软件原理 不赘述,参考: 软件License认证方案的设计思路 License文件离线鉴权 机械指纹,不可逆的加密算法,如MD5 功能鉴权,可逆的不对称加密算法,服务端公钥加密,app端私钥解密,如R ...

  10. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-模拟接口响应数据(18)

    这里是把传入的请求数据作为响应值返回 # -*- coding: utf-8 -*- # @Time : 2020/2/15 9:47 # @File : do_mock_18.py # @Autho ...