android編譯架構之添加C項目

1.  增長一個項目與android編譯中樞息息相關。特別須要告訴編譯中樞的一些特別信息。java

例如:android

A 這個項目target名字是什麼shell

B 這個項目編譯類型是什麼,bin?c?lib?or jar?ui

C 這個項目對應的variant是什麼,此項說明不一樣的variant將會把輸出結果放到不一樣的產品目錄下。spa

D 這個項目應該放在哪裏?首選目標是external及vendor目錄,爲何呢,我只能說是爲了一致性,其實放哪裏,理論上都是能夠的。code

2. 項目類型定義:orm

基本項目類型定義都會在jb/build/core/config.mk文件中定義。blog

 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。get

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\n",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文件便可。

相關文章
相關標籤/搜索