A. android.mk怎麼在jni編譯時把系統頭文件包含
Android 2.3.6:LOCAL_CPP_FEATURES: 可選。用來指定C++ features。 LOCAL_CPP_FEATURES := rtti LOCAL_CPP_FEATURES := exceptions 2.3.7:LOCAL_C_INCLUDES: 一個可選的path列表。相對於NDK ROOT 目錄。編譯時,將會把這些目錄附上。 LOCAL_C_INCLUDES := sources/foo LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo 2.3.8: LOCAL_CFLAGS: 一個可選的設置,在編譯C/C++ source 時添加如Flags。 用來附加編譯選項。 注意:不要嘗試在此處修改編譯的優化選項和Debug等級。它會通過您Application.mk中的信息自動指定。 也可以指定include 目錄通過:LOCAL_CFLAGS += -I<path>。 這個方法比使用LOCAL_C_INCLUDES要好。因為這樣也可以被ndk-debug使用。 2.3.9: LOCAL_CXXFLAGS: LOCAL_CPPFLAGS的別名。 2.3.10: LOCAL_CPPFLAGS: C++ Source 編譯時添加的C Flags。這些Flags將出現在LOCAL_CFLAGS flags 的後面。 2.3.11: LOCAL_STATIC_LIBRARIES: 要鏈接到本模塊的靜態庫list。(built with BUILD_STATIC_LIBRARY) 2.3.12: LOCAL_SHARED_LIBRARIES: 要鏈接到本模塊的動態庫。 2.3.13:LOCAL_WHOLE_STATIC_LIBRARIES: 靜態庫全鏈接。 不同於LOCAL_STATIC_LIBRARIES,類似於使用--whole-archive 2.3.14:LOCAL_LDLIBS: linker flags。 可以用它來添加系統庫。 如 -lz: LOCAL_LDLIBS := -lz 2.3.15: LOCAL_ALLOW_UNDEFINED_SYMBOLS: 2.3.16: LOCAL_ARM_MODE: 預設模式下,ARM目標代碼被編譯為thumb模式。每個指令16位。如果指定此變數為:arm。 則指令為32位。 LOCAL_ARM_MODE := arm 其實也可以指定某一個或者某幾個文件的ARM指令模式。 2.3.17: LOCAL_ARM_NEON: 設置為true時,會講浮點編譯成neon指令。這會極大地加快浮點運算(前提是硬體支持) 只有targeting 為 'armeabi-v7a'時才可以。 2.3.18:LOCAL_DISABLE_NO_EXECUTE: 2.3.19: LOCAL_EXPORT_CFLAGS: 定義這個變數用來記錄C/C++編譯器標志集合, 並且會被添加到其他任何以LOCAL_STATIC_LIBRARIES和LOCAL_SHARED_LIBRARIES的模塊的LOCAL_CFLAGS定義中 LOCAL_SRC_FILES := foo.c bar.c.arm 注意:此處NDK版本為NDK R7C.(不同NDK版本,ndk-build所產生的Makefile並不完全相同)
B. android studio android.mk在哪
Android.mk文件首先需要指定LOCAL_PATH變數,用於查找源文件,宏函數』my-dir』, 由編譯系統提供。由於一般情況下Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:
LOCAL_PATH:=$(call my-dir)
上面的語句的意思是 將LOCAL_PATH變數定義成 本文件所在 目錄路徑。
一個 Android.mk中 可以 定義 多個編譯模塊,每個編譯模塊 都是 以include $(CLEAR_VARS)開始
以include $(BUILD_XXX)結束
相關鏈接:http://blog.csdn.net/wh_19910525/article/details/7518190
C. android mk文件怎麼打開
.mk後綴名文件類型:Makefile擴展名為.mk的文件是一個開發文件。Makefile規則如下所示目標:依賴文件列表命令列表1、目標通常是要產生的文件名稱,目標可以是可執行文件或obj文件,也可是一個動作的名稱.2、依賴文件是用來輸入從而產生目標的文件
D. 如何在Android系統源碼的環境下用make來編譯
第一個方法簡單點,不過需要在Android系統源碼的環境下用make來編譯:
1. 在應用程序的AndroidManifest.xml中的manifest節點中加入
android:sharedUserId="android.uid.system"這個屬性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
3. 使用mm命令來編譯,生成的apk就有修改系統時間的許可權了。
E. Android make 基礎
Android編譯演進過程:
build/ 目錄下
source build/envsetup.sh
輸入指令hmm 就可以查看信息
lunch 2
通過soong執行編譯構建,這里執行make命令時,main.mk文件把一些環境變數和目標都配置好後,會執行envsetup.sh中的make()進行編譯。
build/soong/soong_ui.bash --make-mode
------->
soong的編譯過程:
soong_ui.bash 調用流程:
可以看到include 了main.mk文件,從main.mk開始,將通過include命令將其所有需要的.mk文件包含進來,最終在內存中形成一個包括所有編譯腳本的集合,這個相當於一個巨大Makefile文件。Makefile文件看上去很龐大,其實主要由三種內容構成: 變數定義、函數定義和目標依賴規則,此外mk文件之間的包含也很重要。
5.工具鏈的關系
REF
https://blog.csdn.net/yiranfeng/article/details/109082489
F. android.mk文件怎麼寫
一個Android.mk file用來向編譯系統描述你的源代碼。具體來說:該文件是GNU Makefile的一小部分,會被編譯系統解析一次或多次。你可以在每一個Android.mk file中定義一個或多個模塊,你也可以在幾個模塊中使用同一個源代碼文件。編譯系統為你處理許多細節問題。例如,你不需要在你的Android.mk中列出頭文件和依賴文件。NDK編譯系統將會為你自動處理這些問題。這也意味著,在升級NDK後,你應該得到新的toolchain/platform支持,而且不需要改變你的Android.mk文件。
先看一個簡單的例子:一個簡單的"hello world",比如下面的文件:
sources/helloworld/helloworld.c
sources/helloworld/Android.mk
相應的Android.mk文件會象下面這樣:
---------- cut here ------------------
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE
:= helloworld
LOCAL_SRC_FILES := helloworld.c
include $(BUILD_SHARED_LIBRARY)
---------- cut here ------------------
我們來解釋一下這幾行代碼:
LOCAL_PATH := $(call my-dir)
一個Android.mk file首先必須定義好LOCAL_PATH變數。它用於在開發樹中查找源文件。在這個例子中,宏函數』my-dir』, 由編譯系統提供,用於返回當前路徑(即包含Android.mk file文件的目錄)。
include $( CLEAR_VARS)
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變數(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。這是必要的,因為所有的編譯控制文件都在同一個GNU MAKE執行環境中,所有的變數都是全局的。
LOCAL_MODULE := helloworld
LOCAL_MODULE變數必須定義,以標識你在Android.mk文件中描述的每個模塊。名稱必須是唯一的,而且不包含任何空格。注意編譯系統會自動產生合適的前綴和後綴,換句話說,一個被命名為'foo'的共享庫模塊,將會生成'libfoo.so'文件。
LOCAL_SRC_FILES := helloworld.c
LOCAL_SRC_FILES變數必須包含將要編譯打包進模塊中的C或C++源代碼文件。注意,你不用在這里列出頭文件和包含文件,因為編譯系統將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。
在Android中增加本地程序或者庫,這些程序和庫與其所載路徑沒有任何關系,只和它們的Android.mk文件有關系。Android.mk和普通的Makefile有所不同,它具有統一的寫法,主要包含一些系統公共的宏。
在一個Android.mk中可以生成多個可執行程序、動態庫和靜態庫。
1,編譯應用程序的模板:
#Test Exe
LOCAL_PATH := $(call my-dir)
#include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_MODULE:= test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_EXECUTABLE)
(菜鳥級別解釋::=是賦值的意思,$是引用某變數的值)LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態庫(*.a)的名稱,LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動態庫(*.so)的名稱,LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個可執行程序的方式進行編譯。
2,編譯靜態庫的模板:
#Test Static Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
一般的和上面相似,BUILD_STATIC_LIBRARY表示編譯一個靜態庫。
3,編譯動態庫的模板:
#Test Shared Lib
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= /
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,BUILD_SHARED_LIBRARY表示編譯一個靜態庫。
以上三者的生成結果分別在如下,generic依具體target會變:
out/target/proct/generic/obj/EXECUTABLE
out/target/proct/generic/obj/STATIC_LIBRARY
out/target/proct/generic/obj/SHARED_LIBRARY
每個模塊的目標文件夾分別為:
可執行程序:XXX_intermediates
靜態庫: XXX_static_intermediates
動態庫: XXX_shared_intermediates
另外,在Android.mk文件中,還可以指定最後的目標安裝路徑,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定。不同的文件系統路徑用以下的宏進行選擇:
TARGET_ROOT_OUT:表示根文件系統。
TARGET_OUT:表示system文件系統。
TARGET_OUT_DATA:表示data文件系統。
用法如:
CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
G. android.mk是在什麼情況下生成的
當你需要使用JNI的時候,你需要創建一個native工程。Android.mk就是一個makefile配置文件,幫你把C/C++的代碼編譯成動態庫so的。
創建的方式有兩種:
在工程根目錄裏手動創建一個目錄叫jni,在裡面新建一個Android.mk,然後創建c,cpp文件,把他們配置到Android.mk里。
右鍵工程,選擇Android Tools->Add Native Support自動生成。
(7)mk文件與編譯擴展閱讀:
創建Android庫
Android 庫在結構上與 Android 應用模塊相同。可以提供構建應用所需的一切內容,包括源代碼、資源文件和 Android 清單。
不過,Android 庫將編譯到可以用作 Android 應用模塊依賴項的 Android 歸檔 (AAR:Android Archive Resource) 文件,而不是在設備上運行的 APK。
與 JAR 文件不同,AAR 文件可以包含 Android 資源和一個清單文件,這樣,除了 java 類與方法外,還可以捆綁布局和可繪制對象等共享資源。
庫模塊在以下情況下非常有用:
構建使用某些相同組件(例如 Activity、服務或 UI 布局)的多個應用。
構建存在多個 APK 變體(例如免費版本和付費版本)的應用並且需要在兩種版本中使用相同的核心組件。
H. Android.mk介紹(一)
在Linux下,可以通過Makefile來對源碼工程進行管理,Android.mk文件是Makefile的一小部分,它用來對Android程序進行編譯。Android.mk文件中描述了哪些C文件將被編譯且指明了如何編譯。Android.mk文件用來告知NDK Build 系統關於Source的信息。
1、編譯可執行程序
2、編譯動態庫或靜態庫
3、預編譯文件(APK或Java庫)
以上三種是Android.mk的主要用法,我們寫mk文件時也就是以上三種目的。
首先看一個最簡單的Android.mk的例子:
講解:
每個Android.mk文件必須以定義 LOCAL_PATH 為開始。它用於在開發tree中查找源文件。
宏 my-dir 由Build System提供。返回包含Android.mk的目錄路徑。
CLEAR_VARS 變數由Build System提供。並指向一個指定的GNU Makefile,由它負責清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理 LOCAL_PATH .
這個清理動作是必須的,因為所有的編譯控制文件由同一個GNU Make解析和執行,其變數是全局的。所以清理後才能避免相互影響。
LOCAL_MODULE 模塊必須定義,以表示Android.mk中的每一個模塊。名字必須唯一且不包含空格。
Build System會自動添加適當的前綴和後綴。例如,foo,要產生動態庫,則生成libfoo.so.
但請注意:如果模塊名被定為:libfoo.則生成libfoo.so. 不再加前綴。
LOCAL_SRC_FILES變數必須包含將要打包如模塊的C/C++ 源碼。
不必列出頭文件,build System 會自動幫我們找出依賴文件。
預設的C++源碼的擴展名為.cpp. 也可以修改,通過LOCAL_CPP_EXTENSION。
BUILD_SHARED_LIBRARY:是Build System提供的一個變數,指向一個GNU Makefile Script。
它負責收集自從上次調用include $(CLEAR_VARS) 後的所有LOCAL_XXX信息。並決定編譯為什麼。
BUILD_STATIC_LIBRARY:編譯為靜態庫。
BUILD_SHARED_LIBRARY :編譯為動態庫
BUILD_EXECUTABLE:編譯為Native C可執行程序
BUILD_PACKAGE(既可以編apk,也可以編資源包文件,但是需要指定LOCAL_EXPORT_PACKAGE_RESOURCES:=true)
BUILD_JAVA_LIBRARY(Java共享庫)
BUILD_STATIC_JAVA_LIBRARY(java靜態庫)
Android源碼中有大量的mk文件,Android系統的編譯就是靠著這些mk文件的,所以學好是非常有必要的哦!