Android 開發手記二 C可執行程序編譯實例

繼續 NDK 的開發。上次我們的實例中,對 C 應用程序的編譯鏈接,自己編寫的 makefile 是件比較困難的事情。雖然最後成功了,不過中間經歷了不少坎坷。我們現在研究下如何用 NDK 提供的 build 工具,實現我們的目標。

 

        還是以 Hello Android 工程爲例。

 

        建立好工程 hello-a ,在 jni 目錄下創建文件 hello-a.c, 文件內容如下。

#include <stdio.h>

 

int main()

{

       printf("Hello Android!/n");

       return 0;

}

       在該目錄下,創建 Android.mk 文件,內容如下:

LOCAL_PATH := $(call my-dir)

 

include $(CLEAR_VARS)

 

LOCAL_MODULE    := helloa

LOCAL_SRC_FILES := hello-a.c

 

include $(BUILD_EXECUTABLE)

       這裏需要注意的上面紅色部分,指定我們現在要生成一個可執行的文件。

       在工程下運行 ndk-build ,結果提示錯誤:

       這個提示告訴我們,在工程中沒有找到 AndroidManifest.xml 文件。若創建了 Java 應用程序,會自動生成該文件。在該文件中, 描述了程序包的一個全局變量 , 包括暴露的應用組件 (activities, services 等等 ) 和爲每個組件的實現類 , 什麼樣的數據可以操作 , 以及在什麼地方運行。而這裏,我們根本不需要這個文件。那麼爲什麼會有這樣的錯誤提示呢?

       其實這個和 NDK 的版本有關係。現在最新的版本,就是我用的版本 NDK r4 版,與之前的版本,一個很大的改變,就是對工程源文件路徑及組織結構的變化。在 NDK r3 版,按裝 NDK 後,需要運行 setup.sh 來創建編譯環境,需要在<NDK>APPS/ 目錄下,創建同名的工程,然後添加 Application.mk, 然後編譯的時候,執行 make APP=yourproject 。 新的版本不需要再去創建這個同名的 app 工程,直接用編譯工具 ndk-build 就可以了。這個工具實際上是對 build 編譯工具的一層封裝,每次編譯都會自動去設置一次編譯環境,然後調用工程中的 Android.mk 來進行工程的編譯,原來的那個Application.mk 也不是必須的了,只有在需要的時候,纔去創建。不過相比前一版本,就是增加了對 AndroidManifest.xml文件的檢查。

       我們如何解決這個問題呢?有兩個辦法:一是手動創建一個 AndroidManifest.xml 文件,然後裏面內容爲空項就行,如

<?xml version="1.0" encoding="utf-8"?>

<manifest/>

       我們再次運行 ndk-build ,成功。

       我們試試可否正常運行:

       看到了 Hello Android! 成功了。

       這種方法雖然解決了問題,但是並沒有理解問題的實質。好,保持求知的強勁勢頭和慾望,這就有了第二種解決辦法。

       我們先來看看開發者對這個問題的描述:

“The manifest is only required to find the top-level of your project path (ndk-build can be invoked in any sub-directory of your project).”

       那麼,我們只要在編譯前指定工程路徑就行了,如何做呢?簡單!

       ndk-build NDK_PROJECT_PATH=/path/to/project

       好,我們試試看

 

       成功了,看看在模擬器上的運行效果:

 

發佈了4 篇原創文章 · 獲贊 15 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章