1. 程式人生 > >Android-------C語言可執行程式編譯例項

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

       好,我們試試看

 

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