• android编译架构之添加C项目


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

    例如:

    A 这个项目target名字是什么

    B 这个项目编译类型是什么,bin?c?lib?or jar?

    C 这个项目对应的variant是什么,此项说明不同的variant将会把输出结果放到不同的产品目录下。

    D 这个项目应该放在哪里?首选目标是external及vendor目录,为什么呢,我只能说是为了一致性,其实放哪里,理论上都是可以的。

    2. 项目类型定义:

    基本项目类型定义都会在jb/build/core/config.mk文件中定义。

     1 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
     2 BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
     3 BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
     4 BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
     5 BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
     6 BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
     7 BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
     8 BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
     9 BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
    10 BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
    11 BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk
    12 BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
    13 BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
    14 BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
    15 BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
    16 BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
    17 BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
    18 BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
    19 BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
    20 BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk
    21 BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk
    22 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下面

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #ifndef __HELLO_H
     5 #define __HELLO_H
     6 
     7 void makePrintf(char *str)
     8 {
     9         printf("%s
    ",str);
    10 }
    11 
    12 #endif

    NO2 编写main.c的代码。目录是helloworld/src下面

    1 #include "include/hello.h"
    2 int main()
    3 {
    4         makePrintf("hello world");
    5         return 0;
    6 }

    NO3 编写Android.mk文件

     1 ########################################
     2 # jeff
     3 # jan 2015
     4 
     5 LOCAL_PATH:= $(call my-dir)
     6 
     7 #########################
     8 # Build helloworld by jeff
     9 
    10 include $(CLEAR_VARS)
    11 
    12 HELLO_HEADERS := 
    13                 hello.h 
    14 
    15 HELLO_SRC := 
    16                 main.c
    17 
    18 LOCAL_C_INCLUDES :=$(addprefixinclude/,$(HELLO_HEADERS))
    19 LOCAL_SRC_FILES    := $(addprefix src/,$(HELLO_SRC))
    20 
    21 LOCAL_MODULE:= helloworld
    22 LOCAL_MODULE_TAGS := eng
    23 
    24 include $(BUILD_EXECUTABLE)

    NO4 编译,cd到helloworld目录执行#mm

    Install: out/target/product/cv6a628h_base/system/bin/helloworld

    NO5 验证,将helloworld拷贝到板子执行#./helloworld

     1 shell@cv6a628h_base:/system/bin # ./helloworld 2 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

    1 HELLO_HEADERS := 
    2     hello.h 
    3 HELLO_SRC := 
    4         main.c
    5 LOCAL_C_INCLUDES := $(addprefix include/,$(HELLO_HEADERS))
    6 LOCAL_SRC_FILES  := $(addprefix src/,$(HELLO_SRC))

    主要源自别人的写法,觉得好,假设有include下有n个.h 或者src下n个 .c文件时候,此时这个写法很有作用了,仅需要在HELLO_HEADERS和HELLO_SRC下添加头文件及c文件即可。

     

  • 相关阅读:
    boost::asio发送与传输相关的几个函数,备忘
    当ASIO::ASYNC_READ与SOCKET的ASYNC_READ_SOME的区别
    boost::asio keepalive
    boost asio ——深入框架
    Boost.Asio和ACE之间关于Socket编程的比较
    OCP-1Z0-052-V8.02-15题
    JavaScript对象和数组
    Oracle 11g New 使用RMAN 增强功能
    Flex中集合的类型
    Flex中基于列表的一系列MX组件及相互关系
  • 原文地址:https://www.cnblogs.com/kernel-style/p/4682373.html
Copyright © 2020-2023  润新知