android編譯架構之添加C項目

來源:互聯網
上載者:User

標籤:

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.mk10 BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk11 BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk12 BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk13 BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk14 BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk15 BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk16 BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk17 BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk18 BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk19 BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk20 BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk21 BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk22 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\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.c17 18 LOCAL_C_INCLUDES :=$(addprefixinclude/,$(HELLO_HEADERS))19 LOCAL_SRC_FILES    := $(addprefix src/,$(HELLO_SRC))20 21 LOCAL_MODULE:= helloworld22 LOCAL_MODULE_TAGS := eng23 24 include $(BUILD_EXECUTABLE)

NO4 編譯,cd到helloworld目錄執行#mm

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

NO5 驗證,將helloworld拷貝到板子執行#./helloworld

 1 [email protected]_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.c5 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檔案即可。

 

android編譯架構之添加C項目

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.