NDK編譯native程序(一)構建Java應用程序

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"/>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章