Android原生開發包(NDK)是Android軟件開發包(SDK)的相關工具集,用於Android平臺上C++平臺上的開發。使得開發人員能夠使用機器代碼生成的編程語言(C、C++、彙編)實現一些對代碼性能要求較高的的模塊並將其嵌入到Android的應用程序中。
用原生組件(命令行)構建Android項目需要三步,第一步和第三步由ANT工具完成:
- 構建Java應用程序
- 構建原生組件
- 將Java應用程序與其原生組件打包
Apache ANT的概念
當一個代碼項目大了以後,每次重新編譯,打包,測試等都會變得非常繁複,因此C/C++有make腳本來幫助這些工作的批量完成。在Java 中應用是平臺無關性的,當然不會用平臺相關的make腳本來完成這些批處理任務了,ANT本身就是這樣一個流程腳本引擎,用於自動化調用程序完成項目的編譯,打包,測試等。除了基於JAVA是平臺無關的外,腳本的格式是基於XML的,比make腳本來說還要好維護一些。
Ant默認構建文件名爲build.xml,也可以取其他的名字。在運行的時候把這個命名當作參數傳給Ant。構建文件一般是放在項目頂層目錄中,也可以放在任何其他位置。
ant[ -f build_%s.xml]
build.xml配置參數
構建文件默認叫build.xml,其有很多配置參數。
project
每個構建文件都有一個project標籤,有以下屬性:
- default:表示默認的運行目標,這個屬性是必須的。
- basedir:表示項目的基準目錄。
- name:表示項目名。
- description:表示項目的描述。
property
類似於常量,可以供給build.xml中的其他標籤使用。有兩個特點:
- 大小寫敏感
- 不可改變,誰先設定,之後的都不能改變。
該標籤可以與多個屬性配合使用。
- name和value:
<property name="module_name" value="admin"/>
<echo message="begin nej-build ${module_name}..."/>
- name和refid:
其中的dao.compile.classpath在別的地方進行了定義。當然,也可以通過直接引用的方式:
<property name="srcpath" refid="dao.compile.classpath"/>
<property name="baseline.dir" value="${ob_baseline.dir}"/>
- name和location: 將srcdir的值設置爲當前文件路徑/src。
<property name="srcdir" location="src"/>
- file: 導入相對文件中的所有變量,這裏的build.properties專門用來存放各種變量。
<property file="./omad/build.properties"/>
- url: 通過url也能導入對應文件的屬性
<property url="http://www.mysite.com/bla/props/foo.properties"/>
- environment: 設置系統的環境變量前綴爲env
將系統的tomcat安裝目錄設置到tomcat.home屬性中:
target
一個project標籤下有一個或多個target標籤,代表一個或多個任務,任務間可以存在依賴關係。有如下屬性:
- name:用於標識,這個是必須的
- depends:用來指定所依賴的任務。
- if:當屬性設置時才執行該任務。
- unless:當屬性未設置時才執行。
- description:任務描述。
<target name="build.service" depends="compile.service,create.jar,zip.src,compile.so" />
echo
控制檯顯示
<echo message="Building version ${version}" />
delete
刪除文件或文件目錄,有如下屬性
- file:刪除文件
- dir:刪除目錄
- includeEmptyDirs:值得是否刪除空目錄,默認是true
- failonerror:報錯是否停止,默認是true
- verbose:是否列出刪除的文件,默認是false
mkdir
創建一個目錄
<mkdir dir="${lib.java.home}" />
copy
拷貝文件或文件目錄,屬性如下:
- file:表示源文件。
- tofile:表示目標文件。
- todir:表示目標目錄。
- overwrite:是否覆蓋目標文件,默認爲false。
- includeEmptyDirs:是否拷貝空目錄,默認爲true。
- failonerror:如目標沒有發現是否自動停止,默認值true。
- verbose:是否顯示詳細信息,默認值false。
<copy todir="${dist.home}/armeabi-v7a" file="${so.file1}" />
fileset
文件集標籤,通常與任務結合來使用,如通過將fileset定義的文件路徑下的文件,定義爲classpath
<path id="root.classpath">
<fileset dir="${lib.java.home}">
<include name="*.jar" />
</fileset>
<fileset dir="${dist.home}">
<include name="**/*.jar" />
</fileset>
</path>
javac
javac任務用來編譯一個或一組java文件
- debug:是否產生調試信息默認爲off
- target:根據指定的vm版本生成class文件
- source:指定版本號使編譯出的(文件)類兼容該版本
- src path:編譯的源目錄,可以通過這樣編譯在不同文件夾裏的文件
- classpath:目的在於告訴Java執行環境,在哪些目錄下可以找到您所要執行的Java程序(.class文件)
- optimize:是否使用優化
- excludes:表示被排除的文件的模式
- destdir:表示class文件的輸出目錄
<javac destdir="${java.classes.home}" debug="true" deprecation="false" optimize="true" includeantruntime="false" target="1.5" source="1.5">
<src path="${java.src.home}" />
<classpath refid="root.classpath" />
</javac>
jar
用來生成一個JAR包文件
- destfile:JAR文件名
- basedir:被歸檔的文件名
- includes:被歸檔的文件模式
- exchudes:被排除的文件模式
<target name="create.jar">
<jar destfile="${dist.home}/${service.name}.jar" basedir="${java.classes.home}" excludes="**/com/telenav/proto/common/**,**/com/telenav/proto/services/**"/>
</target>
condition
用來判斷,如果包含的內容符合條件,則將property指定的屬性設置爲true,否則爲false。
如,os family值爲"windows"則"dist.repository.dir"的值爲"C:"
<condition property="dist.repository.dir" value="C:">
<os family="windows" />
</condition>
- and:邏輯與,需要都滿足條件纔行,如上例所述。
- not:邏輯非,反過來的結果。
- or,xor:邏輯或和邏輯異或。
- isset:指定屬性是否存在。
- equils:指定屬性是否相等。
- filesmatch:指定文件是否相等。
exec
用來調用系統命令,如執行ndk-buld,其命令行變量爲APP_BUILD_SCRIPT=Android_android-ndk-r15c.mk:
- arg value:命令行變量
<exec executable="/opt/android-ndk-r15c/ndk-build" dir="${basedir}/main/jni" >
<arg value="V=1" />
<arg value="APP_BUILD_SCRIPT=Android_android-ndk-r15c.mk" />
<arg value="NDK_APPLICATION_MK=Application_android-ndk-r15c.mk" />
</exec>
available
是ANT的內置任務。如果在運行期間一個資源可用,就會設置一個屬性,資源可能是文件、目錄、classpath中的class或者JVM系統資源。如果資源存在,屬性值默認設爲true,否則不會設置屬性。也可以通過設置value屬性將這個值設置爲其他值。通常使用這個任務有助於避免target的執行依賴於系統參數。
- property:要設置的屬性名稱,是必需的。
- value:要設置的屬性值,默認爲true。
- classname:要在classpath中查找的類。
- file:要查找的文件。
- resource:要在JVM中查找的資源。
- classpath:在查找類或資源時使用的類路徑。
file、resource和classpath三者必須設置一個。
<available file="${so.file3}" property="so.present"/>